git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4529 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.8
@@ -40,6 +40,7 @@ Chris Caudle | |||||
* More robust code in synchronization primitives and in JackMessageBuffer. | * More robust code in synchronization primitives and in JackMessageBuffer. | ||||
* Non blocking notifications in JackEngine::NotifyAddClient and JackEngine::NotifyRemoveClient. | * Non blocking notifications in JackEngine::NotifyAddClient and JackEngine::NotifyRemoveClient. | ||||
* More robust Control API implementation. | * More robust Control API implementation. | ||||
* Add jackctl_driver_get_type in Control API. | |||||
2011-07-29 Stephane Letz <letz@grame.fr> | 2011-07-29 Stephane Letz <letz@grame.fr> | ||||
@@ -979,6 +979,11 @@ SERVER_EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr) | |||||
return (driver_ptr) ? driver_ptr->desc_ptr->name : NULL; | return (driver_ptr) ? driver_ptr->desc_ptr->name : NULL; | ||||
} | } | ||||
SERVER_EXPORT jackctl_driver_type_t jackctl_driver_get_type(jackctl_driver *driver_ptr) | |||||
{ | |||||
return (driver_ptr) ? (jackctl_driver_type_t)driver_ptr->desc_ptr->type : (jackctl_driver_type_t)0; | |||||
} | |||||
SERVER_EXPORT const JSList * jackctl_driver_get_parameters(jackctl_driver *driver_ptr) | SERVER_EXPORT const JSList * jackctl_driver_get_parameters(jackctl_driver *driver_ptr) | ||||
{ | { | ||||
return (driver_ptr) ? driver_ptr->parameters : NULL; | return (driver_ptr) ? driver_ptr->parameters : NULL; | ||||
@@ -44,6 +44,13 @@ typedef enum | |||||
JackParamBool, /**< @brief value type is a boolean */ | JackParamBool, /**< @brief value type is a boolean */ | ||||
} jackctl_param_type_t; | } jackctl_param_type_t; | ||||
/** Driver types, intentionally similar to jack_driver_type_t */ | |||||
typedef enum | |||||
{ | |||||
JackMaster = 1, /**< @brief master driver */ | |||||
JackSlave, /**< @brief slave driver */ | |||||
} jackctl_driver_type_t; | |||||
/** @brief Max value that jackctl_param_type_t type can have */ | /** @brief Max value that jackctl_param_type_t type can have */ | ||||
#define JACK_PARAM_MAX (JackParamBool + 1) | #define JACK_PARAM_MAX (JackParamBool + 1) | ||||
@@ -126,6 +133,10 @@ SERVER_EXPORT const char * | |||||
jackctl_driver_get_name( | jackctl_driver_get_name( | ||||
jackctl_driver_t * driver); | jackctl_driver_t * driver); | ||||
SERVER_EXPORT jackctl_driver_type_t | |||||
jackctl_driver_get_type( | |||||
jackctl_driver_t * driver); | |||||
SERVER_EXPORT const JSList * | SERVER_EXPORT const JSList * | ||||
jackctl_driver_get_parameters( | jackctl_driver_get_parameters( | ||||
jackctl_driver_t * driver); | jackctl_driver_t * driver); | ||||
@@ -822,6 +822,7 @@ SERVER_EXPORT | |||||
jack_driver_desc_t * | jack_driver_desc_t * | ||||
jack_driver_descriptor_construct( | jack_driver_descriptor_construct( | ||||
const char * name, | const char * name, | ||||
jack_driver_type_t type, | |||||
const char * description, | const char * description, | ||||
jack_driver_desc_filler_t * filler_ptr) | jack_driver_desc_filler_t * filler_ptr) | ||||
{ | { | ||||
@@ -37,7 +37,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("dummy", "Timer based backend", &filler); | |||||
desc = jack_driver_descriptor_construct("dummy", JackDriverMaster, "Timer based backend", &filler); | |||||
value.ui = 2U; | value.ui = 2U; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamUInt, &value, NULL, "Number of capture ports", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamUInt, &value, NULL, "Number of capture ports", NULL); | ||||
@@ -99,14 +99,14 @@ extern "C" | |||||
} | } | ||||
} | } | ||||
if (wait_time > 0) { | |||||
if (wait_time > 0) { | |||||
buffer_size = lroundf((wait_time * sample_rate) / 1000000.0f); | buffer_size = lroundf((wait_time * sample_rate) / 1000000.0f); | ||||
if (buffer_size > BUFFER_SIZE_MAX) { | if (buffer_size > BUFFER_SIZE_MAX) { | ||||
buffer_size = BUFFER_SIZE_MAX; | buffer_size = BUFFER_SIZE_MAX; | ||||
jack_error("Buffer size set to %d", BUFFER_SIZE_MAX); | jack_error("Buffer size set to %d", BUFFER_SIZE_MAX); | ||||
} | } | ||||
} | } | ||||
Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("system", "dummy_pcm", engine, table)); | Jack::JackDriverClientInterface* driver = new Jack::JackThreadedDriver(new Jack::JackDummyDriver("system", "dummy_pcm", engine, table)); | ||||
if (driver->Open(buffer_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) { | if (driver->Open(buffer_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) { | ||||
return driver; | return driver; | ||||
@@ -101,7 +101,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("loopback", "Loopback backend", &filler); | |||||
desc = jack_driver_descriptor_construct("loopback", JackDriverSlave, "Loopback backend", &filler); | |||||
value.i = 0; | value.i = 0; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of loopback ports", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of loopback ports", NULL); | ||||
@@ -383,7 +383,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("netadapter", "netjack net <==> audio backend adapter", &filler); | |||||
desc = jack_driver_descriptor_construct("netadapter", JackDriverNone, "netjack net <==> audio backend adapter", &filler); | |||||
strcpy(value.str, DEFAULT_MULTICAST_IP); | strcpy(value.str, DEFAULT_MULTICAST_IP); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | ||||
@@ -73,7 +73,7 @@ namespace Jack | |||||
} | } | ||||
//open, close, attach and detach------------------------------------------------------ | //open, close, attach and detach------------------------------------------------------ | ||||
int JackNetDriver::Close() | int JackNetDriver::Close() | ||||
{ | { | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
@@ -473,7 +473,7 @@ namespace Jack | |||||
{ | { | ||||
return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); | return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); | ||||
} | } | ||||
int JackNetDriver::Read() | int JackNetDriver::Read() | ||||
{ | { | ||||
//buffers | //buffers | ||||
@@ -587,7 +587,7 @@ namespace Jack | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("net", "netjack slave backend component", &filler); | |||||
desc = jack_driver_descriptor_construct("net", JackDriverMaster, "netjack slave backend component", &filler); | |||||
strcpy(value.str, DEFAULT_MULTICAST_IP); | strcpy(value.str, DEFAULT_MULTICAST_IP); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | ||||
@@ -843,7 +843,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("netmanager", "netjack multi-cast master component", &filler); | |||||
desc = jack_driver_descriptor_construct("netmanager", JackDriverNone, "netjack multi-cast master component", &filler); | |||||
strcpy(value.str, DEFAULT_MULTICAST_IP); | strcpy(value.str, DEFAULT_MULTICAST_IP); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); | ||||
@@ -251,12 +251,12 @@ bool JackNetOneDriver::Initialize() | |||||
//jack ports and buffers-------------------------------------------------------------- | //jack ports and buffers-------------------------------------------------------------- | ||||
//driver processes-------------------------------------------------------------------- | //driver processes-------------------------------------------------------------------- | ||||
int JackNetOneDriver::Process() | int JackNetOneDriver::Process() | ||||
{ | { | ||||
return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); | return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); | ||||
} | } | ||||
int JackNetOneDriver::Read() | int JackNetOneDriver::Read() | ||||
{ | { | ||||
int delay; | int delay; | ||||
@@ -764,7 +764,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("netone", "netjack one slave backend component", &filler); | |||||
desc = jack_driver_descriptor_construct("netone", JackDriverMaster, "netjack one slave backend component", &filler); | |||||
value.ui = 2U; | value.ui = 2U; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "audio-ins", 'i', JackDriverParamUInt, &value, NULL, "Number of capture channels (defaults to 2)", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "audio-ins", 'i', JackDriverParamUInt, &value, NULL, "Number of capture channels (defaults to 2)", NULL); | ||||
@@ -51,6 +51,14 @@ typedef enum | |||||
JackDriverParamBool | JackDriverParamBool | ||||
} jack_driver_param_type_t; | } jack_driver_param_type_t; | ||||
/** Driver types */ | |||||
typedef enum | |||||
{ | |||||
JackDriverMaster = 1, | |||||
JackDriverSlave, | |||||
JackDriverNone, | |||||
} jack_driver_type_t; | |||||
/** Driver parameter value */ | /** Driver parameter value */ | ||||
typedef union | typedef union | ||||
{ | { | ||||
@@ -103,6 +111,7 @@ jack_driver_param_t; | |||||
/** A struct for describing a jack driver */ | /** A struct for describing a jack driver */ | ||||
typedef struct { | typedef struct { | ||||
char name[JACK_DRIVER_NAME_MAX + 1]; /**< The driver's canonical name */ | char name[JACK_DRIVER_NAME_MAX + 1]; /**< The driver's canonical name */ | ||||
jack_driver_type_t type; /**< The driver's type */ | |||||
char desc[JACK_DRIVER_PARAM_DESC + 1]; /**< The driver's extended description */ | char desc[JACK_DRIVER_PARAM_DESC + 1]; /**< The driver's extended description */ | ||||
char file[JACK_PATH_MAX + 1]; /**< The filename of the driver's shared object file */ | char file[JACK_PATH_MAX + 1]; /**< The filename of the driver's shared object file */ | ||||
uint32_t nparams; /**< The number of parameters the driver has */ | uint32_t nparams; /**< The number of parameters the driver has */ | ||||
@@ -120,6 +129,7 @@ SERVER_EXPORT int jack_parse_driver_params(jack_driver_desc_t * desc, int argc, | |||||
SERVER_EXPORT jack_driver_desc_t * /* newlly allocated driver descriptor, NULL on failure */ | SERVER_EXPORT jack_driver_desc_t * /* newlly allocated driver descriptor, NULL on failure */ | ||||
jack_driver_descriptor_construct( | jack_driver_descriptor_construct( | ||||
const char * name, /* driver name */ | const char * name, /* driver name */ | ||||
jack_driver_type_t type, /* driver type */ | |||||
const char * description, /* driver description */ | const char * description, /* driver description */ | ||||
jack_driver_desc_filler_t * filler); /* Pointer to stack var to be supplied to jack_driver_descriptor_add_parameter() as well. | jack_driver_desc_filler_t * filler); /* Pointer to stack var to be supplied to jack_driver_descriptor_add_parameter() as well. | ||||
Can be NULL for drivers that have no parameters. */ | Can be NULL for drivers that have no parameters. */ | ||||
@@ -45,6 +45,13 @@ typedef enum | |||||
JackParamBool, /**< @brief value type is a boolean */ | JackParamBool, /**< @brief value type is a boolean */ | ||||
} jackctl_param_type_t; | } jackctl_param_type_t; | ||||
/** Driver types */ | |||||
typedef enum | |||||
{ | |||||
JackMaster = 1, /**< @brief master driver */ | |||||
JackSlave /**< @brief slave driver */ | |||||
} jackctl_driver_type_t; | |||||
/** @brief Max value that jackctl_param_type_t type can have */ | /** @brief Max value that jackctl_param_type_t type can have */ | ||||
#define JACK_PARAM_MAX (JackParamBool + 1) | #define JACK_PARAM_MAX (JackParamBool + 1) | ||||
@@ -298,6 +305,18 @@ const char * | |||||
jackctl_driver_get_name( | jackctl_driver_get_name( | ||||
jackctl_driver_t * driver); | jackctl_driver_t * driver); | ||||
/** | |||||
* Call this function to get type of driver. | |||||
* | |||||
* @param driver driver object handle to get name of | |||||
* | |||||
* @return driver type. Must not be modified. Always same for same | |||||
* driver object. | |||||
*/ | |||||
jackctl_driver_type_t | |||||
jackctl_driver_get_type( | |||||
jackctl_driver_t * driver); | |||||
/** | /** | ||||
* Call this function to get list of driver parameters. List node data | * Call this function to get list of driver parameters. List node data | ||||
* pointers is a parameter object handle (::jackctl_parameter_t). | * pointers is a parameter object handle (::jackctl_parameter_t). | ||||
@@ -191,7 +191,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); | |||||
desc = jack_driver_descriptor_construct("audioadapter", JackDriverNone, "netjack audio <==> net backend adapter", &filler); | |||||
strcpy(value.str, "none"); | strcpy(value.str, "none"); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); | ||||
@@ -729,7 +729,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("alsa", "Linux ALSA API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("alsa", JackDriverMaster, "Linux ALSA API based audio backend", &filler); | |||||
strcpy(value.str, "none"); | strcpy(value.str, "none"); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); | ||||
@@ -632,7 +632,7 @@ extern "C" { | |||||
// sizes. I don't think MIDI drivers can accept parameters right | // sizes. I don't think MIDI drivers can accept parameters right | ||||
// now without being set as the main driver. | // now without being set as the main driver. | ||||
return jack_driver_descriptor_construct("alsarawmidi", "Alternative ALSA raw MIDI backend.", NULL); | |||||
return jack_driver_descriptor_construct("alsarawmidi", JackDriverSlave, "Alternative ALSA raw MIDI backend.", NULL); | |||||
} | } | ||||
SERVER_EXPORT Jack::JackDriverClientInterface * | SERVER_EXPORT Jack::JackDriverClientInterface * | ||||
@@ -527,7 +527,7 @@ int JackFFADODriver::Attach() | |||||
if (fEngine->PortRegister(fClientControl.fRefNum, buf, | if (fEngine->PortRegister(fClientControl.fRefNum, buf, | ||||
JACK_DEFAULT_MIDI_TYPE, | JACK_DEFAULT_MIDI_TYPE, | ||||
PlaybackDriverFlags, | PlaybackDriverFlags, | ||||
fEngineControl->fBufferSize, &port_index) < 0) { | |||||
fEngineControl->fBufferSize, &port_index) < 0) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -755,7 +755,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("firewire", "Linux FFADO API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("firewire", JackDriverMaster, "Linux FFADO API based audio backend", &filler); | |||||
strcpy(value.str, "hw:0"); | strcpy(value.str, "hw:0"); | ||||
jack_driver_descriptor_add_parameter( | jack_driver_descriptor_add_parameter( | ||||
@@ -956,7 +956,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("freebob", "Linux FreeBob API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("freebob", JackDriverMaster, "Linux FreeBob API based audio backend", &filler); | |||||
strcpy(value.str, "hw:0"); | strcpy(value.str, "hw:0"); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "The FireWire device to use. Format is: 'hw:port[,node]'.", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "The FireWire device to use. Format is: 'hw:port[,node]'.", NULL); | ||||
@@ -1798,6 +1798,8 @@ | |||||
4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; | 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; | 4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; | 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BB21C6D1407E16400287B3C /* JackWinMMEDriver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackWinMMEDriver.cpp; path = ../windows/winmme/JackWinMMEDriver.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4BB21C6E1407E16400287B3C /* JackWinMMEDriver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackWinMMEDriver.h; path = ../windows/winmme/JackWinMMEDriver.h; sourceTree = SOURCE_ROOT; }; | |||||
4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | ||||
4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackEngineProfiling.h; path = ../common/JackEngineProfiling.h; sourceTree = SOURCE_ROOT; }; | 4BBAE40E0F42FA6100B8BD3F /* JackEngineProfiling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JackEngineProfiling.h; path = ../common/JackEngineProfiling.h; sourceTree = SOURCE_ROOT; }; | ||||
4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineProfiling.cpp; path = ../common/JackEngineProfiling.cpp; sourceTree = SOURCE_ROOT; }; | 4BBAE40F0F42FA6100B8BD3F /* JackEngineProfiling.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = JackEngineProfiling.cpp; path = ../common/JackEngineProfiling.cpp; sourceTree = SOURCE_ROOT; }; | ||||
@@ -2850,6 +2852,8 @@ | |||||
4B05A08A0DF72BF600840F4C /* Windows */ = { | 4B05A08A0DF72BF600840F4C /* Windows */ = { | ||||
isa = PBXGroup; | isa = PBXGroup; | ||||
children = ( | children = ( | ||||
4BB21C6D1407E16400287B3C /* JackWinMMEDriver.cpp */, | |||||
4BB21C6E1407E16400287B3C /* JackWinMMEDriver.h */, | |||||
4B05A08B0DF72C3200840F4C /* JackWinEvent.cpp */, | 4B05A08B0DF72C3200840F4C /* JackWinEvent.cpp */, | ||||
4B05A08C0DF72C3200840F4C /* JackWinEvent.h */, | 4B05A08C0DF72C3200840F4C /* JackWinEvent.h */, | ||||
4B05A08D0DF72C3200840F4C /* JackWinNamedPipe.cpp */, | 4B05A08D0DF72C3200840F4C /* JackWinNamedPipe.cpp */, | ||||
@@ -1509,7 +1509,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); | |||||
desc = jack_driver_descriptor_construct("audioadapter", JackDriverNone, "netjack audio <==> net backend adapter", &filler); | |||||
value.i = -1; | value.i = -1; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); | jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); | ||||
@@ -2059,7 +2059,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("coreaudio", "Apple CoreAudio API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("coreaudio", JackDriverMaster, "Apple CoreAudio API based audio backend", &filler); | |||||
value.i = -1; | value.i = -1; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); | jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of channels", "Maximum number of channels. If -1, max possible number of channels will be used"); | ||||
@@ -638,7 +638,7 @@ extern "C" { | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("coremidi", "Apple CoreMIDI API based MIDI backend", &filler); | |||||
desc = jack_driver_descriptor_construct("coremidi", JackDriverSlave, "Apple CoreMIDI API based MIDI backend", &filler); | |||||
value.ui = 0; | value.ui = 0; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); | ||||
@@ -821,7 +821,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("boomer", "Boomer/OSS API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("boomer", JackDriverMaster, "Boomer/OSS API based audio backend", &filler); | |||||
value.ui = OSS_DRIVER_DEF_FS; | value.ui = OSS_DRIVER_DEF_FS; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | ||||
@@ -73,12 +73,12 @@ static inline void CopyAndConvertOut(void *dst, jack_sample_t *src, size_t nfram | |||||
s32dst += channel; | s32dst += channel; | ||||
sample_move_d24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); // No dithering for now... | sample_move_d24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); // No dithering for now... | ||||
break; | break; | ||||
} | |||||
} | |||||
case 32: { | case 32: { | ||||
signed int *s32dst = (signed int*)dst; | signed int *s32dst = (signed int*)dst; | ||||
s32dst += channel; | s32dst += channel; | ||||
sample_move_d32u24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); | sample_move_d32u24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); | ||||
break; | |||||
break; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -92,7 +92,7 @@ void JackOSSAdapter::SetSampleFormat() | |||||
fSampleSize = sizeof(int); | fSampleSize = sizeof(int); | ||||
break; | break; | ||||
case 32: /* native-endian 32-bit integer */ | case 32: /* native-endian 32-bit integer */ | ||||
fSampleFormat = AFMT_S32_NE; | |||||
fSampleFormat = AFMT_S32_NE; | |||||
fSampleSize = sizeof(int); | fSampleSize = sizeof(int); | ||||
break; | break; | ||||
case 16: /* native-endian 16-bit integer */ | case 16: /* native-endian 16-bit integer */ | ||||
@@ -105,30 +105,30 @@ void JackOSSAdapter::SetSampleFormat() | |||||
JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | ||||
:JackAudioAdapterInterface(buffer_size, sample_rate) | :JackAudioAdapterInterface(buffer_size, sample_rate) | ||||
,fThread(this), | |||||
fInFD(-1), fOutFD(-1), fBits(OSS_DRIVER_DEF_BITS), | |||||
,fThread(this), | |||||
fInFD(-1), fOutFD(-1), fBits(OSS_DRIVER_DEF_BITS), | |||||
fSampleFormat(0), fNperiods(OSS_DRIVER_DEF_NPERIODS), fRWMode(0), fIgnoreHW(true), fExcl(false), | fSampleFormat(0), fNperiods(OSS_DRIVER_DEF_NPERIODS), fRWMode(0), fIgnoreHW(true), fExcl(false), | ||||
fInputBufferSize(0), fOutputBufferSize(0), | fInputBufferSize(0), fOutputBufferSize(0), | ||||
fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true) | fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true) | ||||
{ | { | ||||
const JSList* node; | const JSList* node; | ||||
const jack_driver_param_t* param; | const jack_driver_param_t* param; | ||||
fCaptureChannels = 2; | fCaptureChannels = 2; | ||||
fPlaybackChannels = 2; | fPlaybackChannels = 2; | ||||
strcpy(fCaptureDriverName, OSS_DRIVER_DEF_DEV); | strcpy(fCaptureDriverName, OSS_DRIVER_DEF_DEV); | ||||
strcpy(fPlaybackDriverName, OSS_DRIVER_DEF_DEV); | strcpy(fPlaybackDriverName, OSS_DRIVER_DEF_DEV); | ||||
for (node = params; node; node = jack_slist_next(node)) { | for (node = params; node; node = jack_slist_next(node)) { | ||||
param = (const jack_driver_param_t*) node->data; | param = (const jack_driver_param_t*) node->data; | ||||
switch (param->character) { | switch (param->character) { | ||||
case 'r': | case 'r': | ||||
SetAdaptedSampleRate(param->value.ui); | SetAdaptedSampleRate(param->value.ui); | ||||
break; | break; | ||||
case 'p': | case 'p': | ||||
SetAdaptedBufferSize(param->value.ui); | SetAdaptedBufferSize(param->value.ui); | ||||
break; | break; | ||||
@@ -136,15 +136,15 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample | |||||
case 'n': | case 'n': | ||||
fNperiods = param->value.ui; | fNperiods = param->value.ui; | ||||
break; | break; | ||||
case 'w': | case 'w': | ||||
fBits = param->value.i; | fBits = param->value.i; | ||||
break; | break; | ||||
case 'i': | case 'i': | ||||
fCaptureChannels = param->value.ui; | fCaptureChannels = param->value.ui; | ||||
break; | break; | ||||
case 'o': | case 'o': | ||||
fPlaybackChannels = param->value.ui; | fPlaybackChannels = param->value.ui; | ||||
break; | break; | ||||
@@ -152,21 +152,21 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample | |||||
case 'e': | case 'e': | ||||
fExcl = true; | fExcl = true; | ||||
break; | break; | ||||
case 'C': | case 'C': | ||||
fRWMode |= kRead; | fRWMode |= kRead; | ||||
if (strcmp(param->value.str, "none") != 0) { | if (strcmp(param->value.str, "none") != 0) { | ||||
strcpy(fCaptureDriverName, param->value.str); | strcpy(fCaptureDriverName, param->value.str); | ||||
} | } | ||||
break; | break; | ||||
case 'P': | case 'P': | ||||
fRWMode |= kWrite; | fRWMode |= kWrite; | ||||
if (strcmp(param->value.str, "none") != 0) { | if (strcmp(param->value.str, "none") != 0) { | ||||
strcpy(fPlaybackDriverName, param->value.str); | strcpy(fPlaybackDriverName, param->value.str); | ||||
} | } | ||||
break; | break; | ||||
case 'd': | case 'd': | ||||
fRWMode |= kRead; | fRWMode |= kRead; | ||||
fRWMode |= kWrite; | fRWMode |= kWrite; | ||||
@@ -177,11 +177,11 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample | |||||
case 'b': | case 'b': | ||||
fIgnoreHW = true; | fIgnoreHW = true; | ||||
break; | break; | ||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
break; | break; | ||||
case 'g': | case 'g': | ||||
fRingbufferCurSize = param->value.ui; | fRingbufferCurSize = param->value.ui; | ||||
fAdaptative = false; | fAdaptative = false; | ||||
@@ -200,14 +200,14 @@ void JackOSSAdapter::DisplayDeviceInfo() | |||||
oss_audioinfo ai_in, ai_out; | oss_audioinfo ai_in, ai_out; | ||||
memset(&info, 0, sizeof(audio_buf_info)); | memset(&info, 0, sizeof(audio_buf_info)); | ||||
int cap = 0; | int cap = 0; | ||||
// Duplex cards : http://manuals.opensound.com/developer/full_duplex.html | // Duplex cards : http://manuals.opensound.com/developer/full_duplex.html | ||||
jack_info("Audio Interface Description :"); | jack_info("Audio Interface Description :"); | ||||
jack_info("Sampling Frequency : %d, Sample Format : %d, Mode : %d", fAdaptedSampleRate, fSampleFormat, fRWMode); | jack_info("Sampling Frequency : %d, Sample Format : %d, Mode : %d", fAdaptedSampleRate, fSampleFormat, fRWMode); | ||||
if (fRWMode & kWrite) { | if (fRWMode & kWrite) { | ||||
oss_sysinfo si; | oss_sysinfo si; | ||||
if (ioctl(fOutFD, OSS_SYSINFO, &si) == -1) { | if (ioctl(fOutFD, OSS_SYSINFO, &si) == -1) { | ||||
jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
@@ -219,17 +219,17 @@ void JackOSSAdapter::DisplayDeviceInfo() | |||||
jack_info("OSS numaudioengines %d", si.numaudioengines); | jack_info("OSS numaudioengines %d", si.numaudioengines); | ||||
jack_info("OSS numcards %d", si.numcards); | jack_info("OSS numcards %d", si.numcards); | ||||
} | } | ||||
jack_info("Output capabilities - %d channels : ", fPlaybackChannels); | jack_info("Output capabilities - %d channels : ", fPlaybackChannels); | ||||
jack_info("Output block size = %d", fOutputBufferSize); | jack_info("Output block size = %d", fOutputBufferSize); | ||||
if (ioctl(fOutFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | ||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
} else { | } else { | ||||
jack_info("output space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
jack_info("output space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
info.fragments, info.fragstotal, info.fragsize, info.bytes); | info.fragments, info.fragstotal, info.fragsize, info.bytes); | ||||
} | } | ||||
if (ioctl(fOutFD, SNDCTL_DSP_GETCAPS, &cap) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_GETCAPS, &cap) == -1) { | ||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETCAPS failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETCAPS failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
} else { | } else { | ||||
@@ -242,10 +242,10 @@ void JackOSSAdapter::DisplayDeviceInfo() | |||||
if (cap & DSP_CAP_MULTI) jack_info(" DSP_CAP_MULTI"); | if (cap & DSP_CAP_MULTI) jack_info(" DSP_CAP_MULTI"); | ||||
if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | ||||
} | } | ||||
} | |||||
} | |||||
if (fRWMode & kRead) { | if (fRWMode & kRead) { | ||||
oss_sysinfo si; | oss_sysinfo si; | ||||
if (ioctl(fInFD, OSS_SYSINFO, &si) == -1) { | if (ioctl(fInFD, OSS_SYSINFO, &si) == -1) { | ||||
jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::DisplayDeviceInfo OSS_SYSINFO failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
@@ -257,14 +257,14 @@ void JackOSSAdapter::DisplayDeviceInfo() | |||||
jack_info("OSS numaudioengines %d", si.numaudioengines); | jack_info("OSS numaudioengines %d", si.numaudioengines); | ||||
jack_info("OSS numcards %d", si.numcards); | jack_info("OSS numcards %d", si.numcards); | ||||
} | } | ||||
jack_info("Input capabilities - %d channels : ", fCaptureChannels); | jack_info("Input capabilities - %d channels : ", fCaptureChannels); | ||||
jack_info("Input block size = %d", fInputBufferSize); | jack_info("Input block size = %d", fInputBufferSize); | ||||
if (ioctl(fInFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | |||||
if (ioctl(fInFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { | |||||
jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
} else { | } else { | ||||
jack_info("input space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
jack_info("input space info: fragments = %d, fragstotal = %d, fragsize = %d, bytes = %d", | |||||
info.fragments, info.fragstotal, info.fragsize, info.bytes); | info.fragments, info.fragstotal, info.fragsize, info.bytes); | ||||
} | } | ||||
@@ -281,15 +281,15 @@ void JackOSSAdapter::DisplayDeviceInfo() | |||||
if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); | ||||
} | } | ||||
} | } | ||||
if (ioctl(fInFD, SNDCTL_AUDIOINFO, &ai_in) != -1) { | if (ioctl(fInFD, SNDCTL_AUDIOINFO, &ai_in) != -1) { | ||||
jack_info("Using audio engine %d = %s for input", ai_in.dev, ai_in.name); | jack_info("Using audio engine %d = %s for input", ai_in.dev, ai_in.name); | ||||
} | } | ||||
if (ioctl(fOutFD, SNDCTL_AUDIOINFO, &ai_out) != -1) { | if (ioctl(fOutFD, SNDCTL_AUDIOINFO, &ai_out) != -1) { | ||||
jack_info("Using audio engine %d = %s for output", ai_out.dev, ai_out.name); | jack_info("Using audio engine %d = %s for output", ai_out.dev, ai_out.name); | ||||
} | } | ||||
if (ai_in.rate_source != ai_out.rate_source) { | if (ai_in.rate_source != ai_out.rate_source) { | ||||
jack_info("Warning : input and output are not necessarily driven by the same clock!"); | jack_info("Warning : input and output are not necessarily driven by the same clock!"); | ||||
} | } | ||||
@@ -301,9 +301,9 @@ int JackOSSAdapter::OpenInput() | |||||
int gFragFormat; | int gFragFormat; | ||||
int cur_sample_format, cur_capture_channels; | int cur_sample_format, cur_capture_channels; | ||||
jack_nframes_t cur_sample_rate; | jack_nframes_t cur_sample_rate; | ||||
if (fCaptureChannels == 0) fCaptureChannels = 2; | if (fCaptureChannels == 0) fCaptureChannels = 2; | ||||
if ((fInFD = open(fCaptureDriverName, O_RDONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | if ((fInFD = open(fCaptureDriverName, O_RDONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | ||||
jack_error("JackOSSAdapter::OpenInput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenInput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
return -1; | return -1; | ||||
@@ -316,7 +316,7 @@ int JackOSSAdapter::OpenInput() | |||||
} | } | ||||
} | } | ||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fCaptureChannels); | |||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fCaptureChannels); | |||||
if (ioctl(fInFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | if (ioctl(fInFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | ||||
jack_error("JackOSSAdapter::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
goto error; | goto error; | ||||
@@ -330,7 +330,7 @@ int JackOSSAdapter::OpenInput() | |||||
if (cur_sample_format != fSampleFormat) { | if (cur_sample_format != fSampleFormat) { | ||||
jack_info("JackOSSAdapter::OpenInput driver forced the sample format %ld", fSampleFormat); | jack_info("JackOSSAdapter::OpenInput driver forced the sample format %ld", fSampleFormat); | ||||
} | } | ||||
cur_capture_channels = fCaptureChannels; | cur_capture_channels = fCaptureChannels; | ||||
if (ioctl(fInFD, SNDCTL_DSP_CHANNELS, &fCaptureChannels) == -1) { | if (ioctl(fInFD, SNDCTL_DSP_CHANNELS, &fCaptureChannels) == -1) { | ||||
jack_error("JackOSSAdapter::OpenInput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenInput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
@@ -339,7 +339,7 @@ int JackOSSAdapter::OpenInput() | |||||
if (cur_capture_channels != fCaptureChannels) { | if (cur_capture_channels != fCaptureChannels) { | ||||
jack_info("JackOSSAdapter::OpenInput driver forced the number of capture channels %ld", fCaptureChannels); | jack_info("JackOSSAdapter::OpenInput driver forced the number of capture channels %ld", fCaptureChannels); | ||||
} | } | ||||
cur_sample_rate = fAdaptedSampleRate; | cur_sample_rate = fAdaptedSampleRate; | ||||
if (ioctl(fInFD, SNDCTL_DSP_SPEED, &fAdaptedSampleRate) == -1) { | if (ioctl(fInFD, SNDCTL_DSP_SPEED, &fAdaptedSampleRate) == -1) { | ||||
jack_error("JackOSSAdapter::OpenInput failed to set sample rate : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenInput failed to set sample rate : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
@@ -354,7 +354,7 @@ int JackOSSAdapter::OpenInput() | |||||
jack_error("JackOSSAdapter::OpenInput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenInput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
goto error; | goto error; | ||||
} | } | ||||
if (fInputBufferSize != fAdaptedBufferSize * fSampleSize * fCaptureChannels) { | if (fInputBufferSize != fAdaptedBufferSize * fSampleSize * fCaptureChannels) { | ||||
if (fIgnoreHW) { | if (fIgnoreHW) { | ||||
jack_info("JackOSSAdapter::OpenInput driver forced buffer size %ld", fOutputBufferSize); | jack_info("JackOSSAdapter::OpenInput driver forced buffer size %ld", fOutputBufferSize); | ||||
@@ -366,16 +366,16 @@ int JackOSSAdapter::OpenInput() | |||||
fInputBuffer = (void*)calloc(fInputBufferSize, 1); | fInputBuffer = (void*)calloc(fInputBufferSize, 1); | ||||
assert(fInputBuffer); | assert(fInputBuffer); | ||||
fInputSampleBuffer = (float**)malloc(fCaptureChannels * sizeof(float*)); | fInputSampleBuffer = (float**)malloc(fCaptureChannels * sizeof(float*)); | ||||
assert(fInputSampleBuffer); | assert(fInputSampleBuffer); | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
fInputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | fInputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | ||||
assert(fInputSampleBuffer[i]); | assert(fInputSampleBuffer[i]); | ||||
} | } | ||||
return 0; | return 0; | ||||
error: | error: | ||||
::close(fInFD); | ::close(fInFD); | ||||
return -1; | return -1; | ||||
@@ -387,22 +387,22 @@ int JackOSSAdapter::OpenOutput() | |||||
int gFragFormat; | int gFragFormat; | ||||
int cur_sample_format, cur_playback_channels; | int cur_sample_format, cur_playback_channels; | ||||
jack_nframes_t cur_sample_rate; | jack_nframes_t cur_sample_rate; | ||||
if (fPlaybackChannels == 0) fPlaybackChannels = 2; | if (fPlaybackChannels == 0) fPlaybackChannels = 2; | ||||
if ((fOutFD = open(fPlaybackDriverName, O_WRONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | if ((fOutFD = open(fPlaybackDriverName, O_WRONLY | ((fExcl) ? O_EXCL : 0))) < 0) { | ||||
jack_error("JackOSSAdapter::OpenOutput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenOutput failed to open device : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
return -1; | return -1; | ||||
} | } | ||||
if (fExcl) { | if (fExcl) { | ||||
if (ioctl(fOutFD, SNDCTL_DSP_COOKEDMODE, &flags) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_COOKEDMODE, &flags) == -1) { | ||||
jack_error("JackOSSAdapter::OpenOutput failed to set cooked mode : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenOutput failed to set cooked mode : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
goto error; | goto error; | ||||
} | |||||
} | |||||
} | |||||
} | |||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fPlaybackChannels); | |||||
gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fPlaybackChannels); | |||||
if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { | ||||
jack_error("JackOSSAdapter::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
goto error; | goto error; | ||||
@@ -416,7 +416,7 @@ int JackOSSAdapter::OpenOutput() | |||||
if (cur_sample_format != fSampleFormat) { | if (cur_sample_format != fSampleFormat) { | ||||
jack_info("JackOSSAdapter::OpenOutput driver forced the sample format %ld", fSampleFormat); | jack_info("JackOSSAdapter::OpenOutput driver forced the sample format %ld", fSampleFormat); | ||||
} | } | ||||
cur_playback_channels = fPlaybackChannels; | cur_playback_channels = fPlaybackChannels; | ||||
if (ioctl(fOutFD, SNDCTL_DSP_CHANNELS, &fPlaybackChannels) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_CHANNELS, &fPlaybackChannels) == -1) { | ||||
jack_error("JackOSSAdapter::OpenOutput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenOutput failed to set channels : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
@@ -440,7 +440,7 @@ int JackOSSAdapter::OpenOutput() | |||||
jack_error("JackOSSAdapter::OpenOutput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSAdapter::OpenOutput failed to get fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
goto error; | goto error; | ||||
} | } | ||||
if (fOutputBufferSize != fAdaptedBufferSize * fSampleSize * fPlaybackChannels) { | if (fOutputBufferSize != fAdaptedBufferSize * fSampleSize * fPlaybackChannels) { | ||||
if (fIgnoreHW) { | if (fIgnoreHW) { | ||||
jack_info("JackOSSAdapter::OpenOutput driver forced buffer size %ld", fOutputBufferSize); | jack_info("JackOSSAdapter::OpenOutput driver forced buffer size %ld", fOutputBufferSize); | ||||
@@ -452,18 +452,18 @@ int JackOSSAdapter::OpenOutput() | |||||
fOutputBuffer = (void*)calloc(fOutputBufferSize, 1); | fOutputBuffer = (void*)calloc(fOutputBufferSize, 1); | ||||
assert(fOutputBuffer); | assert(fOutputBuffer); | ||||
fOutputSampleBuffer = (float**)malloc(fPlaybackChannels * sizeof(float*)); | fOutputSampleBuffer = (float**)malloc(fPlaybackChannels * sizeof(float*)); | ||||
assert(fOutputSampleBuffer); | assert(fOutputSampleBuffer); | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
fOutputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | fOutputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); | ||||
assert(fOutputSampleBuffer[i]); | assert(fOutputSampleBuffer[i]); | ||||
} | } | ||||
fFirstCycle = true; | fFirstCycle = true; | ||||
return 0; | return 0; | ||||
error: | error: | ||||
::close(fOutFD); | ::close(fOutFD); | ||||
return -1; | return -1; | ||||
@@ -472,46 +472,46 @@ error: | |||||
int JackOSSAdapter::Open() | int JackOSSAdapter::Open() | ||||
{ | { | ||||
SetSampleFormat(); | SetSampleFormat(); | ||||
if ((fRWMode & kRead) && (OpenInput() < 0)) { | if ((fRWMode & kRead) && (OpenInput() < 0)) { | ||||
return -1; | return -1; | ||||
} | } | ||||
if ((fRWMode & kWrite) && (OpenOutput() < 0)) { | |||||
if ((fRWMode & kWrite) && (OpenOutput() < 0)) { | |||||
return -1; | return -1; | ||||
} | } | ||||
// In duplex mode, check that input and output use the same buffer size | // In duplex mode, check that input and output use the same buffer size | ||||
if ((fRWMode & kRead) && (fRWMode & kWrite) && (fInputBufferSize != fOutputBufferSize)) { | if ((fRWMode & kRead) && (fRWMode & kWrite) && (fInputBufferSize != fOutputBufferSize)) { | ||||
jack_error("JackOSSAdapter::OpenAux input and output buffer size are not the same!!"); | jack_error("JackOSSAdapter::OpenAux input and output buffer size are not the same!!"); | ||||
goto error; | goto error; | ||||
} | } | ||||
DisplayDeviceInfo(); | |||||
DisplayDeviceInfo(); | |||||
//start adapter thread | //start adapter thread | ||||
if (fThread.StartSync() < 0) { | if (fThread.StartSync() < 0) { | ||||
jack_error ( "Cannot start audioadapter thread" ); | jack_error ( "Cannot start audioadapter thread" ); | ||||
return -1; | return -1; | ||||
} | } | ||||
//turn the thread realtime | //turn the thread realtime | ||||
fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority); | fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority); | ||||
return 0; | return 0; | ||||
error: | error: | ||||
CloseAux(); | CloseAux(); | ||||
return -1; | return -1; | ||||
} | } | ||||
int JackOSSAdapter::Close() | int JackOSSAdapter::Close() | ||||
{ | { | ||||
#ifdef JACK_MONITOR | #ifdef JACK_MONITOR | ||||
fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); | fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); | ||||
#endif | #endif | ||||
fThread.Stop(); | fThread.Stop(); | ||||
CloseAux(); | |||||
CloseAux(); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -521,23 +521,23 @@ void JackOSSAdapter::CloseAux() | |||||
close(fInFD); | close(fInFD); | ||||
fInFD = -1; | fInFD = -1; | ||||
} | } | ||||
if (fRWMode & kWrite) { | if (fRWMode & kWrite) { | ||||
close(fOutFD); | close(fOutFD); | ||||
fOutFD = -1; | fOutFD = -1; | ||||
} | } | ||||
free(fInputBuffer); | free(fInputBuffer); | ||||
fInputBuffer = NULL; | fInputBuffer = NULL; | ||||
free(fOutputBuffer); | free(fOutputBuffer); | ||||
fOutputBuffer = NULL; | fOutputBuffer = NULL; | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
free(fInputSampleBuffer[i]); | free(fInputSampleBuffer[i]); | ||||
} | } | ||||
free(fInputSampleBuffer); | free(fInputSampleBuffer); | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
free(fOutputSampleBuffer[i]); | free(fOutputSampleBuffer[i]); | ||||
} | } | ||||
@@ -547,13 +547,13 @@ void JackOSSAdapter::CloseAux() | |||||
int JackOSSAdapter::Read() | int JackOSSAdapter::Read() | ||||
{ | { | ||||
ssize_t count = ::read(fInFD, fInputBuffer, fInputBufferSize); | ssize_t count = ::read(fInFD, fInputBuffer, fInputBufferSize); | ||||
if (count < fInputBufferSize) { | if (count < fInputBufferSize) { | ||||
jack_error("JackOSSAdapter::Read error bytes read = %ld", count); | jack_error("JackOSSAdapter::Read error bytes read = %ld", count); | ||||
return -1; | return -1; | ||||
} else { | } else { | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
CopyAndConvertIn(fInputSampleBuffer[i], fInputBuffer, fAdaptedBufferSize, i, fCaptureChannels, fBits); | |||||
CopyAndConvertIn(fInputSampleBuffer[i], fInputBuffer, fAdaptedBufferSize, i, fCaptureChannels, fBits); | |||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -562,10 +562,10 @@ int JackOSSAdapter::Read() | |||||
int JackOSSAdapter::Write() | int JackOSSAdapter::Write() | ||||
{ | { | ||||
ssize_t count; | ssize_t count; | ||||
// Maybe necessay to write an empty output buffer first time : see http://manuals.opensound.com/developer/fulldup.c.html | // Maybe necessay to write an empty output buffer first time : see http://manuals.opensound.com/developer/fulldup.c.html | ||||
if (fFirstCycle) { | if (fFirstCycle) { | ||||
fFirstCycle = false; | fFirstCycle = false; | ||||
memset(fOutputBuffer, 0, fOutputBufferSize); | memset(fOutputBuffer, 0, fOutputBufferSize); | ||||
@@ -577,23 +577,23 @@ int JackOSSAdapter::Write() | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
int delay; | int delay; | ||||
if (ioctl(fOutFD, SNDCTL_DSP_GETODELAY, &delay) == -1) { | if (ioctl(fOutFD, SNDCTL_DSP_GETODELAY, &delay) == -1) { | ||||
jack_error("JackOSSDriver::Write error get out delay : %s@%i, errno = %d", __FILE__, __LINE__, errno); | jack_error("JackOSSDriver::Write error get out delay : %s@%i, errno = %d", __FILE__, __LINE__, errno); | ||||
return -1; | return -1; | ||||
} | } | ||||
delay /= fSampleSize * fPlaybackChannels; | delay /= fSampleSize * fPlaybackChannels; | ||||
jack_info("JackOSSDriver::Write output latency frames = %ld", delay); | jack_info("JackOSSDriver::Write output latency frames = %ld", delay); | ||||
} | } | ||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
CopyAndConvertOut(fOutputBuffer, fOutputSampleBuffer[i], fAdaptedBufferSize, i, fCaptureChannels, fBits); | CopyAndConvertOut(fOutputBuffer, fOutputSampleBuffer[i], fAdaptedBufferSize, i, fCaptureChannels, fBits); | ||||
} | } | ||||
count = ::write(fOutFD, fOutputBuffer, fOutputBufferSize); | count = ::write(fOutFD, fOutputBuffer, fOutputBufferSize); | ||||
if (count < fOutputBufferSize) { | if (count < fOutputBufferSize) { | ||||
jack_error("JackOSSAdapter::Write error bytes written = %ld", count); | jack_error("JackOSSAdapter::Write error bytes written = %ld", count); | ||||
return -1; | return -1; | ||||
@@ -607,13 +607,13 @@ bool JackOSSAdapter::Execute() | |||||
//read data from audio interface | //read data from audio interface | ||||
if (Read() < 0) | if (Read() < 0) | ||||
return false; | return false; | ||||
PushAndPull(fInputSampleBuffer, fOutputSampleBuffer, fAdaptedBufferSize); | PushAndPull(fInputSampleBuffer, fOutputSampleBuffer, fAdaptedBufferSize); | ||||
//write data to audio interface | //write data to audio interface | ||||
if (Write() < 0) | if (Write() < 0) | ||||
return false; | return false; | ||||
return true; | return true; | ||||
} | } | ||||
@@ -623,7 +623,7 @@ int JackOSSAdapter::SetBufferSize(jack_nframes_t buffer_size) | |||||
Close(); | Close(); | ||||
return Open(); | return Open(); | ||||
} | } | ||||
} // namespace | } // namespace | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
@@ -637,7 +637,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); | |||||
desc = jack_driver_descriptor_construct("audioadapter", JackDriverNone, "netjack audio <==> net backend adapter", &filler); | |||||
value.ui = OSS_DRIVER_DEF_FS; | value.ui = OSS_DRIVER_DEF_FS; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | ||||
@@ -653,7 +653,7 @@ extern "C" | |||||
value.ui = OSS_DRIVER_DEF_INS; | value.ui = OSS_DRIVER_DEF_INS; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); | ||||
value.ui = OSS_DRIVER_DEF_OUTS; | value.ui = OSS_DRIVER_DEF_OUTS; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Playback channels", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "outchannels", 'o', JackDriverParamUInt, &value, NULL, "Playback channels", NULL); | ||||
@@ -664,19 +664,19 @@ extern "C" | |||||
jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input device", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input device", NULL); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); | ||||
value.i = true; | value.i = true; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "ignorehwbuf", 'b', JackDriverParamBool, &value, NULL, "Ignore hardware period size", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "ignorehwbuf", 'b', JackDriverParamBool, &value, NULL, "Ignore hardware period size", NULL); | ||||
value.ui = 0; | value.ui = 0; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); | ||||
value.i = 32768; | value.i = 32768; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); | jack_driver_descriptor_add_parameter(desc, &filler, "ring-buffer", 'g', JackDriverParamInt, &value, NULL, "Fixed ringbuffer size", "Fixed ringbuffer size (if not set => automatic adaptative)"); | ||||
return desc; | return desc; | ||||
} | } | ||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
#endif | #endif | ||||
@@ -738,7 +738,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("oss", "OSS API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("oss", JackDriverMaster, "OSS API based audio backend", &filler); | |||||
value.ui = OSS_DRIVER_DEF_FS; | value.ui = OSS_DRIVER_DEF_FS; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); | ||||
@@ -218,7 +218,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("audioadapter", "netjack audio <==> net backend adapter", &filler); | |||||
desc = jack_driver_descriptor_construct("audioadapter", JackDriverNone, "netjack audio <==> net backend adapter", &filler); | |||||
value.ui = 0; | value.ui = 0; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", NULL); | ||||
@@ -266,7 +266,7 @@ extern "C" | |||||
jack_driver_desc_filler_t filler; | jack_driver_desc_filler_t filler; | ||||
jack_driver_param_value_t value; | jack_driver_param_value_t value; | ||||
desc = jack_driver_descriptor_construct("portaudio", "PortAudio API based audio backend", &filler); | |||||
desc = jack_driver_descriptor_construct("portaudio", JackDriverMaster, "PortAudio API based audio backend", &filler); | |||||
value.ui = 0; | value.ui = 0; | ||||
jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamUInt, &value, NULL, "Maximum number of channels", NULL); | jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamUInt, &value, NULL, "Maximum number of channels", NULL); | ||||
@@ -60,7 +60,7 @@ JackWinMMEDriver::Attach() | |||||
// Inputs | // Inputs | ||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
JackWinMMEInputPort *input_port = input_ports[i]; | JackWinMMEInputPort *input_port = input_ports[i]; | ||||
name = input_port->GetName(); | |||||
name = input_port->GetName(); | |||||
if (fEngine->PortRegister(fClientControl.fRefNum, name, | if (fEngine->PortRegister(fClientControl.fRefNum, name, | ||||
JACK_DEFAULT_MIDI_TYPE, | JACK_DEFAULT_MIDI_TYPE, | ||||
CaptureDriverFlags, buffer_size, &index) < 0) { | CaptureDriverFlags, buffer_size, &index) < 0) { | ||||
@@ -361,7 +361,7 @@ extern "C" | |||||
{ | { | ||||
jack_driver_desc_t * desc; | jack_driver_desc_t * desc; | ||||
return jack_driver_descriptor_construct("winmme", "WinMME API based MIDI backend", NULL); | |||||
return jack_driver_descriptor_construct("winmme", JackDriverSlave, "WinMME API based MIDI backend", NULL); | |||||
} | } | ||||
SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) | SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params) | ||||
@@ -436,3 +436,4 @@ jack_connect system_midi:capture_2 system:midi_playback_1 | |||||
jack_connect system_midi:capture_1 system_midi:playback_1 | jack_connect system_midi:capture_1 system_midi:playback_1 | ||||
*/ | */ | ||||