mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 08:09:32 +02:00
Make Nyquist support (AUD-DO)
Nyquist AUD-DO calls out to a new function that executes script commands, and returns results in a lisp string.
This commit is contained in:
parent
b975956812
commit
1bc0f0f4d0
1
lib-src/libnyquist/nyquist/nyqsrc/audacityfnintdefs.h
Normal file
1
lib-src/libnyquist/nyquist/nyqsrc/audacityfnintdefs.h
Normal file
@ -0,0 +1 @@
|
||||
extern LVAL xlc_aud_do(void);
|
1
lib-src/libnyquist/nyquist/nyqsrc/audacityfnintptrs.h
Normal file
1
lib-src/libnyquist/nyquist/nyqsrc/audacityfnintptrs.h
Normal file
@ -0,0 +1 @@
|
||||
{ "AUD-DO", S, xlc_aud_do},
|
@ -3,6 +3,7 @@
|
||||
/* CHANGE LOG
|
||||
* --------------------------------------------------------------------
|
||||
* 28Apr03 dm changes for portability and fix compiler warnings
|
||||
* 12Feb18 jkc added aud-do function, that is only available in Audacity.
|
||||
*/
|
||||
|
||||
#include "xlisp.h"
|
||||
@ -53,3 +54,50 @@ void print_local_gc_info(void)
|
||||
max_sample_block_len) / 1024);
|
||||
stdputstr(buf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------Audacity Automation -------------------------*/
|
||||
/* These functions may later move to their own source file. */
|
||||
extern void * ExecForLisp( char * pIn );
|
||||
extern void * nyq_make_opaque_string( int size, unsigned char *src );
|
||||
|
||||
|
||||
void * nyq_make_opaque_string( int size, unsigned char *src ){
|
||||
LVAL dst;
|
||||
unsigned char * dstp;
|
||||
dst = new_string((int)(size+2));
|
||||
dstp = getstring(dst);
|
||||
|
||||
/* copy the source to the destination */
|
||||
while (size-- > 0)
|
||||
*dstp++ = *src++;
|
||||
*dstp = '\0';
|
||||
|
||||
return (void*)dst;
|
||||
}
|
||||
|
||||
/* xlc_aud_do -- interface to C routine aud_do */
|
||||
/**/
|
||||
LVAL xlc_aud_do(void)
|
||||
{
|
||||
// Based on string-trim...
|
||||
unsigned char *leftp,*rightp;
|
||||
LVAL src,dst;
|
||||
|
||||
/* get the string */
|
||||
src = xlgastring();
|
||||
xllastarg();
|
||||
|
||||
/* setup the string pointers */
|
||||
leftp = getstring(src);
|
||||
rightp = leftp + getslength(src) - 2;
|
||||
|
||||
// Go call my real function here...
|
||||
dst = (LVAL)ExecForLisp( leftp );
|
||||
|
||||
/* return the new string */
|
||||
return (dst);
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* include actual local file headers: */
|
||||
#include "sndfnintdefs.h"
|
||||
#include "seqfnintdefs.h"
|
||||
#include "audacityfnintdefs.h"
|
||||
|
@ -2,8 +2,11 @@
|
||||
*
|
||||
* CHANGE LOG
|
||||
* 28-Apr-03 rbd Removed "include switches.h" -- already included
|
||||
* 12-Feb-18 jkc Added "include audacityfnintptrs.h" -- for internal Audacity commands
|
||||
*/
|
||||
|
||||
/* extension to xlisp */
|
||||
#include "sndfnintptrs.h"
|
||||
#include "seqfnintptrs.h"
|
||||
#include "audacityfnintptrs.h"
|
||||
|
||||
|
@ -97,6 +97,72 @@ int ExecCommand(wxString *pIn, wxString *pOut)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// This is the function which actually obeys one command. Rather than applying
|
||||
/// the command directly, an event containing a reference to the command is sent
|
||||
/// to the main (GUI) thread. This is because having more than one thread access
|
||||
/// the GUI at a time causes problems with wxwidgets.
|
||||
int ExecCommand2(wxString *pIn, wxString *pOut)
|
||||
{
|
||||
{
|
||||
CommandBuilder builder(*pIn);
|
||||
if (builder.WasValid())
|
||||
{
|
||||
AudacityProject *project = GetActiveProject();
|
||||
OldStyleCommandPointer cmd = builder.GetCommand();
|
||||
AppCommandEvent ev;
|
||||
ev.SetCommand(cmd);
|
||||
AudacityApp & App = wxGetApp();
|
||||
App.OnReceiveCommand(ev);
|
||||
|
||||
*pOut = wxEmptyString;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pOut = wxT("Syntax error!\n");
|
||||
*pOut += builder.GetErrorMessage() + wxT("\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Wait until all responses from the command have been received.
|
||||
// The last response is signalled by an empty line.
|
||||
wxString msg = ScriptCommandRelay::ReceiveResponse().GetMessage();
|
||||
while (msg != wxT("\n"))
|
||||
{
|
||||
//wxLogDebug( "Msg: %s", msg );
|
||||
*pOut += msg + wxT("\n");
|
||||
msg = ScriptCommandRelay::ReceiveResponse().GetMessage();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
// The void * return is actually a Lisp LVAL and will be cast to such as needed.
|
||||
extern void * ExecForLisp( char * pIn );
|
||||
extern void * nyq_make_opaque_string( int size, unsigned char *src );
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
void * ExecForLisp( char * pIn ){
|
||||
wxString Str1( pIn );
|
||||
wxString Str2;
|
||||
ExecCommand2( &Str1, &Str2 );
|
||||
|
||||
// wxString provides a const char *
|
||||
const char * pStr = static_cast<const char*>(Str2);
|
||||
|
||||
// We'll be passing it as a non-const unsigned char *
|
||||
// That 'unsafe' cast is actually safe. nyq_make_opaque_string is just copying the string.
|
||||
void * pResult = nyq_make_opaque_string( Str2.Length(), (unsigned char *)pStr );
|
||||
return pResult;
|
||||
};
|
||||
|
||||
|
||||
/// Adds a response to the queue to be sent back to the script
|
||||
void ScriptCommandRelay::SendResponse(const wxString &response)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user