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