From 08edac7982c26ccdd5177b53467041f8d6b31057 Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 26 Aug 2011 14:36:40 +0000 Subject: [PATCH] Add jackctl_driver_get_type in Control API. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4529 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 1 + common/JackControlAPI.cpp | 5 + common/JackControlAPI.h | 11 ++ common/JackDriverLoader.cpp | 1 + common/JackDummyDriver.cpp | 6 +- common/JackLoopbackDriver.cpp | 2 +- common/JackNetAdapter.cpp | 2 +- common/JackNetDriver.cpp | 6 +- common/JackNetManager.cpp | 2 +- common/JackNetOneDriver.cpp | 6 +- common/driver_interface.h | 10 ++ common/jack/control.h | 19 +++ linux/alsa/JackAlsaAdapter.cpp | 2 +- linux/alsa/JackAlsaDriver.cpp | 2 +- linux/alsarawmidi/JackALSARawMidiDriver.cpp | 2 +- linux/firewire/JackFFADODriver.cpp | 4 +- linux/freebob/JackFreebobDriver.cpp | 2 +- macosx/Jackdmp.xcodeproj/project.pbxproj | 4 + macosx/coreaudio/JackCoreAudioAdapter.cpp | 2 +- macosx/coreaudio/JackCoreAudioDriver.cpp | 2 +- macosx/coremidi/JackCoreMidiDriver.cpp | 2 +- solaris/oss/JackBoomerDriver.cpp | 2 +- solaris/oss/JackOSSAdapter.cpp | 180 ++++++++++---------- solaris/oss/JackOSSDriver.cpp | 2 +- windows/portaudio/JackPortAudioAdapter.cpp | 2 +- windows/portaudio/JackPortAudioDriver.cpp | 2 +- windows/winmme/JackWinMMEDriver.cpp | 5 +- 27 files changed, 169 insertions(+), 117 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c7b5f63..5d44021f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,6 +40,7 @@ Chris Caudle * More robust code in synchronization primitives and in JackMessageBuffer. * Non blocking notifications in JackEngine::NotifyAddClient and JackEngine::NotifyRemoveClient. * More robust Control API implementation. + * Add jackctl_driver_get_type in Control API. 2011-07-29 Stephane Letz diff --git a/common/JackControlAPI.cpp b/common/JackControlAPI.cpp index abf6b5ed..99ec06b1 100644 --- a/common/JackControlAPI.cpp +++ b/common/JackControlAPI.cpp @@ -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; } +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) { return (driver_ptr) ? driver_ptr->parameters : NULL; diff --git a/common/JackControlAPI.h b/common/JackControlAPI.h index 8011f9ba..0363d24c 100644 --- a/common/JackControlAPI.h +++ b/common/JackControlAPI.h @@ -44,6 +44,13 @@ typedef enum JackParamBool, /**< @brief value type is a boolean */ } 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 */ #define JACK_PARAM_MAX (JackParamBool + 1) @@ -126,6 +133,10 @@ SERVER_EXPORT const char * jackctl_driver_get_name( jackctl_driver_t * driver); +SERVER_EXPORT jackctl_driver_type_t +jackctl_driver_get_type( + jackctl_driver_t * driver); + SERVER_EXPORT const JSList * jackctl_driver_get_parameters( jackctl_driver_t * driver); diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index 5c5b3283..370d2721 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -822,6 +822,7 @@ SERVER_EXPORT jack_driver_desc_t * jack_driver_descriptor_construct( const char * name, + jack_driver_type_t type, const char * description, jack_driver_desc_filler_t * filler_ptr) { diff --git a/common/JackDummyDriver.cpp b/common/JackDummyDriver.cpp index 184499b8..f24f659e 100644 --- a/common/JackDummyDriver.cpp +++ b/common/JackDummyDriver.cpp @@ -37,7 +37,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; 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); if (buffer_size > BUFFER_SIZE_MAX) { buffer_size = 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)); if (driver->Open(buffer_size, sample_rate, 1, 1, capture_ports, playback_ports, monitor, "dummy", "dummy", 0, 0) == 0) { return driver; diff --git a/common/JackLoopbackDriver.cpp b/common/JackLoopbackDriver.cpp index acb68e98..5c0376d9 100644 --- a/common/JackLoopbackDriver.cpp +++ b/common/JackLoopbackDriver.cpp @@ -101,7 +101,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamInt, &value, NULL, "Maximum number of loopback ports", NULL); diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index 9be1bcf3..52bc5778 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -383,7 +383,7 @@ extern "C" jack_driver_desc_filler_t filler; 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); jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index da8327d2..618d1a0b 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -73,7 +73,7 @@ namespace Jack } //open, close, attach and detach------------------------------------------------------ - + int JackNetDriver::Close() { #ifdef JACK_MONITOR @@ -473,7 +473,7 @@ namespace Jack { return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); } - + int JackNetDriver::Read() { //buffers @@ -587,7 +587,7 @@ namespace Jack jack_driver_desc_filler_t filler; 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); jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp index 4a813b9b..c97ba9c1 100644 --- a/common/JackNetManager.cpp +++ b/common/JackNetManager.cpp @@ -843,7 +843,7 @@ extern "C" jack_driver_desc_filler_t filler; 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); jack_driver_descriptor_add_parameter(desc, &filler, "multicast_ip", 'a', JackDriverParamString, &value, NULL, "Multicast Address", NULL); diff --git a/common/JackNetOneDriver.cpp b/common/JackNetOneDriver.cpp index 7dd4e69d..c0db768d 100644 --- a/common/JackNetOneDriver.cpp +++ b/common/JackNetOneDriver.cpp @@ -251,12 +251,12 @@ bool JackNetOneDriver::Initialize() //jack ports and buffers-------------------------------------------------------------- //driver processes-------------------------------------------------------------------- - + int JackNetOneDriver::Process() { return (fEngineControl->fSyncMode) ? ProcessSync() : ProcessAsync(); } - + int JackNetOneDriver::Read() { int delay; @@ -764,7 +764,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "audio-ins", 'i', JackDriverParamUInt, &value, NULL, "Number of capture channels (defaults to 2)", NULL); diff --git a/common/driver_interface.h b/common/driver_interface.h index 4645c2f0..b67a2546 100644 --- a/common/driver_interface.h +++ b/common/driver_interface.h @@ -51,6 +51,14 @@ typedef enum JackDriverParamBool } jack_driver_param_type_t; +/** Driver types */ +typedef enum +{ + JackDriverMaster = 1, + JackDriverSlave, + JackDriverNone, +} jack_driver_type_t; + /** Driver parameter value */ typedef union { @@ -103,6 +111,7 @@ jack_driver_param_t; /** A struct for describing a jack driver */ typedef struct { 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 file[JACK_PATH_MAX + 1]; /**< The filename of the driver's shared object file */ 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 */ jack_driver_descriptor_construct( const char * name, /* driver name */ + jack_driver_type_t type, /* driver type */ 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. Can be NULL for drivers that have no parameters. */ diff --git a/common/jack/control.h b/common/jack/control.h index 8e00c452..b9f07067 100644 --- a/common/jack/control.h +++ b/common/jack/control.h @@ -45,6 +45,13 @@ typedef enum JackParamBool, /**< @brief value type is a boolean */ } 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 */ #define JACK_PARAM_MAX (JackParamBool + 1) @@ -298,6 +305,18 @@ const char * jackctl_driver_get_name( 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 * pointers is a parameter object handle (::jackctl_parameter_t). diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index b214dc9f..eb9e1083 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -191,7 +191,7 @@ extern "C" jack_driver_desc_filler_t filler; 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"); jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp index c22b56fe..433f56c9 100644 --- a/linux/alsa/JackAlsaDriver.cpp +++ b/linux/alsa/JackAlsaDriver.cpp @@ -729,7 +729,7 @@ SERVER_EXPORT const jack_driver_desc_t* driver_get_descriptor () jack_driver_desc_filler_t filler; 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"); jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Provide capture ports. Optionally set device", NULL); diff --git a/linux/alsarawmidi/JackALSARawMidiDriver.cpp b/linux/alsarawmidi/JackALSARawMidiDriver.cpp index 011c8931..5255f82d 100644 --- a/linux/alsarawmidi/JackALSARawMidiDriver.cpp +++ b/linux/alsarawmidi/JackALSARawMidiDriver.cpp @@ -632,7 +632,7 @@ extern "C" { // sizes. I don't think MIDI drivers can accept parameters right // 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 * diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp index db04ed3c..8e346c1f 100644 --- a/linux/firewire/JackFFADODriver.cpp +++ b/linux/firewire/JackFFADODriver.cpp @@ -527,7 +527,7 @@ int JackFFADODriver::Attach() if (fEngine->PortRegister(fClientControl.fRefNum, buf, JACK_DEFAULT_MIDI_TYPE, PlaybackDriverFlags, - fEngineControl->fBufferSize, &port_index) < 0) { + fEngineControl->fBufferSize, &port_index) < 0) { jack_error("driver: cannot register port for %s", buf); return -1; } @@ -755,7 +755,7 @@ extern "C" jack_driver_desc_filler_t filler; 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"); jack_driver_descriptor_add_parameter( diff --git a/linux/freebob/JackFreebobDriver.cpp b/linux/freebob/JackFreebobDriver.cpp index b9e6ce38..4988aca0 100644 --- a/linux/freebob/JackFreebobDriver.cpp +++ b/linux/freebob/JackFreebobDriver.cpp @@ -956,7 +956,7 @@ extern "C" jack_driver_desc_filler_t filler; 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"); jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "The FireWire device to use. Format is: 'hw:port[,node]'.", NULL); diff --git a/macosx/Jackdmp.xcodeproj/project.pbxproj b/macosx/Jackdmp.xcodeproj/project.pbxproj index b9693086..a5661acf 100644 --- a/macosx/Jackdmp.xcodeproj/project.pbxproj +++ b/macosx/Jackdmp.xcodeproj/project.pbxproj @@ -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; }; 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; }; + 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; }; 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; }; @@ -2850,6 +2852,8 @@ 4B05A08A0DF72BF600840F4C /* Windows */ = { isa = PBXGroup; children = ( + 4BB21C6D1407E16400287B3C /* JackWinMMEDriver.cpp */, + 4BB21C6E1407E16400287B3C /* JackWinMMEDriver.h */, 4B05A08B0DF72C3200840F4C /* JackWinEvent.cpp */, 4B05A08C0DF72C3200840F4C /* JackWinEvent.h */, 4B05A08D0DF72C3200840F4C /* JackWinNamedPipe.cpp */, diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp index 319e1ddf..5e70c1ac 100644 --- a/macosx/coreaudio/JackCoreAudioAdapter.cpp +++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp @@ -1509,7 +1509,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; 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"); diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index bad5801f..1f7de3b4 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -2059,7 +2059,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; 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"); diff --git a/macosx/coremidi/JackCoreMidiDriver.cpp b/macosx/coremidi/JackCoreMidiDriver.cpp index e3549e8a..0479bcc9 100644 --- a/macosx/coremidi/JackCoreMidiDriver.cpp +++ b/macosx/coremidi/JackCoreMidiDriver.cpp @@ -638,7 +638,7 @@ extern "C" { jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "CoreMIDI virtual bus", NULL); diff --git a/solaris/oss/JackBoomerDriver.cpp b/solaris/oss/JackBoomerDriver.cpp index 1442a278..4353ffc8 100644 --- a/solaris/oss/JackBoomerDriver.cpp +++ b/solaris/oss/JackBoomerDriver.cpp @@ -821,7 +821,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); diff --git a/solaris/oss/JackOSSAdapter.cpp b/solaris/oss/JackOSSAdapter.cpp index 9647bc4c..4e500fbd 100644 --- a/solaris/oss/JackOSSAdapter.cpp +++ b/solaris/oss/JackOSSAdapter.cpp @@ -73,12 +73,12 @@ static inline void CopyAndConvertOut(void *dst, jack_sample_t *src, size_t nfram s32dst += channel; sample_move_d24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); // No dithering for now... break; - } + } case 32: { signed int *s32dst = (signed int*)dst; s32dst += channel; sample_move_d32u24_sS((char*)s32dst, src, nframes, chcount<<2, NULL); - break; + break; } } } @@ -92,7 +92,7 @@ void JackOSSAdapter::SetSampleFormat() fSampleSize = sizeof(int); break; case 32: /* native-endian 32-bit integer */ - fSampleFormat = AFMT_S32_NE; + fSampleFormat = AFMT_S32_NE; fSampleSize = sizeof(int); break; 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) :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), fInputBufferSize(0), fOutputBufferSize(0), fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true) { const JSList* node; const jack_driver_param_t* param; - + fCaptureChannels = 2; fPlaybackChannels = 2; strcpy(fCaptureDriverName, OSS_DRIVER_DEF_DEV); strcpy(fPlaybackDriverName, OSS_DRIVER_DEF_DEV); - + for (node = params; node; node = jack_slist_next(node)) { param = (const jack_driver_param_t*) node->data; - + switch (param->character) { case 'r': SetAdaptedSampleRate(param->value.ui); break; - + case 'p': SetAdaptedBufferSize(param->value.ui); break; @@ -136,15 +136,15 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample case 'n': fNperiods = param->value.ui; break; - + case 'w': fBits = param->value.i; break; - + case 'i': fCaptureChannels = param->value.ui; break; - + case 'o': fPlaybackChannels = param->value.ui; break; @@ -152,21 +152,21 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample case 'e': fExcl = true; break; - + case 'C': fRWMode |= kRead; if (strcmp(param->value.str, "none") != 0) { strcpy(fCaptureDriverName, param->value.str); } break; - + case 'P': fRWMode |= kWrite; if (strcmp(param->value.str, "none") != 0) { strcpy(fPlaybackDriverName, param->value.str); } break; - + case 'd': fRWMode |= kRead; fRWMode |= kWrite; @@ -177,11 +177,11 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample case 'b': fIgnoreHW = true; break; - + case 'q': fQuality = param->value.ui; break; - + case 'g': fRingbufferCurSize = param->value.ui; fAdaptative = false; @@ -200,14 +200,14 @@ void JackOSSAdapter::DisplayDeviceInfo() oss_audioinfo ai_in, ai_out; memset(&info, 0, sizeof(audio_buf_info)); int cap = 0; - + // Duplex cards : http://manuals.opensound.com/developer/full_duplex.html - + jack_info("Audio Interface Description :"); jack_info("Sampling Frequency : %d, Sample Format : %d, Mode : %d", fAdaptedSampleRate, fSampleFormat, fRWMode); - + if (fRWMode & kWrite) { - + oss_sysinfo si; if (ioctl(fOutFD, OSS_SYSINFO, &si) == -1) { 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 numcards %d", si.numcards); } - + jack_info("Output capabilities - %d channels : ", fPlaybackChannels); jack_info("Output block size = %d", fOutputBufferSize); - + if (ioctl(fOutFD, SNDCTL_DSP_GETOSPACE, &info) == -1) { jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETOSPACE failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); } 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); } - + if (ioctl(fOutFD, SNDCTL_DSP_GETCAPS, &cap) == -1) { jack_error("JackOSSAdapter::DisplayDeviceInfo SNDCTL_DSP_GETCAPS failed : %s@%i, errno = %d", __FILE__, __LINE__, errno); } else { @@ -242,10 +242,10 @@ void JackOSSAdapter::DisplayDeviceInfo() if (cap & DSP_CAP_MULTI) jack_info(" DSP_CAP_MULTI"); if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); } - } - + } + if (fRWMode & kRead) { - + oss_sysinfo si; if (ioctl(fInFD, OSS_SYSINFO, &si) == -1) { 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 numcards %d", si.numcards); } - + jack_info("Input capabilities - %d channels : ", fCaptureChannels); 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); } 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); } @@ -281,15 +281,15 @@ void JackOSSAdapter::DisplayDeviceInfo() if (cap & DSP_CAP_BIND) jack_info(" DSP_CAP_BIND"); } } - + if (ioctl(fInFD, SNDCTL_AUDIOINFO, &ai_in) != -1) { jack_info("Using audio engine %d = %s for input", ai_in.dev, ai_in.name); } - + if (ioctl(fOutFD, SNDCTL_AUDIOINFO, &ai_out) != -1) { jack_info("Using audio engine %d = %s for output", ai_out.dev, ai_out.name); } - + if (ai_in.rate_source != ai_out.rate_source) { jack_info("Warning : input and output are not necessarily driven by the same clock!"); } @@ -301,9 +301,9 @@ int JackOSSAdapter::OpenInput() int gFragFormat; int cur_sample_format, cur_capture_channels; jack_nframes_t cur_sample_rate; - + if (fCaptureChannels == 0) fCaptureChannels = 2; - + 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); 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) { jack_error("JackOSSAdapter::OpenInput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); goto error; @@ -330,7 +330,7 @@ int JackOSSAdapter::OpenInput() if (cur_sample_format != fSampleFormat) { jack_info("JackOSSAdapter::OpenInput driver forced the sample format %ld", fSampleFormat); } - + cur_capture_channels = fCaptureChannels; if (ioctl(fInFD, SNDCTL_DSP_CHANNELS, &fCaptureChannels) == -1) { 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) { jack_info("JackOSSAdapter::OpenInput driver forced the number of capture channels %ld", fCaptureChannels); } - + cur_sample_rate = fAdaptedSampleRate; if (ioctl(fInFD, SNDCTL_DSP_SPEED, &fAdaptedSampleRate) == -1) { 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); goto error; } - + if (fInputBufferSize != fAdaptedBufferSize * fSampleSize * fCaptureChannels) { if (fIgnoreHW) { jack_info("JackOSSAdapter::OpenInput driver forced buffer size %ld", fOutputBufferSize); @@ -366,16 +366,16 @@ int JackOSSAdapter::OpenInput() fInputBuffer = (void*)calloc(fInputBufferSize, 1); assert(fInputBuffer); - + fInputSampleBuffer = (float**)malloc(fCaptureChannels * sizeof(float*)); assert(fInputSampleBuffer); - + for (int i = 0; i < fCaptureChannels; i++) { fInputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); assert(fInputSampleBuffer[i]); } return 0; - + error: ::close(fInFD); return -1; @@ -387,22 +387,22 @@ int JackOSSAdapter::OpenOutput() int gFragFormat; int cur_sample_format, cur_playback_channels; jack_nframes_t cur_sample_rate; - + if (fPlaybackChannels == 0) fPlaybackChannels = 2; - + 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); return -1; } - + if (fExcl) { if (ioctl(fOutFD, SNDCTL_DSP_COOKEDMODE, &flags) == -1) { jack_error("JackOSSAdapter::OpenOutput failed to set cooked mode : %s@%i, errno = %d", __FILE__, __LINE__, errno); goto error; - } - } + } + } - gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fPlaybackChannels); + gFragFormat = (2 << 16) + int2pow2(fAdaptedBufferSize * fSampleSize * fPlaybackChannels); if (ioctl(fOutFD, SNDCTL_DSP_SETFRAGMENT, &gFragFormat) == -1) { jack_error("JackOSSAdapter::OpenOutput failed to set fragments : %s@%i, errno = %d", __FILE__, __LINE__, errno); goto error; @@ -416,7 +416,7 @@ int JackOSSAdapter::OpenOutput() if (cur_sample_format != fSampleFormat) { jack_info("JackOSSAdapter::OpenOutput driver forced the sample format %ld", fSampleFormat); } - + cur_playback_channels = fPlaybackChannels; if (ioctl(fOutFD, SNDCTL_DSP_CHANNELS, &fPlaybackChannels) == -1) { 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); goto error; } - + if (fOutputBufferSize != fAdaptedBufferSize * fSampleSize * fPlaybackChannels) { if (fIgnoreHW) { jack_info("JackOSSAdapter::OpenOutput driver forced buffer size %ld", fOutputBufferSize); @@ -452,18 +452,18 @@ int JackOSSAdapter::OpenOutput() fOutputBuffer = (void*)calloc(fOutputBufferSize, 1); assert(fOutputBuffer); - + fOutputSampleBuffer = (float**)malloc(fPlaybackChannels * sizeof(float*)); assert(fOutputSampleBuffer); - + for (int i = 0; i < fPlaybackChannels; i++) { fOutputSampleBuffer[i] = (float*)malloc(fAdaptedBufferSize * sizeof(float)); assert(fOutputSampleBuffer[i]); } - + fFirstCycle = true; return 0; - + error: ::close(fOutFD); return -1; @@ -472,46 +472,46 @@ error: int JackOSSAdapter::Open() { SetSampleFormat(); - + if ((fRWMode & kRead) && (OpenInput() < 0)) { return -1; } - - if ((fRWMode & kWrite) && (OpenOutput() < 0)) { + + if ((fRWMode & kWrite) && (OpenOutput() < 0)) { return -1; } - + // In duplex mode, check that input and output use the same buffer size if ((fRWMode & kRead) && (fRWMode & kWrite) && (fInputBufferSize != fOutputBufferSize)) { jack_error("JackOSSAdapter::OpenAux input and output buffer size are not the same!!"); goto error; } - DisplayDeviceInfo(); + DisplayDeviceInfo(); //start adapter thread if (fThread.StartSync() < 0) { jack_error ( "Cannot start audioadapter thread" ); return -1; } - + //turn the thread realtime fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority); return 0; - + error: CloseAux(); return -1; } - + int JackOSSAdapter::Close() { #ifdef JACK_MONITOR fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize); #endif fThread.Stop(); - CloseAux(); + CloseAux(); return 0; } @@ -521,23 +521,23 @@ void JackOSSAdapter::CloseAux() close(fInFD); fInFD = -1; } - + if (fRWMode & kWrite) { close(fOutFD); fOutFD = -1; } - + free(fInputBuffer); fInputBuffer = NULL; - + free(fOutputBuffer); fOutputBuffer = NULL; - + for (int i = 0; i < fCaptureChannels; i++) { free(fInputSampleBuffer[i]); } free(fInputSampleBuffer); - + for (int i = 0; i < fPlaybackChannels; i++) { free(fOutputSampleBuffer[i]); } @@ -547,13 +547,13 @@ void JackOSSAdapter::CloseAux() int JackOSSAdapter::Read() { ssize_t count = ::read(fInFD, fInputBuffer, fInputBufferSize); - + if (count < fInputBufferSize) { jack_error("JackOSSAdapter::Read error bytes read = %ld", count); return -1; } else { 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; } @@ -562,10 +562,10 @@ int JackOSSAdapter::Read() int JackOSSAdapter::Write() { ssize_t count; - + // Maybe necessay to write an empty output buffer first time : see http://manuals.opensound.com/developer/fulldup.c.html if (fFirstCycle) { - + fFirstCycle = false; memset(fOutputBuffer, 0, fOutputBufferSize); @@ -577,23 +577,23 @@ int JackOSSAdapter::Write() return -1; } } - + int delay; if (ioctl(fOutFD, SNDCTL_DSP_GETODELAY, &delay) == -1) { jack_error("JackOSSDriver::Write error get out delay : %s@%i, errno = %d", __FILE__, __LINE__, errno); return -1; } - + delay /= fSampleSize * fPlaybackChannels; jack_info("JackOSSDriver::Write output latency frames = %ld", delay); } - + for (int i = 0; i < fPlaybackChannels; i++) { CopyAndConvertOut(fOutputBuffer, fOutputSampleBuffer[i], fAdaptedBufferSize, i, fCaptureChannels, fBits); } - + count = ::write(fOutFD, fOutputBuffer, fOutputBufferSize); - + if (count < fOutputBufferSize) { jack_error("JackOSSAdapter::Write error bytes written = %ld", count); return -1; @@ -607,13 +607,13 @@ bool JackOSSAdapter::Execute() //read data from audio interface if (Read() < 0) return false; - + PushAndPull(fInputSampleBuffer, fOutputSampleBuffer, fAdaptedBufferSize); - + //write data to audio interface if (Write() < 0) return false; - + return true; } @@ -623,7 +623,7 @@ int JackOSSAdapter::SetBufferSize(jack_nframes_t buffer_size) Close(); return Open(); } - + } // namespace #ifdef __cplusplus @@ -637,7 +637,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; 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; jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamUInt, &value, NULL, "Capture channels", NULL); - + value.ui = OSS_DRIVER_DEF_OUTS; 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, "playback", 'P', JackDriverParamString, &value, NULL, "Output device", NULL); jack_driver_descriptor_add_parameter(desc, &filler, "device", 'd', JackDriverParamString, &value, NULL, "OSS device name", NULL); - + value.i = true; jack_driver_descriptor_add_parameter(desc, &filler, "ignorehwbuf", 'b', JackDriverParamBool, &value, NULL, "Ignore hardware period size", NULL); - + value.ui = 0; jack_driver_descriptor_add_parameter(desc, &filler, "quality", 'q', JackDriverParamInt, &value, NULL, "Resample algorithm quality (0 - 4)", NULL); - + 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)"); - + return desc; } - + #ifdef __cplusplus } #endif diff --git a/solaris/oss/JackOSSDriver.cpp b/solaris/oss/JackOSSDriver.cpp index fa5d8967..be0b7bba 100644 --- a/solaris/oss/JackOSSDriver.cpp +++ b/solaris/oss/JackOSSDriver.cpp @@ -738,7 +738,7 @@ SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor() jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "rate", 'r', JackDriverParamUInt, &value, NULL, "Sample rate", NULL); diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index e309b9da..d4b8b870 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -218,7 +218,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "inchannels", 'i', JackDriverParamInt, &value, NULL, "Maximum number of input channels", NULL); diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp index c671f19d..38cfc4a8 100644 --- a/windows/portaudio/JackPortAudioDriver.cpp +++ b/windows/portaudio/JackPortAudioDriver.cpp @@ -266,7 +266,7 @@ extern "C" jack_driver_desc_filler_t filler; 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; jack_driver_descriptor_add_parameter(desc, &filler, "channels", 'c', JackDriverParamUInt, &value, NULL, "Maximum number of channels", NULL); diff --git a/windows/winmme/JackWinMMEDriver.cpp b/windows/winmme/JackWinMMEDriver.cpp index 3263dc61..f98f646a 100644 --- a/windows/winmme/JackWinMMEDriver.cpp +++ b/windows/winmme/JackWinMMEDriver.cpp @@ -60,7 +60,7 @@ JackWinMMEDriver::Attach() // Inputs for (int i = 0; i < fCaptureChannels; i++) { JackWinMMEInputPort *input_port = input_ports[i]; - name = input_port->GetName(); + name = input_port->GetName(); if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, CaptureDriverFlags, buffer_size, &index) < 0) { @@ -361,7 +361,7 @@ extern "C" { 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) @@ -436,3 +436,4 @@ jack_connect system_midi:capture_2 system:midi_playback_1 jack_connect system_midi:capture_1 system_midi:playback_1 */ +