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' }, | ||||