Commit 4be0936d authored by sletz's avatar sletz
Browse files

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
parent a1bcae9c
......@@ -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.
......
......@@ -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;
}
}
......
......@@ -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;
......
......@@ -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);
......
......@@ -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
......@@ -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;
......
......@@ -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' },
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment