diff --git a/ChangeLog b/ChangeLog index 0269bfcf..c51b59a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ Jackdmp changes log --------------------------- +2007-05-05 Stephane Letz + + * Add jack_set_client_registration_callback API. + 2007-05-04 Stephane Letz * Steven Chamberlain patch to fix jack_port_type. Test for jack_port_type behaviour in jack_test.cpp tool. diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index 10dd3b26..44a007b6 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -76,6 +76,9 @@ extern "C" EXPORT int jack_set_sample_rate_callback (jack_client_t *client, JackSampleRateCallback srate_callback, void *arg); + EXPORT int jack_set_client_registration_callback (jack_client_t *, + JackClientRegistrationCallback + registration_callback, void *arg); EXPORT int jack_set_port_registration_callback (jack_client_t *, JackPortRegistrationCallback registration_callback, void *arg); @@ -649,7 +652,6 @@ EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRa JackLibGlobals::CheckContext(); #endif JackClient* client = (JackClient*)ext_client; - JackLog("jack_set_sample_rate_callback ext_client %x client %x \n", ext_client, client); if (client == NULL) { jack_error("jack_set_sample_rate_callback called with a NULL client"); return -1; @@ -659,6 +661,20 @@ EXPORT int jack_set_sample_rate_callback(jack_client_t* ext_client, JackSampleRa } } +EXPORT int jack_set_client_registration_callback(jack_client_t* ext_client, JackClientRegistrationCallback registration_callback, void* arg) +{ +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif + JackClient* client = (JackClient*)ext_client; + if (client == NULL) { + jack_error("jack_set_client_registration_callback called with a NULL client"); + return -1; + } else { + return client->SetClientRegistrationCallback(registration_callback, arg); + } +} + EXPORT int jack_set_port_registration_callback(jack_client_t* ext_client, JackPortRegistrationCallback registration_callback, void* arg) { #ifdef __CLIENTDEBUG__ diff --git a/common/JackClient.cpp b/common/JackClient.cpp index bda9c966..42942645 100644 --- a/common/JackClient.cpp +++ b/common/JackClient.cpp @@ -128,9 +128,12 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, switch (notify) { case JackNotifyChannelInterface::kAddClient: - case JackNotifyChannelInterface::kRemoveClient: res = ClientNotifyImp(refnum, name, notify, sync, value); - break; + break; + + case JackNotifyChannelInterface::kRemoveClient: + res = ClientNotifyImp(refnum, name, notify, sync, value); + break; case JackNotifyChannelInterface::kActivateClient: JackLog("JackClient::kActivateClient name = %s ref = %ld \n", name, refnum); @@ -145,6 +148,18 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync, if (IsActive()) { switch (notify) { + + case JackNotifyChannelInterface::kAddClient: + printf("ClientNotify fName = %s name = %s\n", GetClientControl()->fName, name); + if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself + fClientRegistration(name, 1, fClientRegistrationArg); + break; + + case JackNotifyChannelInterface::kRemoveClient: + printf("ClientNotify fName = %s name = %s\n", GetClientControl()->fName, name); + if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) // Don't call the callback for the registering client itself + fClientRegistration(name, 0, fClientRegistrationArg); + break; case JackNotifyChannelInterface::kBufferSizeCallback: JackLog("JackClient::kBufferSizeCallback buffer_size = %ld\n", value); @@ -759,6 +774,18 @@ int JackClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg } } +int JackClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg) +{ + if (IsActive()) { + jack_error("You cannot set callbacks on an active client"); + return -1; + } else { + fPortRegistrationArg = arg; + fClientRegistration = callback; + return 0; + } +} + int JackClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg) { if (IsActive()) { diff --git a/common/JackClient.h b/common/JackClient.h index d7e9fb83..f15ccc02 100644 --- a/common/JackClient.h +++ b/common/JackClient.h @@ -58,6 +58,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface JackShutdownCallback fShutdown; JackThreadInitCallback fInit; JackBufferSizeCallback fBufferSize; + JackClientRegistrationCallback fClientRegistration; JackFreewheelCallback fFreewheel; JackPortRegistrationCallback fPortRegistration; JackTimebaseCallback fTimebase; @@ -68,6 +69,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface void* fShutdownArg; void* fInitArg; void* fBufferSizeArg; + void* fClientRegistrationArg; void* fFreewheelArg; void* fPortRegistrationArg; void* fTimebaseArg; @@ -144,6 +146,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface virtual int SetInitCallback(JackThreadInitCallback callback, void* arg); virtual int SetGraphOrderCallback(JackGraphOrderCallback callback, void* arg); virtual int SetBufferSizeCallback(JackBufferSizeCallback callback, void* arg); + virtual int SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg); virtual int SetFreewheelCallback(JackFreewheelCallback callback, void* arg); virtual int SetPortRegistrationCallback(JackPortRegistrationCallback callback, void* arg); diff --git a/common/jack.h b/common/jack.h index 0d8129b1..2c72b3c2 100644 --- a/common/jack.h +++ b/common/jack.h @@ -309,6 +309,16 @@ extern "C" JackSampleRateCallback srate_callback, void *arg); + /** + * Tell the JACK server to call @a registration_callback whenever a + * port is registered or unregistered, passing @a arg as a parameter. + * + * @return 0 on success, otherwise a non-zero error code + */ + int jack_set_client_registration_callback (jack_client_t *, + JackClientRegistrationCallback + registration_callback, void *arg); + /** * Tell the JACK server to call @a registration_callback whenever a * port is registered or unregistered, passing @a arg as a parameter. diff --git a/common/types.h b/common/types.h index bbc18589..db572af5 100644 --- a/common/types.h +++ b/common/types.h @@ -179,6 +179,17 @@ typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void *arg); */ typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int, void *arg); +/** + * Prototype for the client supplied function that is called + * whenever a client is registered or unregistered. + * + * @param name a null-terminated string containing the client name + * @param register non-zero if the client is being registered, + * zero if the client is being unregistered + * @param arg pointer to a client supplied structure + */ +typedef void (*JackClientRegistrationCallback)(const char* name, int register, void *arg); + /** * Prototype for the client supplied function that is called * whenever jackd starts or stops freewheeling. diff --git a/tests/jack_test.cpp b/tests/jack_test.cpp index a3e426cf..f9e297f9 100644 --- a/tests/jack_test.cpp +++ b/tests/jack_test.cpp @@ -169,6 +169,11 @@ void Jack_Freewheel_Callback(int starting, void *arg) FW = starting; } +void Jack_Client_Registration_Callback(const char* name, int val, void *arg) +{ + Log("Client registration callback name = %s has been successfully called with value %i.(msg from callback)\n", name, val); +} + int Jack_Update_Buffer_Size(jack_nframes_t nframes, void *arg) { cur_buffer_size = jack_get_buffer_size(client1); @@ -203,7 +208,7 @@ void Jack_Error_Callback(const char *msg) } } -void jack_shutdown (void *arg) +void jack_shutdown(void *arg) { printf("Jack_test has been kicked out by jackd !\n"); exit (1); @@ -600,6 +605,9 @@ int main (int argc, char *argv[]) if (jack_set_port_registration_callback(client1, Jack_Port_Register, 0) != 0) { printf("Error when calling jack_set_port_registration_callback() !\n"); } + if (jack_set_client_registration_callback(client1, Jack_Client_Registration_Callback, 0) != 0) { + printf("Error when calling jack_set_client_registration_callback() !\n"); + } jack_set_error_function (Jack_Error_Callback); /** @@ -1025,7 +1033,8 @@ int main (int argc, char *argv[]) } free(inports); // free array of ports (as mentionned in the doc of jack_get_ports) - + + /** *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*