git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3482 0c269be4-1314-0410-8aa9-9f06e86f4224tags/v1.9.3
| @@ -18,12 +18,17 @@ Fernando Lopez-Lezcano | |||||
| Romain Moret | Romain Moret | ||||
| Florian Faber | Florian Faber | ||||
| Michael Voigt | Michael Voigt | ||||
| Torben Hohn | |||||
| Torben Hohn | |||||
| Paul Davis | |||||
| --------------------------- | --------------------------- | ||||
| Jackdmp changes log | Jackdmp changes log | ||||
| --------------------------- | --------------------------- | ||||
| 2009-04-03 Stephane Letz <letz@grame.fr> | |||||
| * Simplify JackClient RT code, jack_thread_wait API marked deprecated." | |||||
| 2009-03-29 Stephane Letz <letz@grame.fr> | 2009-03-29 Stephane Letz <letz@grame.fr> | ||||
| * Cleanup JackInternalClient code. | * Cleanup JackInternalClient code. | ||||
| @@ -842,7 +842,8 @@ EXPORT jack_nframes_t jack_thread_wait(jack_client_t* ext_client, int status) | |||||
| jack_error("jack_thread_wait called with a NULL client"); | jack_error("jack_thread_wait called with a NULL client"); | ||||
| return 0; | return 0; | ||||
| } else { | } else { | ||||
| return client->Wait(status); | |||||
| jack_error("jack_thread_wait: deprecated, use jack_cycle_wait/jack_cycle_signal"); | |||||
| return -1; | |||||
| } | } | ||||
| } | } | ||||
| @@ -355,6 +355,7 @@ int JackClient::StartThread() | |||||
| /*! | /*! | ||||
| \brief RT thread. | \brief RT thread. | ||||
| */ | */ | ||||
| bool JackClient::Execute() | bool JackClient::Execute() | ||||
| { | { | ||||
| if (!jack_tls_set(JackGlobals::fRealTime, this)) | if (!jack_tls_set(JackGlobals::fRealTime, this)) | ||||
| @@ -362,73 +363,59 @@ bool JackClient::Execute() | |||||
| if (GetEngineControl()->fRealTime) | if (GetEngineControl()->fRealTime) | ||||
| set_threaded_log_function(); | set_threaded_log_function(); | ||||
| // Execute a dummy cycle to be sure thread has the correct properties | |||||
| DummyCycle(); | |||||
| if (fThreadFun) { | if (fThreadFun) { | ||||
| // Execute a dummy cycle to be sure thread has the correct properties (ensure thread creation is finished) | |||||
| WaitSync(); | |||||
| SignalSync(); | |||||
| fThreadFun(fThreadFunArg); | fThreadFun(fThreadFunArg); | ||||
| } else { | } else { | ||||
| if (WaitFirstSync()) | |||||
| ExecuteThread(); | |||||
| ExecuteThread(); | |||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| inline bool JackClient::WaitFirstSync() | |||||
| void JackClient::DummyCycle() | |||||
| { | { | ||||
| while (true) { | |||||
| // Start first cycle | |||||
| WaitSync(); | |||||
| if (IsActive()) { | |||||
| CallSyncCallback(); | |||||
| // Finish first cycle | |||||
| if (Wait(CallProcessCallback()) != GetEngineControl()->fBufferSize) | |||||
| return false; | |||||
| return true; | |||||
| } else { | |||||
| jack_log("Process called for an inactive client"); | |||||
| } | |||||
| SignalSync(); | |||||
| } | |||||
| return false; | |||||
| WaitSync(); | |||||
| SignalSync(); | |||||
| } | } | ||||
| inline void JackClient::ExecuteThread() | inline void JackClient::ExecuteThread() | ||||
| { | { | ||||
| while (Wait(CallProcessCallback()) == GetEngineControl()->fBufferSize); | |||||
| while (true) { | |||||
| CycleWaitAux(); | |||||
| CycleSignalAux(CallProcessCallback()); | |||||
| } | |||||
| } | } | ||||
| jack_nframes_t JackClient::Wait(int status) | |||||
| { | |||||
| if (status == 0) | |||||
| CallTimebaseCallback(); | |||||
| SignalSync(); | |||||
| if (status != 0) | |||||
| End(); // Terminates the thread | |||||
| if (!WaitSync()) | |||||
| Error(); // Terminates the thread | |||||
| CallSyncCallback(); | |||||
| return GetEngineControl()->fBufferSize; | |||||
| } | |||||
| jack_nframes_t JackClient::CycleWait() | |||||
| inline jack_nframes_t JackClient::CycleWaitAux() | |||||
| { | { | ||||
| if (!WaitSync()) | if (!WaitSync()) | ||||
| Error(); // Terminates the thread | Error(); // Terminates the thread | ||||
| CallSyncCallback(); | |||||
| CallSyncCallbackAux(); | |||||
| return GetEngineControl()->fBufferSize; | return GetEngineControl()->fBufferSize; | ||||
| } | } | ||||
| void JackClient::CycleSignal(int status) | |||||
| inline void JackClient::CycleSignalAux(int status) | |||||
| { | { | ||||
| if (status == 0) | if (status == 0) | ||||
| CallTimebaseCallback(); | |||||
| CallTimebaseCallbackAux(); | |||||
| SignalSync(); | SignalSync(); | ||||
| if (status != 0) | if (status != 0) | ||||
| End(); // Terminates the thread | End(); // Terminates the thread | ||||
| } | } | ||||
| jack_nframes_t JackClient::CycleWait() | |||||
| { | |||||
| return CycleWaitAux(); | |||||
| } | |||||
| void JackClient::CycleSignal(int status) | |||||
| { | |||||
| CycleSignalAux(status); | |||||
| } | |||||
| inline int JackClient::CallProcessCallback() | inline int JackClient::CallProcessCallback() | ||||
| { | { | ||||
| return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0; | return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0; | ||||
| @@ -696,7 +683,13 @@ void JackClient::TransportStop() | |||||
| // Never called concurently with the server | // Never called concurently with the server | ||||
| // TODO check concurrency with SetSyncCallback | // TODO check concurrency with SetSyncCallback | ||||
| void JackClient::CallSyncCallback() | void JackClient::CallSyncCallback() | ||||
| { | |||||
| CallSyncCallbackAux(); | |||||
| } | |||||
| inline void JackClient::CallSyncCallbackAux() | |||||
| { | { | ||||
| if (GetClientControl()->fTransportSync) { | if (GetClientControl()->fTransportSync) { | ||||
| @@ -717,6 +710,11 @@ void JackClient::CallSyncCallback() | |||||
| } | } | ||||
| void JackClient::CallTimebaseCallback() | void JackClient::CallTimebaseCallback() | ||||
| { | |||||
| CallTimebaseCallbackAux(); | |||||
| } | |||||
| inline void JackClient::CallTimebaseCallbackAux() | |||||
| { | { | ||||
| JackTransportEngine& transport = GetEngineControl()->fTransport; | JackTransportEngine& transport = GetEngineControl()->fTransport; | ||||
| int master; | int master; | ||||
| @@ -97,14 +97,18 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||||
| virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value1, int value); | virtual int ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value1, int value); | ||||
| inline bool WaitFirstSync(); | |||||
| inline void DummyCycle(); | |||||
| inline void ExecuteThread(); | inline void ExecuteThread(); | ||||
| inline bool WaitSync(); | inline bool WaitSync(); | ||||
| inline void SignalSync(); | inline void SignalSync(); | ||||
| inline int CallProcessCallback(); | inline int CallProcessCallback(); | ||||
| inline void End(); | inline void End(); | ||||
| inline void Error(); | inline void Error(); | ||||
| inline jack_nframes_t CycleWaitAux(); | |||||
| inline void CycleSignalAux(int status); | |||||
| inline void CallSyncCallbackAux(); | |||||
| inline void CallTimebaseCallbackAux(); | |||||
| public: | public: | ||||
| JackClient(); | JackClient(); | ||||
| @@ -172,10 +176,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||||
| virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | virtual int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | ||||
| virtual void InternalClientUnload(int ref, jack_status_t* status); | virtual void InternalClientUnload(int ref, jack_status_t* status); | ||||
| // Fons Adriaensen thread model | |||||
| virtual jack_nframes_t Wait(int status); | |||||
| virtual jack_nframes_t CycleWait(); | |||||
| jack_nframes_t CycleWait(); | |||||
| void CycleSignal(int status); | void CycleSignal(int status); | ||||
| int SetProcessThread(JackThreadCallback fun, void *arg); | int SetProcessThread(JackThreadCallback fun, void *arg); | ||||
| @@ -521,11 +521,5 @@ void JackDebugClient::InternalClientUnload(int ref, jack_status_t* status) | |||||
| fClient->InternalClientUnload(ref, status); | fClient->InternalClientUnload(ref, status); | ||||
| } | } | ||||
| jack_nframes_t JackDebugClient::Wait(int status) | |||||
| { | |||||
| CheckClient(); | |||||
| return fClient->Wait(status); | |||||
| } | |||||
| } // end of namespace | } // end of namespace | ||||
| @@ -127,9 +127,6 @@ class JackDebugClient : public JackClient | |||||
| int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | int InternalClientLoad(const char* client_name, jack_options_t options, jack_status_t* status, jack_varargs_t* va); | ||||
| void InternalClientUnload(int ref, jack_status_t* status); | void InternalClientUnload(int ref, jack_status_t* status); | ||||
| // Fons Adriaensen thread model | |||||
| jack_nframes_t Wait(int status); | |||||
| JackClientControl* GetClientControl() const; | JackClientControl* GetClientControl() const; | ||||
| void CheckClient() const; | void CheckClient() const; | ||||
| @@ -95,7 +95,7 @@ main (int argc, char *argv[]) | |||||
| int c; | int c; | ||||
| extern int optind, opterr; | extern int optind, opterr; | ||||
| int show_usage = 0; | int show_usage = 0; | ||||
| char *optstring = "d:f"; | |||||
| char *optstring = "d:f:h"; | |||||
| struct option long_options[] = { | struct option long_options[] = { | ||||
| { "help", 1, 0, 'h' }, | { "help", 1, 0, 'h' }, | ||||
| { "duration", 1, 0, 'd' }, | { "duration", 1, 0, 'd' }, | ||||