mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-10-31 22:23:54 +01: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:
		
							
								
								
									
										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) | ||||
| { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user