diff --git a/ChangeLog b/ChangeLog index d3509423..9cebbb23 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,12 +18,17 @@ Fernando Lopez-Lezcano Romain Moret Florian Faber Michael Voigt -Torben Hohn +Torben Hohn +Paul Davis --------------------------- Jackdmp changes log --------------------------- +2009-04-03 Stephane Letz + + * Simplify JackClient RT code, jack_thread_wait API marked deprecated." + 2009-03-29 Stephane Letz * Cleanup JackInternalClient code. diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index fa7b4f22..519cb4c5 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -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"); return 0; } else { - return client->Wait(status); + jack_error("jack_thread_wait: deprecated, use jack_cycle_wait/jack_cycle_signal"); + return -1; } } diff --git a/common/JackClient.cpp b/common/JackClient.cpp index 3599547e..310b3c78 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -355,6 +355,7 @@ int JackClient::StartThread() /*! \brief RT thread. */ + bool JackClient::Execute() { if (!jack_tls_set(JackGlobals::fRealTime, this)) @@ -362,73 +363,59 @@ bool JackClient::Execute() if (GetEngineControl()->fRealTime) set_threaded_log_function(); - + + // Execute a dummy cycle to be sure thread has the correct properties + DummyCycle(); + if (fThreadFun) { - // Execute a dummy cycle to be sure thread has the correct properties (ensure thread creation is finished) - WaitSync(); - SignalSync(); fThreadFun(fThreadFunArg); } else { - if (WaitFirstSync()) - ExecuteThread(); + ExecuteThread(); } 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() { - 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()) Error(); // Terminates the thread - CallSyncCallback(); + CallSyncCallbackAux(); return GetEngineControl()->fBufferSize; } -void JackClient::CycleSignal(int status) +inline void JackClient::CycleSignalAux(int status) { if (status == 0) - CallTimebaseCallback(); + CallTimebaseCallbackAux(); SignalSync(); if (status != 0) End(); // Terminates the thread } +jack_nframes_t JackClient::CycleWait() +{ + return CycleWaitAux(); +} + +void JackClient::CycleSignal(int status) +{ + CycleSignalAux(status); +} + inline int JackClient::CallProcessCallback() { return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0; @@ -696,7 +683,13 @@ void JackClient::TransportStop() // Never called concurently with the server // TODO check concurrency with SetSyncCallback + void JackClient::CallSyncCallback() +{ + CallSyncCallbackAux(); +} + +inline void JackClient::CallSyncCallbackAux() { if (GetClientControl()->fTransportSync) { @@ -717,6 +710,11 @@ void JackClient::CallSyncCallback() } void JackClient::CallTimebaseCallback() +{ + CallTimebaseCallbackAux(); +} + +inline void JackClient::CallTimebaseCallbackAux() { JackTransportEngine& transport = GetEngineControl()->fTransport; int master; diff --git a/common/JackClient.h b/common/JackClient.h index aad0d79d..f41d734f 100644 --- a/common/JackClient.h +++ b/common/JackClient.h @@ -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); - inline bool WaitFirstSync(); + inline void DummyCycle(); inline void ExecuteThread(); inline bool WaitSync(); inline void SignalSync(); inline int CallProcessCallback(); inline void End(); inline void Error(); - + inline jack_nframes_t CycleWaitAux(); + inline void CycleSignalAux(int status); + inline void CallSyncCallbackAux(); + inline void CallTimebaseCallbackAux(); + public: 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 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); int SetProcessThread(JackThreadCallback fun, void *arg); diff --git a/common/JackDebugClient.cpp b/common/JackDebugClient.cpp index 3ff29b7d..74566c5e 100644 --- a/common/JackDebugClient.cpp +++ b/common/JackDebugClient.cpp @@ -521,11 +521,5 @@ void JackDebugClient::InternalClientUnload(int ref, jack_status_t* status) fClient->InternalClientUnload(ref, status); } -jack_nframes_t JackDebugClient::Wait(int status) -{ - CheckClient(); - return fClient->Wait(status); -} - } // end of namespace diff --git a/common/JackDebugClient.h b/common/JackDebugClient.h index d8625998..430c9610 100644 --- a/common/JackDebugClient.h +++ b/common/JackDebugClient.h @@ -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); void InternalClientUnload(int ref, jack_status_t* status); - // Fons Adriaensen thread model - jack_nframes_t Wait(int status); - JackClientControl* GetClientControl() const; void CheckClient() const; diff --git a/example-clients/impulse_grabber.c b/example-clients/impulse_grabber.c index cb36da85..0a1fd706 100644 --- a/example-clients/impulse_grabber.c +++ b/example-clients/impulse_grabber.c @@ -95,7 +95,7 @@ main (int argc, char *argv[]) int c; extern int optind, opterr; int show_usage = 0; - char *optstring = "d:f"; + char *optstring = "d:f:h"; struct option long_options[] = { { "help", 1, 0, 'h' }, { "duration", 1, 0, 'd' },