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