Simplify JackClient RT code, jack_thread_wait API marked deprecated.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3482 0c269be4-1314-0410-8aa9-9f06e86f4224
This commit is contained in:
sletz 2009-04-03 07:13:25 +00:00
parent a1bcae9cc7
commit 4be0936d3e
7 changed files with 54 additions and 58 deletions

View File

@ -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 <letz@grame.fr>
* Simplify JackClient RT code, jack_thread_wait API marked deprecated."
2009-03-29 Stephane Letz <letz@grame.fr>
* Cleanup JackInternalClient code.

View File

@ -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;
}
}

View File

@ -355,6 +355,7 @@ int JackClient::StartThread()
/*!
\brief RT thread.
*/
bool JackClient::Execute()
{
if (!jack_tls_set(JackGlobals::fRealTime, this))
@ -362,71 +363,57 @@ 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)
inline jack_nframes_t JackClient::CycleWaitAux()
{
if (!WaitSync())
Error(); // Terminates the thread
CallSyncCallbackAux();
return GetEngineControl()->fBufferSize;
}
inline void JackClient::CycleSignalAux(int status)
{
if (status == 0)
CallTimebaseCallback();
CallTimebaseCallbackAux();
SignalSync();
if (status != 0)
End(); // Terminates the thread
if (!WaitSync())
Error(); // Terminates the thread
CallSyncCallback();
return GetEngineControl()->fBufferSize;
if (status != 0)
End(); // Terminates the thread
}
jack_nframes_t JackClient::CycleWait()
{
if (!WaitSync())
Error(); // Terminates the thread
CallSyncCallback();
return GetEngineControl()->fBufferSize;
return CycleWaitAux();
}
void JackClient::CycleSignal(int status)
{
if (status == 0)
CallTimebaseCallback();
SignalSync();
if (status != 0)
End(); // Terminates the thread
CycleSignalAux(status);
}
inline int JackClient::CallProcessCallback()
@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

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