git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1865 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.71
@@ -65,6 +65,11 @@ extern "C" | |||||
JackProcessCallback process_callback, | JackProcessCallback process_callback, | ||||
void *arg); | void *arg); | ||||
EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status); | EXPORT jack_nframes_t jack_thread_wait(jack_client_t *client, int status); | ||||
// new | |||||
EXPORT jack_nframes_t jack_cycle_wait (jack_client_t*); | |||||
EXPORT void jack_cycle_signal (jack_client_t*, int status); | |||||
EXPORT int jack_set_thread_init_callback (jack_client_t *client, | EXPORT int jack_set_thread_init_callback (jack_client_t *client, | ||||
JackThreadInitCallback thread_init_callback, | JackThreadInitCallback thread_init_callback, | ||||
void *arg); | void *arg); | ||||
@@ -674,6 +679,33 @@ EXPORT jack_nframes_t jack_thread_wait(jack_client_t* ext_client, int status) | |||||
} | } | ||||
} | } | ||||
EXPORT jack_nframes_t jack_cycle_wait(jack_client_t* ext_client) | |||||
{ | |||||
#ifdef __CLIENTDEBUG__ | |||||
JackLibGlobals::CheckContext(); | |||||
#endif | |||||
JackClient* client = (JackClient*)ext_client; | |||||
if (client == NULL) { | |||||
jack_error("jack_cycle_wait called with a NULL client"); | |||||
return 0; | |||||
} else { | |||||
return client->CycleWait(); | |||||
} | |||||
} | |||||
EXPORT void jack_cycle_signal(jack_client_t* ext_client, int status) | |||||
{ | |||||
#ifdef __CLIENTDEBUG__ | |||||
JackLibGlobals::CheckContext(); | |||||
#endif | |||||
JackClient* client = (JackClient*)ext_client; | |||||
if (client == NULL) { | |||||
jack_error("jack_cycle_signal called with a NULL client"); | |||||
} else { | |||||
client->CycleSignal(status); | |||||
} | |||||
} | |||||
EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg) | EXPORT int jack_set_freewheel_callback(jack_client_t* ext_client, JackFreewheelCallback freewheel_callback, void* arg) | ||||
{ | { | ||||
#ifdef __CLIENTDEBUG__ | #ifdef __CLIENTDEBUG__ | ||||
@@ -66,6 +66,7 @@ JackClient::JackClient(JackSynchro** table) | |||||
fPortConnectArg = NULL; | fPortConnectArg = NULL; | ||||
fSyncArg = NULL; | fSyncArg = NULL; | ||||
fConditionnal = 0; // Temporary?? | fConditionnal = 0; // Temporary?? | ||||
fWait = false; | |||||
} | } | ||||
JackClient::~JackClient() | JackClient::~JackClient() | ||||
@@ -248,8 +249,10 @@ int JackClient::Activate() | |||||
#endif | #endif | ||||
*/ | */ | ||||
if (StartThread() < 0) | |||||
return -1; | |||||
if (fProcess || !fWait) { // Start thread only of process cb has been setup | |||||
if (StartThread() < 0) | |||||
return -1; | |||||
} | |||||
int result = -1; | int result = -1; | ||||
fChannel->ClientActivate(GetClientControl()->fRefNum, &result); | fChannel->ClientActivate(GetClientControl()->fRefNum, &result); | ||||
@@ -290,7 +293,9 @@ int JackClient::Deactivate() | |||||
fThread->Kill(); | fThread->Kill(); | ||||
#endif | #endif | ||||
*/ | */ | ||||
fThread->Kill(); | |||||
//if (fProcess || fWait) { // Kill thread only of process cb has been setup | |||||
fThread->Kill(); | |||||
//} | |||||
return result; | return result; | ||||
} | } | ||||
@@ -371,6 +376,7 @@ inline void JackClient::ExecuteThread() | |||||
} | } | ||||
} | } | ||||
/* | |||||
jack_nframes_t JackClient::Wait(int status) | jack_nframes_t JackClient::Wait(int status) | ||||
{ | { | ||||
if (status == 0) | if (status == 0) | ||||
@@ -383,6 +389,32 @@ jack_nframes_t JackClient::Wait(int status) | |||||
CallSyncCallback(); | CallSyncCallback(); | ||||
return GetEngineControl()->fBufferSize; | return GetEngineControl()->fBufferSize; | ||||
} | } | ||||
*/ | |||||
jack_nframes_t JackClient::CycleWait() | |||||
{ | |||||
fWait = true; | |||||
if (!WaitSync()) | |||||
return Error(); | |||||
CallSyncCallback(); | |||||
return GetEngineControl()->fBufferSize; | |||||
} | |||||
void JackClient::CycleSignal(int status) | |||||
{ | |||||
if (status == 0) | |||||
CallTimebaseCallback(); | |||||
SignalSync(); | |||||
if (status != 0) | |||||
End(); | |||||
} | |||||
jack_nframes_t JackClient::Wait(int status) | |||||
{ | |||||
CycleSignal(status); | |||||
return CycleWait(); | |||||
} | |||||
inline int JackClient::CallProcessCallback() | inline int JackClient::CallProcessCallback() | ||||
{ | { | ||||
@@ -172,6 +172,10 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||||
// Fons Adriaensen thread model | // Fons Adriaensen thread model | ||||
virtual jack_nframes_t Wait(int status); | virtual jack_nframes_t Wait(int status); | ||||
virtual jack_nframes_t CycleWait(); | |||||
void CycleSignal(int status); | |||||
bool fWait; | |||||
// JackRunnableInterface interface | // JackRunnableInterface interface | ||||
bool Init(); | bool Init(); | ||||
@@ -39,7 +39,7 @@ class JackEngine; | |||||
/*! | /*! | ||||
\brief Factory description | \brief Factory description | ||||
\totdo possibly use in a dynamic way to test different communication/synchro implementations. | |||||
\todo possibly use in a dynamic way to test different communication/synchro implementations. | |||||
*/ | */ | ||||
class JackFactoryImpl | class JackFactoryImpl | ||||
@@ -37,6 +37,8 @@ typedef ULONGLONG UInt64; | |||||
typedef unsigned long long UInt64; | typedef unsigned long long UInt64; | ||||
#endif | #endif | ||||
#include <stdint.h> | |||||
typedef uint16_t jack_int_t; // Internal type for ports and refnum | typedef uint16_t jack_int_t; // Internal type for ports and refnum | ||||
namespace Jack | namespace Jack | ||||
@@ -198,6 +198,11 @@ extern "C" | |||||
*/ | */ | ||||
jack_nframes_t jack_thread_wait (jack_client_t*, int status); | jack_nframes_t jack_thread_wait (jack_client_t*, int status); | ||||
jack_nframes_t jack_cycle_wait (jack_client_t*); | |||||
void jack_cycle_signal (jack_client_t*, int status); | |||||
/** | /** | ||||
* Tell JACK to call @a thread_init_callback once just after | * Tell JACK to call @a thread_init_callback once just after | ||||
* the creation of the thread in which all other callbacks | * the creation of the thread in which all other callbacks | ||||