git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1472 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.63
| @@ -2,6 +2,10 @@ | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2007-05-05 Stephane Letz <letz@grame.fr> | |||
| * Add jack_set_client_registration_callback API. | |||
| 2007-05-04 Stephane Letz <letz@grame.fr> | |||
| * Steven Chamberlain patch to fix jack_port_type. Test for jack_port_type behaviour in jack_test.cpp tool. | |||
| @@ -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__ | |||
| @@ -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()) { | |||
| @@ -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); | |||
| @@ -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. | |||
| @@ -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. | |||
| @@ -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) | |||
| /** | |||
| *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* | |||
| *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* | |||