git-svn-id: http://subversion.jackaudio.org/jack/jack2/branches/libjacknet@3551 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
| @@ -25,9 +25,31 @@ Paul Davis | |||||
| Jackdmp changes log | Jackdmp changes log | ||||
| --------------------------- | --------------------------- | ||||
| 2009-05-18 Stephane Letz <letz@grame.fr> | |||||
| * Correct wcsript files to create jackdbus only (and not create jackd anymore) when compiled in --dbus mode, add a --classic option. Both options are possible but issue a warning. | |||||
| 2009-05-15 Stephane Letz <letz@grame.fr> | |||||
| * Move InitFrameTime in JackDriver::Start method. | |||||
| 2009-05-13 Stephane Letz <letz@grame.fr> | |||||
| * Reworked Torben Hohn fix for server restart issue on Windows. | |||||
| 2009-05-11 Stephane Letz <letz@grame.fr> | |||||
| * New jack_free function added in jack.h. | |||||
| * Torben Hohn fix for InitTime and GetMicroSeconds in JackWinTime.c. | |||||
| 2009-05-07 Stephane Letz <letz@grame.fr> | |||||
| * Cleanup "loopback" stuff in server. | |||||
| 2009-05-06 Stephane Letz <letz@grame.fr> | 2009-05-06 Stephane Letz <letz@grame.fr> | ||||
| * Fix transport callback (timebase master, sync) issue when used after jack_activate (RT thread was not running). | |||||
| * Fix transport callback (timebase master, sync) issue when used after jack_activate (RT thread was not running). | |||||
| * D-Bus access for jackctl_server_add_slave/jackctl_server_remove_slave API. | |||||
| 2009-05-05 Stephane Letz <letz@grame.fr> | 2009-05-05 Stephane Letz <letz@grame.fr> | ||||
| @@ -241,6 +241,7 @@ extern "C" | |||||
| EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client, | EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client, | ||||
| jack_intclient_t intclient); | jack_intclient_t intclient); | ||||
| EXPORT void jack_free(void* ptr); | |||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| @@ -1930,3 +1931,8 @@ jack_get_version_string() | |||||
| { | { | ||||
| return VERSION; | return VERSION; | ||||
| } | } | ||||
| EXPORT void jack_free(void* ptr) | |||||
| { | |||||
| free(ptr); | |||||
| } | |||||
| @@ -77,10 +77,6 @@ struct jackctl_server | |||||
| /* int32_t, msecs; if zero, use period size. */ | /* int32_t, msecs; if zero, use period size. */ | ||||
| union jackctl_parameter_value client_timeout; | union jackctl_parameter_value client_timeout; | ||||
| union jackctl_parameter_value default_client_timeout; | union jackctl_parameter_value default_client_timeout; | ||||
| /* uint32_t, ports of the loopback driver */ | |||||
| union jackctl_parameter_value loopback_ports; | |||||
| union jackctl_parameter_value default_loopback_ports; | |||||
| /* uint32_t, clock source type */ | /* uint32_t, clock source type */ | ||||
| union jackctl_parameter_value clock_source; | union jackctl_parameter_value clock_source; | ||||
| @@ -643,7 +639,7 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "name", | "name", | ||||
| "server name to use", | |||||
| "Server name to use.", | |||||
| "", | "", | ||||
| JackParamString, | JackParamString, | ||||
| &server_ptr->name, | &server_ptr->name, | ||||
| @@ -657,7 +653,7 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "realtime", | "realtime", | ||||
| "Whether to use realtime mode", | |||||
| "Whether to use realtime mode.", | |||||
| "Use realtime scheduling. This is needed for reliable low-latency performance. On most systems, it requires JACK to run with special scheduler and memory allocation privileges, which may be obtained in several ways. On Linux you should use PAM.", | "Use realtime scheduling. This is needed for reliable low-latency performance. On most systems, it requires JACK to run with special scheduler and memory allocation privileges, which may be obtained in several ways. On Linux you should use PAM.", | ||||
| JackParamBool, | JackParamBool, | ||||
| &server_ptr->realtime, | &server_ptr->realtime, | ||||
| @@ -714,7 +710,7 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "client-timeout", | "client-timeout", | ||||
| "Client timeout limit in milliseconds", | |||||
| "Client timeout limit in milliseconds.", | |||||
| "", | "", | ||||
| JackParamInt, | JackParamInt, | ||||
| &server_ptr->client_timeout, | &server_ptr->client_timeout, | ||||
| @@ -724,25 +720,11 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| goto fail_free_parameters; | goto fail_free_parameters; | ||||
| } | } | ||||
| value.ui = 0; | |||||
| if (jackctl_add_parameter( | |||||
| &server_ptr->parameters, | |||||
| "loopback-ports", | |||||
| "Number of loopback ports", | |||||
| "", | |||||
| JackParamUInt, | |||||
| &server_ptr->loopback_ports, | |||||
| &server_ptr->default_loopback_ports, | |||||
| value) == NULL) | |||||
| { | |||||
| goto fail_free_parameters; | |||||
| } | |||||
| value.ui = 0; | value.ui = 0; | ||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "clock-source", | "clock-source", | ||||
| "Clocksource type : c(ycle) | h(pet) | s(ystem)", | |||||
| "Clocksource type : c(ycle) | h(pet) | s(ystem).", | |||||
| "", | "", | ||||
| JackParamUInt, | JackParamUInt, | ||||
| &server_ptr->clock_source, | &server_ptr->clock_source, | ||||
| @@ -756,7 +738,7 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "replace-registry", | "replace-registry", | ||||
| "Replace registry", | |||||
| "Replace shared memory registry.", | |||||
| "", | "", | ||||
| JackParamBool, | JackParamBool, | ||||
| &server_ptr->replace_registry, | &server_ptr->replace_registry, | ||||
| @@ -770,7 +752,7 @@ EXPORT jackctl_server_t * jackctl_server_create() | |||||
| if (jackctl_add_parameter( | if (jackctl_add_parameter( | ||||
| &server_ptr->parameters, | &server_ptr->parameters, | ||||
| "sync", | "sync", | ||||
| "Use synchronous mode", | |||||
| "Use server synchronous mode.", | |||||
| "", | "", | ||||
| JackParamBool, | JackParamBool, | ||||
| &server_ptr->sync, | &server_ptr->sync, | ||||
| @@ -880,7 +862,6 @@ jackctl_server_start( | |||||
| server_ptr->client_timeout.i, | server_ptr->client_timeout.i, | ||||
| server_ptr->realtime.b, | server_ptr->realtime.b, | ||||
| server_ptr->realtime_priority.i, | server_ptr->realtime_priority.i, | ||||
| server_ptr->loopback_ports.ui, | |||||
| server_ptr->verbose.b, | server_ptr->verbose.b, | ||||
| (jack_timer_type_t)server_ptr->clock_source.ui, | (jack_timer_type_t)server_ptr->clock_source.ui, | ||||
| server_ptr->name.str); | server_ptr->name.str); | ||||
| @@ -315,6 +315,7 @@ int JackDriver::Write() | |||||
| int JackDriver::Start() | int JackDriver::Start() | ||||
| { | { | ||||
| fEngineControl->InitFrameTime(); | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| @@ -22,7 +22,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| #include "JackServerGlobals.h" | #include "JackServerGlobals.h" | ||||
| #include "JackTime.h" | #include "JackTime.h" | ||||
| #include "JackFreewheelDriver.h" | #include "JackFreewheelDriver.h" | ||||
| #include "JackLoopbackDriver.h" | |||||
| #include "JackDummyDriver.h" | #include "JackDummyDriver.h" | ||||
| #include "JackThreadedDriver.h" | #include "JackThreadedDriver.h" | ||||
| #include "JackGlobals.h" | #include "JackGlobals.h" | ||||
| @@ -39,7 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| namespace Jack | namespace Jack | ||||
| { | { | ||||
| JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, jack_timer_type_t clock, const char* server_name) | |||||
| JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name) | |||||
| { | { | ||||
| if (rt) { | if (rt) { | ||||
| jack_info("JACK server starting in realtime mode with priority %ld", priority); | jack_info("JACK server starting in realtime mode with priority %ld", priority); | ||||
| @@ -54,7 +53,6 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long pr | |||||
| fDriverInfo = new JackDriverInfo(); | fDriverInfo = new JackDriverInfo(); | ||||
| fAudioDriver = NULL; | fAudioDriver = NULL; | ||||
| fFreewheel = false; | fFreewheel = false; | ||||
| fLoopback = loopback; | |||||
| JackServerGlobals::fInstance = this; // Unique instance | JackServerGlobals::fInstance = this; // Unique instance | ||||
| JackServerGlobals::fUserCount = 1; // One user | JackServerGlobals::fUserCount = 1; // One user | ||||
| jack_verbose = verbose; | jack_verbose = verbose; | ||||
| @@ -170,7 +168,6 @@ int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const | |||||
| int JackServer::Start() | int JackServer::Start() | ||||
| { | { | ||||
| jack_log("JackServer::Start"); | jack_log("JackServer::Start"); | ||||
| fEngineControl->InitFrameTime(); | |||||
| return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
| } | } | ||||
| @@ -203,13 +200,11 @@ int JackServer::SetBufferSize(jack_nframes_t buffer_size) | |||||
| if (fAudioDriver->SetBufferSize(buffer_size) == 0) { | if (fAudioDriver->SetBufferSize(buffer_size) == 0) { | ||||
| fFreewheelDriver->SetBufferSize(buffer_size); | fFreewheelDriver->SetBufferSize(buffer_size); | ||||
| fEngine->NotifyBufferSize(buffer_size); | fEngine->NotifyBufferSize(buffer_size); | ||||
| fEngineControl->InitFrameTime(); | |||||
| return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
| } else { // Failure: try to restore current value | } else { // Failure: try to restore current value | ||||
| jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | jack_error("Cannot SetBufferSize for audio driver, restore current value %ld", current_buffer_size); | ||||
| fAudioDriver->SetBufferSize(current_buffer_size); | fAudioDriver->SetBufferSize(current_buffer_size); | ||||
| fFreewheelDriver->SetBufferSize(current_buffer_size); | fFreewheelDriver->SetBufferSize(current_buffer_size); | ||||
| fEngineControl->InitFrameTime(); | |||||
| fAudioDriver->Start(); | fAudioDriver->Start(); | ||||
| // SetBufferSize actually failed, so return an error... | // SetBufferSize actually failed, so return an error... | ||||
| return -1; | return -1; | ||||
| @@ -241,7 +236,6 @@ int JackServer::SetFreewheel(bool onoff) | |||||
| fGraphManager->Restore(&fConnectionState); // Restore previous connection state | fGraphManager->Restore(&fConnectionState); // Restore previous connection state | ||||
| fEngine->NotifyFreewheel(onoff); | fEngine->NotifyFreewheel(onoff); | ||||
| fFreewheelDriver->SetMaster(false); | fFreewheelDriver->SetMaster(false); | ||||
| fEngineControl->InitFrameTime(); | |||||
| return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
| } | } | ||||
| } else { | } else { | ||||
| @@ -346,7 +340,6 @@ int JackServer::SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_par | |||||
| // Activate master | // Activate master | ||||
| fAudioDriver = master; | fAudioDriver = master; | ||||
| fDriverInfo = info; | fDriverInfo = info; | ||||
| fEngineControl->InitFrameTime(); | |||||
| fAudioDriver->Attach(); | fAudioDriver->Attach(); | ||||
| fAudioDriver->SetMaster(true); | fAudioDriver->SetMaster(true); | ||||
| return fAudioDriver->Start(); | return fAudioDriver->Start(); | ||||
| @@ -57,13 +57,12 @@ class SERVER_EXPORT JackServer | |||||
| JackConnectionManager fConnectionState; | JackConnectionManager fConnectionState; | ||||
| JackSynchro fSynchroTable[CLIENT_NUM]; | JackSynchro fSynchroTable[CLIENT_NUM]; | ||||
| bool fFreewheel; | bool fFreewheel; | ||||
| long fLoopback; | |||||
| int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status); | int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status); | ||||
| public: | public: | ||||
| JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, jack_timer_type_t clock, const char* server_name); | |||||
| JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name); | |||||
| ~JackServer(); | ~JackServer(); | ||||
| int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); | int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); | ||||
| @@ -39,12 +39,11 @@ int JackServerGlobals::Start(const char* server_name, | |||||
| int time_out_ms, | int time_out_ms, | ||||
| int rt, | int rt, | ||||
| int priority, | int priority, | ||||
| int loopback, | |||||
| int verbose, | int verbose, | ||||
| jack_timer_type_t clock) | jack_timer_type_t clock) | ||||
| { | { | ||||
| jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose); | jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose); | ||||
| new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, clock, server_name); // Will setup fInstance and fUserCount globals | |||||
| new JackServer(sync, temporary, time_out_ms, rt, priority, verbose, clock, server_name); // Will setup fInstance and fUserCount globals | |||||
| int res = fInstance->Open(driver_desc, driver_params); | int res = fInstance->Open(driver_desc, driver_params); | ||||
| return (res < 0) ? res : fInstance->Start(); | return (res < 0) ? res : fInstance->Start(); | ||||
| } | } | ||||
| @@ -71,7 +70,6 @@ bool JackServerGlobals::Init() | |||||
| int verbose_aux = 0; | int verbose_aux = 0; | ||||
| int do_mlock = 1; | int do_mlock = 1; | ||||
| unsigned int port_max = 128; | unsigned int port_max = 128; | ||||
| int loopback = 0; | |||||
| int do_unlock = 0; | int do_unlock = 0; | ||||
| int temporary = 0; | int temporary = 0; | ||||
| @@ -112,7 +110,6 @@ bool JackServerGlobals::Init() | |||||
| { "name", 0, 0, 'n' }, | { "name", 0, 0, 'n' }, | ||||
| { "unlock", 0, 0, 'u' }, | { "unlock", 0, 0, 'u' }, | ||||
| { "realtime", 0, 0, 'R' }, | { "realtime", 0, 0, 'R' }, | ||||
| { "loopback", 0, 0, 'L' }, | |||||
| { "realtime-priority", 1, 0, 'P' }, | { "realtime-priority", 1, 0, 'P' }, | ||||
| { "timeout", 1, 0, 't' }, | { "timeout", 1, 0, 't' }, | ||||
| { "temporary", 0, 0, 'T' }, | { "temporary", 0, 0, 'T' }, | ||||
| @@ -204,10 +201,6 @@ bool JackServerGlobals::Init() | |||||
| realtime = 1; | realtime = 1; | ||||
| break; | break; | ||||
| case 'L': | |||||
| loopback = atoi(optarg); | |||||
| break; | |||||
| case 'T': | case 'T': | ||||
| temporary = 1; | temporary = 1; | ||||
| break; | break; | ||||
| @@ -296,7 +289,7 @@ bool JackServerGlobals::Init() | |||||
| free(argv[i]); | free(argv[i]); | ||||
| } | } | ||||
| int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux, clock_source); | |||||
| int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, verbose_aux, clock_source); | |||||
| if (res < 0) { | if (res < 0) { | ||||
| jack_error("Cannot start server... exit"); | jack_error("Cannot start server... exit"); | ||||
| Delete(); | Delete(); | ||||
| @@ -52,7 +52,6 @@ struct SERVER_EXPORT JackServerGlobals | |||||
| int time_out_ms, | int time_out_ms, | ||||
| int rt, | int rt, | ||||
| int priority, | int priority, | ||||
| int loopback, | |||||
| int verbose, | int verbose, | ||||
| jack_timer_type_t clock); | jack_timer_type_t clock); | ||||
| static void Stop(); | static void Stop(); | ||||
| @@ -31,6 +31,7 @@ | |||||
| #include <jack/jslist.h> | #include <jack/jslist.h> | ||||
| #include <jack/systemdeps.h> | #include <jack/systemdeps.h> | ||||
| #include <stdbool.h> | |||||
| /** Parameter types, intentionally similar to jack_driver_param_type_t */ | /** Parameter types, intentionally similar to jack_driver_param_type_t */ | ||||
| typedef enum | typedef enum | ||||
| @@ -124,19 +125,6 @@ void | |||||
| jackctl_server_destroy( | jackctl_server_destroy( | ||||
| jackctl_server_t * server); | jackctl_server_t * server); | ||||
| /** | |||||
| * Call this function to get list of available drivers. List node data | |||||
| * pointers is a driver object handle (::jackctl_driver_t). | |||||
| * | |||||
| * @param server server object handle to get drivers for | |||||
| * | |||||
| * @return Single linked list of driver object handles. Must not be | |||||
| * modified. Always same for same server object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_server_get_drivers_list( | |||||
| jackctl_server_t * server); | |||||
| /** | /** | ||||
| * Call this function to start JACK server | * Call this function to start JACK server | ||||
| * | * | ||||
| @@ -161,6 +149,19 @@ bool | |||||
| jackctl_server_stop( | jackctl_server_stop( | ||||
| jackctl_server_t * server); | jackctl_server_t * server); | ||||
| /** | |||||
| * Call this function to get list of available drivers. List node data | |||||
| * pointers is a driver object handle (::jackctl_driver_t). | |||||
| * | |||||
| * @param server server object handle to get drivers for | |||||
| * | |||||
| * @return Single linked list of driver object handles. Must not be | |||||
| * modified. Always same for same server object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_server_get_drivers_list( | |||||
| jackctl_server_t * server); | |||||
| /** | /** | ||||
| * Call this function to get list of server parameters. List node data | * Call this function to get list of server parameters. List node data | ||||
| * pointers is a parameter object handle (::jackctl_parameter_t). | * pointers is a parameter object handle (::jackctl_parameter_t). | ||||
| @@ -174,6 +175,82 @@ const JSList * | |||||
| jackctl_server_get_parameters( | jackctl_server_get_parameters( | ||||
| jackctl_server_t * server); | jackctl_server_t * server); | ||||
| /** | |||||
| * Call this function to get list of available internal clients. List node data | |||||
| * pointers is a internal client object handle (::jackctl_internal_t). | |||||
| * | |||||
| * @param server server object handle to get internal clients for | |||||
| * | |||||
| * @return Single linked list of internal client object handles. Must not be | |||||
| * modified. Always same for same server object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_server_get_internals_list( | |||||
| jackctl_server_t * server); | |||||
| /** | |||||
| * Call this function to load one internal client. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param internal internal to use | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_load_internal( | |||||
| jackctl_server_t * server, | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to unload one internal client. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param internal internal to unload | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_unload_internal( | |||||
| jackctl_server_t * server, | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to add a slave in the driver slave list. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to add in the driver slave list. | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_add_slave(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| /** | |||||
| * Call this function to remove a slave from the driver slave list. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to remove from the driver slave list. | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_remove_slave(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| /** | |||||
| * Call this function to switch master driver. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to switch to | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_switch_master(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| /** | /** | ||||
| * Call this function to get name of driver. | * Call this function to get name of driver. | ||||
| * | * | ||||
| @@ -199,6 +276,31 @@ const JSList * | |||||
| jackctl_driver_get_parameters( | jackctl_driver_get_parameters( | ||||
| jackctl_driver_t * driver); | jackctl_driver_t * driver); | ||||
| /** | |||||
| * Call this function to get name of internal client. | |||||
| * | |||||
| * @param internal internal object handle to get name of | |||||
| * | |||||
| * @return internal name. Must not be modified. Always same for same | |||||
| * internal object. | |||||
| */ | |||||
| const char * | |||||
| jackctl_internal_get_name( | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to get list of internal parameters. List node data | |||||
| * pointers is a parameter object handle (::jackctl_parameter_t). | |||||
| * | |||||
| * @param internal internal object handle to get parameters for | |||||
| * | |||||
| * @return Single linked list of parameter object handles. Must not be | |||||
| * modified. Always same for same internal object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_internal_get_parameters( | |||||
| jackctl_internal_t * internal); | |||||
| /** | /** | ||||
| * Call this function to get parameter name. | * Call this function to get parameter name. | ||||
| * | * | ||||
| @@ -413,70 +515,6 @@ bool | |||||
| jackctl_parameter_constraint_is_fake_value( | jackctl_parameter_constraint_is_fake_value( | ||||
| jackctl_parameter_t * parameter); | jackctl_parameter_t * parameter); | ||||
| /** | |||||
| * Call this function to get list of available internal clients. List node data | |||||
| * pointers is a internal client object handle (::jackctl_internal_t). | |||||
| * | |||||
| * @param server server object handle to get internal clients for | |||||
| * | |||||
| * @return Single linked list of internal client object handles. Must not be | |||||
| * modified. Always same for same server object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_server_get_internals_list( | |||||
| jackctl_server_t * server); | |||||
| /** | |||||
| * Call this function to get name of internal client. | |||||
| * | |||||
| * @param internal internal object handle to get name of | |||||
| * | |||||
| * @return internal name. Must not be modified. Always same for same | |||||
| * internal object. | |||||
| */ | |||||
| const char * | |||||
| jackctl_internal_get_name( | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to get list of internal parameters. List node data | |||||
| * pointers is a parameter object handle (::jackctl_parameter_t). | |||||
| * | |||||
| * @param internal internal object handle to get parameters for | |||||
| * | |||||
| * @return Single linked list of parameter object handles. Must not be | |||||
| * modified. Always same for same internal object. | |||||
| */ | |||||
| const JSList * | |||||
| jackctl_internal_get_parameters( | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to load one internal client. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param internal internal to use | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_load_internal( | |||||
| jackctl_server_t * server, | |||||
| jackctl_internal_t * internal); | |||||
| /** | |||||
| * Call this function to unload one internal client. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param internal internal to unload | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_unload_internal( | |||||
| jackctl_server_t * server, | |||||
| jackctl_internal_t * internal); | |||||
| /** | /** | ||||
| * Call this function to log an error message. | * Call this function to log an error message. | ||||
| * | * | ||||
| @@ -510,43 +548,6 @@ jack_log( | |||||
| /* @} */ | /* @} */ | ||||
| /** | |||||
| * Call this function to add a slave in the driver slave list. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to add in the driver slave list. | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_add_slave(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| /** | |||||
| * Call this function to remove a slave from the driver slave list. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to remove from the driver slave list. | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_remove_slave(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| /** | |||||
| * Call this function to switch master driver. | |||||
| * | |||||
| * @param server server object handle | |||||
| * @param driver driver to switch to | |||||
| * | |||||
| * @return success status: true - success, false - fail | |||||
| */ | |||||
| bool | |||||
| jackctl_server_switch_master(jackctl_server_t * server, | |||||
| jackctl_driver_t * driver); | |||||
| #if 0 | #if 0 | ||||
| { /* Adjust editor indent */ | { /* Adjust editor indent */ | ||||
| #endif | #endif | ||||
| @@ -1070,6 +1070,16 @@ void jack_set_info_function (void (*func)(const char *)); | |||||
| /*@}*/ | /*@}*/ | ||||
| /** | |||||
| * The free function to be used on memory returned by jack_port_get_connections, | |||||
| * jack_port_get_all_connections and jack_get_ports functions. | |||||
| * This is MANDATORY on Windows when otherwise all nasty runtime version related crashes can occur. | |||||
| * Developers are strongly encouraged to use this function instead of the standard "free" function in new code. | |||||
| * | |||||
| */ | |||||
| void jack_free(void* ptr); | |||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||
| } | } | ||||
| #endif | #endif | ||||
| @@ -391,6 +391,44 @@ fail: | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| bool | |||||
| jack_controller_add_slave( | |||||
| struct jack_controller *controller_ptr, | |||||
| const char * driver_name) | |||||
| { | |||||
| jackctl_driver_t *driver; | |||||
| driver = jack_controller_find_driver(controller_ptr->server, driver_name); | |||||
| if (driver == NULL) | |||||
| { | |||||
| return false; | |||||
| } | |||||
| jack_info("driver \"%s\" selected", driver_name); | |||||
| return jackctl_server_add_slave(controller_ptr->server, driver); | |||||
| } | |||||
| bool | |||||
| jack_controller_remove_slave( | |||||
| struct jack_controller *controller_ptr, | |||||
| const char * driver_name) | |||||
| { | |||||
| jackctl_driver_t *driver; | |||||
| driver = jack_controller_find_driver(controller_ptr->server, driver_name); | |||||
| if (driver == NULL) | |||||
| { | |||||
| return false; | |||||
| } | |||||
| jack_info("driver \"%s\" selected", driver_name); | |||||
| return jackctl_server_remove_slave(controller_ptr->server, driver); | |||||
| } | |||||
| bool | bool | ||||
| jack_controller_load_internal( | jack_controller_load_internal( | ||||
| struct jack_controller *controller_ptr, | struct jack_controller *controller_ptr, | ||||
| @@ -215,6 +215,44 @@ jack_control_run_method( | |||||
| "jack_controller_load_internal failed for internal (%s)", internal_name); | "jack_controller_load_internal failed for internal (%s)", internal_name); | ||||
| } | } | ||||
| } | } | ||||
| else if (strcmp (call->method_name, "AddSlave") == 0) | |||||
| { | |||||
| const char *driver_name; | |||||
| if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | |||||
| { | |||||
| /* The method call had invalid arguments meaning that | |||||
| * get_method_args() has constructed an error for us. | |||||
| */ | |||||
| goto exit; | |||||
| } | |||||
| if (!jack_controller_add_slave(controller_ptr, driver_name)) { | |||||
| jack_dbus_error( | |||||
| call, | |||||
| JACK_DBUS_ERROR_GENERIC, | |||||
| "jack_controller_add_slave failed for driver (%s)", driver_name); | |||||
| } | |||||
| } | |||||
| else if (strcmp (call->method_name, "RemoveSlave") == 0) | |||||
| { | |||||
| const char *driver_name; | |||||
| if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID)) | |||||
| { | |||||
| /* The method call had invalid arguments meaning that | |||||
| * get_method_args() has constructed an error for us. | |||||
| */ | |||||
| goto exit; | |||||
| } | |||||
| if (!jack_controller_remove_slave(controller_ptr, driver_name)) { | |||||
| jack_dbus_error( | |||||
| call, | |||||
| JACK_DBUS_ERROR_GENERIC, | |||||
| "jack_controller_remove_slave failed for driver (%s)", driver_name); | |||||
| } | |||||
| } | |||||
| else if (strcmp (call->method_name, "UnloadInternal") == 0) | else if (strcmp (call->method_name, "UnloadInternal") == 0) | ||||
| { | { | ||||
| const char *internal_name; | const char *internal_name; | ||||
| @@ -234,6 +272,7 @@ jack_control_run_method( | |||||
| "jack_controller_unload_internal failed for internal (%s)", internal_name); | "jack_controller_unload_internal failed for internal (%s)", internal_name); | ||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| return false; | return false; | ||||
| @@ -305,6 +344,14 @@ JACK_DBUS_METHOD_ARGUMENTS_BEGIN(UnlooadInternal) | |||||
| JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | ||||
| JACK_DBUS_METHOD_ARGUMENTS_END | JACK_DBUS_METHOD_ARGUMENTS_END | ||||
| JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlave) | |||||
| JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | |||||
| JACK_DBUS_METHOD_ARGUMENTS_END | |||||
| JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlave) | |||||
| JACK_DBUS_METHOD_ARGUMENT("internal", "s", false) | |||||
| JACK_DBUS_METHOD_ARGUMENTS_END | |||||
| JACK_DBUS_METHODS_BEGIN | JACK_DBUS_METHODS_BEGIN | ||||
| JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | ||||
| JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | ||||
| @@ -320,6 +367,8 @@ JACK_DBUS_METHODS_BEGIN | |||||
| JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | ||||
| JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL) | JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL) | ||||
| JACK_DBUS_METHOD_DESCRIBE(UnlooadInternal, NULL) | JACK_DBUS_METHOD_DESCRIBE(UnlooadInternal, NULL) | ||||
| JACK_DBUS_METHOD_DESCRIBE(AddSlave, NULL) | |||||
| JACK_DBUS_METHOD_DESCRIBE(RemoveSlave, NULL) | |||||
| JACK_DBUS_METHODS_END | JACK_DBUS_METHODS_END | ||||
| JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted) | JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted) | ||||
| @@ -423,7 +423,7 @@ jack_controller_patchbay_new_port( | |||||
| const char *port_short_name; | const char *port_short_name; | ||||
| size_t client_name_len; | size_t client_name_len; | ||||
| //jack_info("name: %s", port_full_name); | |||||
| //jack_info("new port: %s", port_full_name); | |||||
| port_short_name = strchr(port_full_name, ':'); | port_short_name = strchr(port_full_name, ':'); | ||||
| if (port_short_name == NULL) | if (port_short_name == NULL) | ||||
| @@ -489,6 +489,8 @@ jack_controller_patchbay_remove_port( | |||||
| struct jack_controller_patchbay *patchbay_ptr, | struct jack_controller_patchbay *patchbay_ptr, | ||||
| struct jack_graph_port *port_ptr) | struct jack_graph_port *port_ptr) | ||||
| { | { | ||||
| //jack_info("remove port: %s", port_ptr->name); | |||||
| pthread_mutex_lock(&patchbay_ptr->lock); | pthread_mutex_lock(&patchbay_ptr->lock); | ||||
| list_del(&port_ptr->siblings_client); | list_del(&port_ptr->siblings_client); | ||||
| list_del(&port_ptr->siblings_graph); | list_del(&port_ptr->siblings_graph); | ||||
| @@ -1604,7 +1606,7 @@ jack_controller_port_connect_callback( | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| jack_info("Disonnecting '%s' from '%s'", port1_name, port2_name); | |||||
| jack_info("Disconnecting '%s' from '%s'", port1_name, port2_name); | |||||
| connection_ptr = jack_controller_patchbay_find_connection(patchbay_ptr, port1_ptr, port2_ptr); | connection_ptr = jack_controller_patchbay_find_connection(patchbay_ptr, port1_ptr, port2_ptr); | ||||
| if (connection_ptr == NULL) | if (connection_ptr == NULL) | ||||
| { | { | ||||
| @@ -85,6 +85,16 @@ bool | |||||
| jack_controller_switch_master( | jack_controller_switch_master( | ||||
| struct jack_controller *controller_ptr, | struct jack_controller *controller_ptr, | ||||
| void *dbus_call_context_ptr); | void *dbus_call_context_ptr); | ||||
| bool | |||||
| jack_controller_add_slave( | |||||
| struct jack_controller *controller_ptr, | |||||
| const char * driver_name); | |||||
| bool | |||||
| jack_controller_remove_slave( | |||||
| struct jack_controller *controller_ptr, | |||||
| const char * driver_name); | |||||
| bool | bool | ||||
| jack_controller_select_driver( | jack_controller_select_driver( | ||||
| @@ -1,5 +1,6 @@ | |||||
| /* | /* | ||||
| Copyright (C) 2001-2003 Paul Davis | Copyright (C) 2001-2003 Paul Davis | ||||
| Copyright (C) 2005 Jussi Laako | |||||
| Copyright (C) 2004-2008 Grame | Copyright (C) 2004-2008 Grame | ||||
| This program is free software; you can redistribute it and/or modify | This program is free software; you can redistribute it and/or modify | ||||
| @@ -2255,6 +2255,7 @@ int JackAlsaDriver::Close() | |||||
| int JackAlsaDriver::Start() | int JackAlsaDriver::Start() | ||||
| { | { | ||||
| JackAudioDriver::Start(); | |||||
| return alsa_driver_start((alsa_driver_t *)fDriver); | return alsa_driver_start((alsa_driver_t *)fDriver); | ||||
| } | } | ||||
| @@ -48,9 +48,6 @@ namespace Jack | |||||
| #define jack_get_microseconds GetMicroSeconds | #define jack_get_microseconds GetMicroSeconds | ||||
| #define SAMPLE_MAX_24BIT 8388608.0f | |||||
| #define SAMPLE_MAX_16BIT 32768.0f | |||||
| int | int | ||||
| JackFFADODriver::ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes) | JackFFADODriver::ffado_driver_read (ffado_driver_t * driver, jack_nframes_t nframes) | ||||
| { | { | ||||
| @@ -250,10 +247,10 @@ JackFFADODriver::ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *s | |||||
| wait_enter = jack_get_microseconds (); | wait_enter = jack_get_microseconds (); | ||||
| if (wait_enter > driver->wait_next) { | if (wait_enter > driver->wait_next) { | ||||
| /* | /* | ||||
| * This processing cycle was delayed past the | |||||
| * next due interrupt! Do not account this as | |||||
| * a wakeup delay: | |||||
| */ | |||||
| * This processing cycle was delayed past the | |||||
| * next due interrupt! Do not account this as | |||||
| * a wakeup delay: | |||||
| */ | |||||
| driver->wait_next = 0; | driver->wait_next = 0; | ||||
| driver->wait_late++; | driver->wait_late++; | ||||
| } | } | ||||
| @@ -270,7 +267,7 @@ JackFFADODriver::ffado_driver_wait (ffado_driver_t *driver, int extra_fd, int *s | |||||
| } | } | ||||
| driver->wait_last = wait_ret; | driver->wait_last = wait_ret; | ||||
| driver->wait_next = wait_ret + driver->period_usecs; | driver->wait_next = wait_ret + driver->period_usecs; | ||||
| // driver->engine->transport_cycle_start (driver->engine, wait_ret); | |||||
| // driver->engine->transport_cycle_start (driver->engine, wait_ret); | |||||
| if(response == ffado_wait_ok) { | if(response == ffado_wait_ok) { | ||||
| // all good | // all good | ||||
| @@ -344,8 +341,8 @@ JackFFADODriver::SetBufferSize (jack_nframes_t nframes) | |||||
| /* | /* | ||||
| driver->period_size = nframes; | driver->period_size = nframes; | ||||
| driver->period_usecs = | driver->period_usecs = | ||||
| (jack_time_t) floor ((((float) nframes) / driver->sample_rate) | |||||
| * 1000000.0f); | |||||
| (jack_time_t) floor ((((float) nframes) / driver->sample_rate) | |||||
| * 1000000.0f); | |||||
| */ | */ | ||||
| /* tell the engine to change its buffer size */ | /* tell the engine to change its buffer size */ | ||||
| @@ -376,16 +373,16 @@ JackFFADODriver::ffado_driver_new (const char *name, | |||||
| /* Setup the jack interfaces */ | /* Setup the jack interfaces */ | ||||
| jack_driver_nt_init ((jack_driver_nt_t *) driver); | jack_driver_nt_init ((jack_driver_nt_t *) driver); | ||||
| /* driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach; | |||||
| driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach; | |||||
| driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start; | |||||
| driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop; | |||||
| driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle; | |||||
| driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle; | |||||
| driver->write = (JackDriverReadFunction) ffado_driver_write; | |||||
| driver->read = (JackDriverReadFunction) ffado_driver_read; | |||||
| driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize; | |||||
| */ | |||||
| /* driver->nt_attach = (JackDriverNTAttachFunction) ffado_driver_attach; | |||||
| driver->nt_detach = (JackDriverNTDetachFunction) ffado_driver_detach; | |||||
| driver->nt_start = (JackDriverNTStartFunction) ffado_driver_start; | |||||
| driver->nt_stop = (JackDriverNTStopFunction) ffado_driver_stop; | |||||
| driver->nt_run_cycle = (JackDriverNTRunCycleFunction) ffado_driver_run_cycle; | |||||
| driver->null_cycle = (JackDriverNullCycleFunction) ffado_driver_null_cycle; | |||||
| driver->write = (JackDriverReadFunction) ffado_driver_write; | |||||
| driver->read = (JackDriverReadFunction) ffado_driver_read; | |||||
| driver->nt_bufsize = (JackDriverNTBufSizeFunction) ffado_driver_bufsize; | |||||
| */ | |||||
| /* copy command line parameter contents to the driver structure */ | /* copy command line parameter contents to the driver structure */ | ||||
| memcpy(&driver->settings, params, sizeof(ffado_jack_settings_t)); | memcpy(&driver->settings, params, sizeof(ffado_jack_settings_t)); | ||||
| @@ -398,7 +395,7 @@ JackFFADODriver::ffado_driver_new (const char *name, | |||||
| driver->period_usecs = | driver->period_usecs = | ||||
| (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate); | (jack_time_t) floor ((((float) driver->period_size) * 1000000.0f) / driver->sample_rate); | ||||
| // driver->client = client; | |||||
| // driver->client = client; | |||||
| driver->engine = NULL; | driver->engine = NULL; | ||||
| memset(&driver->device_options, 0, sizeof(driver->device_options)); | memset(&driver->device_options, 0, sizeof(driver->device_options)); | ||||
| @@ -709,6 +706,7 @@ int JackFFADODriver::Close() | |||||
| int JackFFADODriver::Start() | int JackFFADODriver::Start() | ||||
| { | { | ||||
| JackAudioDriver::Start(); | |||||
| return ffado_driver_start((ffado_driver_t *)fDriver); | return ffado_driver_start((ffado_driver_t *)fDriver); | ||||
| } | } | ||||
| @@ -918,6 +916,8 @@ extern "C" | |||||
| ffado_jack_settings_t cmlparams; | ffado_jack_settings_t cmlparams; | ||||
| char *device_name="hw:0"; | |||||
| cmlparams.period_size_set = 0; | cmlparams.period_size_set = 0; | ||||
| cmlparams.sample_rate_set = 0; | cmlparams.sample_rate_set = 0; | ||||
| cmlparams.buffer_size_set = 0; | cmlparams.buffer_size_set = 0; | ||||
| @@ -941,6 +941,9 @@ extern "C" | |||||
| param = (jack_driver_param_t *) node->data; | param = (jack_driver_param_t *) node->data; | ||||
| switch (param->character) { | switch (param->character) { | ||||
| case 'd': | |||||
| device_name = strdup (param->value.str); | |||||
| break; | |||||
| case 'p': | case 'p': | ||||
| cmlparams.period_size = param->value.ui; | cmlparams.period_size = param->value.ui; | ||||
| cmlparams.period_size_set = 1; | cmlparams.period_size_set = 1; | ||||
| @@ -953,15 +956,11 @@ extern "C" | |||||
| cmlparams.sample_rate = param->value.ui; | cmlparams.sample_rate = param->value.ui; | ||||
| cmlparams.sample_rate_set = 1; | cmlparams.sample_rate_set = 1; | ||||
| break; | break; | ||||
| case 'C': | |||||
| cmlparams.capture_ports = 1; | |||||
| break; | |||||
| case 'P': | |||||
| cmlparams.playback_ports = 1; | |||||
| case 'i': | |||||
| cmlparams.capture_ports = param->value.ui; | |||||
| break; | break; | ||||
| case 'D': | |||||
| cmlparams.capture_ports = 1; | |||||
| cmlparams.playback_ports = 1; | |||||
| case 'o': | |||||
| cmlparams.playback_ports = param->value.ui; | |||||
| break; | break; | ||||
| case 'I': | case 'I': | ||||
| cmlparams.capture_frame_latency = param->value.ui; | cmlparams.capture_frame_latency = param->value.ui; | ||||
| @@ -969,10 +968,11 @@ extern "C" | |||||
| case 'O': | case 'O': | ||||
| cmlparams.playback_frame_latency = param->value.ui; | cmlparams.playback_frame_latency = param->value.ui; | ||||
| break; | break; | ||||
| // ignore these for now | |||||
| case 'i': | |||||
| case 'x': | |||||
| cmlparams.slave_mode = param->value.ui; | |||||
| break; | break; | ||||
| case 'o': | |||||
| case 'X': | |||||
| cmlparams.snoop_mode = param->value.ui; | |||||
| break; | break; | ||||
| case 'v': | case 'v': | ||||
| cmlparams.verbose_level = param->value.ui; | cmlparams.verbose_level = param->value.ui; | ||||
| @@ -981,10 +981,13 @@ extern "C" | |||||
| /* duplex is the default */ | /* duplex is the default */ | ||||
| if (!cmlparams.playback_ports && !cmlparams.capture_ports) { | if (!cmlparams.playback_ports && !cmlparams.capture_ports) { | ||||
| cmlparams.playback_ports = TRUE; | |||||
| cmlparams.capture_ports = TRUE; | |||||
| cmlparams.playback_ports = 1; | |||||
| cmlparams.capture_ports = 1; | |||||
| } | } | ||||
| // temporary | |||||
| cmlparams.device_info = device_name; | |||||
| Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("system", "firewire_pcm", engine, table); | Jack::JackFFADODriver* ffado_driver = new Jack::JackFFADODriver("system", "firewire_pcm", engine, table); | ||||
| Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver); | Jack::JackDriverClientInterface* threaded_driver = new Jack::JackThreadedDriver(ffado_driver); | ||||
| // Special open for FFADO driver... | // Special open for FFADO driver... | ||||
| @@ -841,6 +841,7 @@ int JackFreebobDriver::Close() | |||||
| int JackFreebobDriver::Start() | int JackFreebobDriver::Start() | ||||
| { | { | ||||
| JackAudioDriver::Start(); | |||||
| return freebob_driver_start((freebob_driver_t *)fDriver); | return freebob_driver_start((freebob_driver_t *)fDriver); | ||||
| } | } | ||||
| @@ -26,13 +26,14 @@ def create_jack_driver_obj(bld, target, sources, uselib = None): | |||||
| return driver | return driver | ||||
| def build(bld): | def build(bld): | ||||
| jackd = bld.new_task_gen('cxx', 'program') | |||||
| jackd.includes = ['../linux', '../posix', '../common/jack', '../common', '../dbus'] | |||||
| jackd.defines = 'HAVE_CONFIG_H' | |||||
| jackd.source = ['../common/Jackdmp.cpp'] | |||||
| jackd.uselib = 'PTHREAD DL RT' | |||||
| jackd.uselib_local = 'serverlib' | |||||
| jackd.target = 'jackd' | |||||
| if bld.env['BUILD_JACKD'] == True: | |||||
| jackd = bld.new_task_gen('cxx', 'program') | |||||
| jackd.includes = ['../linux', '../posix', '../common/jack', '../common', '../dbus'] | |||||
| jackd.defines = 'HAVE_CONFIG_H' | |||||
| jackd.source = ['../common/Jackdmp.cpp'] | |||||
| jackd.uselib = 'PTHREAD DL RT' | |||||
| jackd.uselib_local = 'serverlib' | |||||
| jackd.target = 'jackd' | |||||
| create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') | create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') | ||||
| @@ -20,7 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| #ifndef __JackMachNotifyChannel__ | #ifndef __JackMachNotifyChannel__ | ||||
| #define __JackMachNotifyChannel__ | #define __JackMachNotifyChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackMachPort.h" | #include "JackMachPort.h" | ||||
| namespace Jack | namespace Jack | ||||
| @@ -20,7 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| #ifndef __JackMachServerChannel__ | #ifndef __JackMachServerChannel__ | ||||
| #define __JackMachServerChannel__ | #define __JackMachServerChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackPlatformPlug.h" | #include "JackPlatformPlug.h" | ||||
| #include "JackMachPort.h" | #include "JackMachPort.h" | ||||
| #include <map> | #include <map> | ||||
| @@ -46,14 +46,15 @@ def create_jack_midi_driver_obj(bld, target, sources, uselib = None): | |||||
| return driver | return driver | ||||
| def build(bld): | def build(bld): | ||||
| jackd = bld.new_task_gen('cxx', 'program') | |||||
| jackd.includes = ['.', '../macosx', '../posix', '../common', '../common/jack'] | |||||
| jackd.defines = 'HAVE_CONFIG_H' | |||||
| jackd.source = ['../common/Jackdmp.cpp'] | |||||
| jackd.uselib = 'PTHREAD DL' | |||||
| jackd.uselib_local = 'serverlib' | |||||
| jackd.env.append_value("LINKFLAGS", "-framework CoreFoundation") | |||||
| jackd.target = 'jackd' | |||||
| if bld.env['BUILD_JACKD'] == True: | |||||
| jackd = bld.new_task_gen('cxx', 'program') | |||||
| jackd.includes = ['.', '../macosx', '../posix', '../common', '../common/jack'] | |||||
| jackd.defines = 'HAVE_CONFIG_H' | |||||
| jackd.source = ['../common/Jackdmp.cpp'] | |||||
| jackd.uselib = 'PTHREAD DL' | |||||
| jackd.uselib_local = 'serverlib' | |||||
| jackd.env.append_value("LINKFLAGS", "-framework CoreFoundation") | |||||
| jackd.target = 'jackd' | |||||
| create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') | create_jack_driver_obj(bld, 'dummy', '../common/JackDummyDriver.cpp') | ||||
| @@ -26,8 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| using namespace Jack; | using namespace Jack; | ||||
| #ifndef WIN32 | |||||
| #if defined(JACK_DBUS) | #if defined(JACK_DBUS) | ||||
| #include <dbus/dbus.h> | #include <dbus/dbus.h> | ||||
| @@ -75,10 +73,10 @@ static int start_server_dbus(const char* server_name) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #else | |||||
| #endif | |||||
| /* Exec the JACK server in this process. Does not return. */ | /* Exec the JACK server in this process. Does not return. */ | ||||
| static void start_server_aux(const char* server_name) | |||||
| static void start_server_classic_aux(const char* server_name) | |||||
| { | { | ||||
| FILE* fp = 0; | FILE* fp = 0; | ||||
| char filename[255]; | char filename[255]; | ||||
| @@ -161,18 +159,8 @@ static void start_server_aux(const char* server_name) | |||||
| fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno)); | fprintf(stderr, "exec of JACK server (command = \"%s\") failed: %s\n", command, strerror(errno)); | ||||
| } | } | ||||
| #endif | |||||
| static int start_server(const char* server_name, jack_options_t options) | |||||
| static int start_server_classic(const char* server_name) | |||||
| { | { | ||||
| if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) { | |||||
| return 1; | |||||
| } | |||||
| #if defined(JACK_DBUS) | |||||
| return start_server_dbus(server_name); | |||||
| #else | |||||
| /* The double fork() forces the server to become a child of | /* The double fork() forces the server to become a child of | ||||
| * init, which will always clean up zombie process state on | * init, which will always clean up zombie process state on | ||||
| * termination. This even works in cases where the server | * termination. This even works in cases where the server | ||||
| @@ -186,7 +174,7 @@ static int start_server(const char* server_name, jack_options_t options) | |||||
| case 0: /* child process */ | case 0: /* child process */ | ||||
| switch (fork()) { | switch (fork()) { | ||||
| case 0: /* grandchild process */ | case 0: /* grandchild process */ | ||||
| start_server_aux(server_name); | |||||
| start_server_classic_aux(server_name); | |||||
| _exit(99); /* exec failed */ | _exit(99); /* exec failed */ | ||||
| case - 1: | case - 1: | ||||
| _exit(98); | _exit(98); | ||||
| @@ -199,6 +187,18 @@ static int start_server(const char* server_name, jack_options_t options) | |||||
| /* only the original parent process goes here */ | /* only the original parent process goes here */ | ||||
| return 0; /* (probably) successful */ | return 0; /* (probably) successful */ | ||||
| } | |||||
| static int start_server(const char* server_name, jack_options_t options) | |||||
| { | |||||
| if ((options & JackNoStartServer) || getenv("JACK_NO_START_SERVER")) { | |||||
| return 1; | |||||
| } | |||||
| #if defined(JACK_DBUS) | |||||
| return start_server_dbus(server_name); | |||||
| #else | |||||
| return start_server_classic(server_name); | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -234,5 +234,3 @@ int try_start_server(jack_varargs_t* va, jack_options_t options, jack_status_t* | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| #endif | |||||
| @@ -20,7 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| #ifndef __JackSocketServerChannel__ | #ifndef __JackSocketServerChannel__ | ||||
| #define __JackSocketServerChannel__ | #define __JackSocketServerChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackSocket.h" | #include "JackSocket.h" | ||||
| #include "JackPlatformPlug.h" | #include "JackPlatformPlug.h" | ||||
| #include <poll.h> | #include <poll.h> | ||||
| @@ -29,6 +28,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| namespace Jack | namespace Jack | ||||
| { | { | ||||
| class JackServer; | |||||
| /*! | /*! | ||||
| \brief JackServerChannel using sockets. | \brief JackServerChannel using sockets. | ||||
| */ | */ | ||||
| @@ -20,7 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
| #ifndef __JackSocketServerNotifyChannel__ | #ifndef __JackSocketServerNotifyChannel__ | ||||
| #define __JackSocketServerNotifyChannel__ | #define __JackSocketServerNotifyChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackSocket.h" | #include "JackSocket.h" | ||||
| namespace Jack | namespace Jack | ||||
| @@ -533,6 +533,7 @@ void JackBoomerDriver::CloseAux() | |||||
| int JackBoomerDriver::Start() | int JackBoomerDriver::Start() | ||||
| { | { | ||||
| jack_log("JackBoomerDriver::Start"); | jack_log("JackBoomerDriver::Start"); | ||||
| JackAudioDriver::Start(); | |||||
| // Start output thread only when needed | // Start output thread only when needed | ||||
| if (fOutFD > 0) { | if (fOutFD > 0) { | ||||
| @@ -311,7 +311,6 @@ bool JackWinNamedPipeClientChannel::Execute() | |||||
| JackResult res; | JackResult res; | ||||
| if (event.Read(&fNotificationListenPipe) < 0) { | if (event.Read(&fNotificationListenPipe) < 0) { | ||||
| fNotificationListenPipe.Close(); | |||||
| jack_error("JackWinNamedPipeClientChannel read fail"); | jack_error("JackWinNamedPipeClientChannel read fail"); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| @@ -320,7 +319,6 @@ bool JackWinNamedPipeClientChannel::Execute() | |||||
| if (event.fSync) { | if (event.fSync) { | ||||
| if (res.Write(&fNotificationListenPipe) < 0) { | if (res.Write(&fNotificationListenPipe) < 0) { | ||||
| fNotificationListenPipe.Close(); | |||||
| jack_error("JackWinNamedPipeClientChannel write fail"); | jack_error("JackWinNamedPipeClientChannel write fail"); | ||||
| goto error; | goto error; | ||||
| } | } | ||||
| @@ -328,6 +326,9 @@ bool JackWinNamedPipeClientChannel::Execute() | |||||
| return true; | return true; | ||||
| error: | error: | ||||
| // Close the pipes, server wont be able to create them otherwise. | |||||
| fNotificationListenPipe.Close(); | |||||
| fRequestPipe.Close(); | |||||
| fClient->ShutDown(); | fClient->ShutDown(); | ||||
| return false; | return false; | ||||
| } | } | ||||
| @@ -20,7 +20,6 @@ Copyright (C) 2004-2006 Grame | |||||
| #ifndef __JackWinNamedPipeNotifyChannel__ | #ifndef __JackWinNamedPipeNotifyChannel__ | ||||
| #define __JackWinNamedPipeNotifyChannel__ | #define __JackWinNamedPipeNotifyChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackWinNamedPipe.h" | #include "JackWinNamedPipe.h" | ||||
| namespace Jack | namespace Jack | ||||
| @@ -20,7 +20,6 @@ Copyright (C) 2004-2006 Grame | |||||
| #ifndef __JackWinNamedPipeServerChannel__ | #ifndef __JackWinNamedPipeServerChannel__ | ||||
| #define __JackWinNamedPipeServerChannel__ | #define __JackWinNamedPipeServerChannel__ | ||||
| #include "JackChannel.h" | |||||
| #include "JackWinNamedPipe.h" | #include "JackWinNamedPipe.h" | ||||
| #include "JackPlatformPlug.h" | #include "JackPlatformPlug.h" | ||||
| #include <list> | #include <list> | ||||
| @@ -137,9 +137,9 @@ bool JackWinSemaphore::Allocate(const char* name, const char* server_name, int v | |||||
| return false; | return false; | ||||
| } else if (GetLastError() == ERROR_ALREADY_EXISTS) { | } else if (GetLastError() == ERROR_ALREADY_EXISTS) { | ||||
| jack_error("Allocate: named semaphore already exist name = %s", fName); | jack_error("Allocate: named semaphore already exist name = %s", fName); | ||||
| CloseHandle(fSemaphore); | |||||
| fSemaphore = NULL; | |||||
| return false; | |||||
| // Try to open it | |||||
| fSemaphore = OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE, fName); | |||||
| return (fSemaphore != NULL); | |||||
| } else { | } else { | ||||
| return true; | return true; | ||||
| } | } | ||||
| @@ -30,14 +30,13 @@ SERVER_EXPORT void JackSleep(long usec) | |||||
| SERVER_EXPORT void InitTime() | SERVER_EXPORT void InitTime() | ||||
| { | { | ||||
| QueryPerformanceFrequency(&_jack_freq); | QueryPerformanceFrequency(&_jack_freq); | ||||
| _jack_freq.QuadPart = _jack_freq.QuadPart / 1000000; // by usec | |||||
| } | } | ||||
| SERVER_EXPORT jack_time_t GetMicroSeconds(void) | SERVER_EXPORT jack_time_t GetMicroSeconds(void) | ||||
| { | { | ||||
| LARGE_INTEGER t1; | LARGE_INTEGER t1; | ||||
| QueryPerformanceCounter(&t1); | QueryPerformanceCounter(&t1); | ||||
| return (jack_time_t)(((double)t1.QuadPart) / ((double)_jack_freq.QuadPart)); | |||||
| return (jack_time_t)(((double)t1.QuadPart) / ((double)_jack_freq.QuadPart) * 1000000.0); | |||||
| } | } | ||||
| SERVER_EXPORT void SetClockSource(jack_timer_type_t source) | SERVER_EXPORT void SetClockSource(jack_timer_type_t source) | ||||
| @@ -106,10 +106,10 @@ int JackWinMMEDriver::Open(bool capturing, | |||||
| jack_log("JackWinMMEDriver::Open"); | jack_log("JackWinMMEDriver::Open"); | ||||
| fRealCaptureChannels = midiInGetNumDevs(); | fRealCaptureChannels = midiInGetNumDevs(); | ||||
| fRealPlaybackChannels = midiOutGetNumDevs (); | |||||
| fRealPlaybackChannels = midiOutGetNumDevs(); | |||||
| // Generic JackMidiDriver Open | // Generic JackMidiDriver Open | ||||
| if (JackMidiDriver::Open(capturing, playing, inchannels + fRealCaptureChannels, outchannels + fRealPlaybackChannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency) != 0) | |||||
| if (JackMidiDriver::Open(capturing, playing, fRealCaptureChannels, fRealPlaybackChannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency) != 0) | |||||
| return -1; | return -1; | ||||
| fMidiDestination = new MidiSlot[fRealCaptureChannels]; | fMidiDestination = new MidiSlot[fRealCaptureChannels]; | ||||
| @@ -61,6 +61,7 @@ def set_options(opt): | |||||
| opt.tool_options('compiler_cc') | opt.tool_options('compiler_cc') | ||||
| opt.add_option('--libdir', type='string', help="Library directory [Default: <prefix>/lib]") | opt.add_option('--libdir', type='string', help="Library directory [Default: <prefix>/lib]") | ||||
| opt.add_option('--classic', action='store_true', default=False, help='Enable standard JACK (jackd)') | |||||
| opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') | opt.add_option('--dbus', action='store_true', default=False, help='Enable D-Bus JACK (jackdbus)') | ||||
| opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') | opt.add_option('--doxygen', action='store_true', default=False, help='Enable build of doxygen documentation') | ||||
| opt.add_option('--profile', action='store_true', default=False, help='Build with engine profiling') | opt.add_option('--profile', action='store_true', default=False, help='Build with engine profiling') | ||||
| @@ -122,6 +123,8 @@ def configure(conf): | |||||
| conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen | conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen | ||||
| conf.env['BUILD_WITH_PROFILE'] = Options.options.profile | conf.env['BUILD_WITH_PROFILE'] = Options.options.profile | ||||
| conf.env['BUILD_WITH_32_64'] = Options.options.mixed | conf.env['BUILD_WITH_32_64'] = Options.options.mixed | ||||
| conf.env['BUILD_JACKDBUS'] = Options.options.dbus | |||||
| conf.env['BUILD_JACKD'] = Options.options.classic | |||||
| if Options.options.libdir: | if Options.options.libdir: | ||||
| conf.env['LIBDIR'] = Options.options.libdir | conf.env['LIBDIR'] = Options.options.libdir | ||||
| @@ -168,13 +171,19 @@ def configure(conf): | |||||
| display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) | display_feature('Build doxygen documentation', conf.env['BUILD_DOXYGEN_DOCS']) | ||||
| display_feature('Build with engine profiling', conf.env['BUILD_WITH_PROFILE']) | display_feature('Build with engine profiling', conf.env['BUILD_WITH_PROFILE']) | ||||
| display_feature('Build with 32/64 bits mixed mode', conf.env['BUILD_WITH_32_64']) | display_feature('Build with 32/64 bits mixed mode', conf.env['BUILD_WITH_32_64']) | ||||
| if conf.env['BUILD_JACKDBUS'] and conf.env['BUILD_JACKD']: | |||||
| display_feature('Build standard (jackd) and D-Bus JACK (jackdbus) : WARNING !! mixing both program may cause issues...', True) | |||||
| elif conf.env['BUILD_JACKDBUS']: | |||||
| display_feature('Build D-Bus JACK (jackdbus)', True) | |||||
| else: | |||||
| conf.env['BUILD_JACKD'] = True; # jackd is always built be default | |||||
| display_feature('Build standard JACK (jackd)', True) | |||||
| if conf.env['IS_LINUX']: | if conf.env['IS_LINUX']: | ||||
| display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) | display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True) | ||||
| display_feature('Build with FireWire (FreeBob) support', conf.env['BUILD_DRIVER_FREEBOB'] == True) | display_feature('Build with FireWire (FreeBob) support', conf.env['BUILD_DRIVER_FREEBOB'] == True) | ||||
| display_feature('Build with FireWire (FFADO) support', conf.env['BUILD_DRIVER_FFADO'] == True) | display_feature('Build with FireWire (FFADO) support', conf.env['BUILD_DRIVER_FFADO'] == True) | ||||
| display_feature('Build D-Bus JACK (jackdbus)', conf.env['BUILD_JACKDBUS'] == True) | |||||
| if conf.env['BUILD_JACKDBUS'] == True: | if conf.env['BUILD_JACKDBUS'] == True: | ||||
| display_msg('D-Bus service install directory', conf.env['DBUS_SERVICES_DIR'], 'CYAN') | display_msg('D-Bus service install directory', conf.env['DBUS_SERVICES_DIR'], 'CYAN') | ||||
| #display_msg('Settings persistence', xxx) | #display_msg('Settings persistence', xxx) | ||||