git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2675 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -32,15 +32,13 @@ namespace Jack | |||||
| { | { | ||||
| JackAudioAdapter::JackAudioAdapter(jack_client_t* jack_client, | JackAudioAdapter::JackAudioAdapter(jack_client_t* jack_client, | ||||
| JackAudioAdapterInterface* audio_io, | |||||
| int input, | |||||
| int output) | |||||
| JackAudioAdapterInterface* audio_io) | |||||
| { | { | ||||
| int i; | int i; | ||||
| char name[32]; | char name[32]; | ||||
| fJackClient = jack_client; | fJackClient = jack_client; | ||||
| fCaptureChannels = input; | |||||
| fPlaybackChannels = output; | |||||
| fCaptureChannels = audio_io->GetInputs(); | |||||
| fPlaybackChannels = audio_io->GetOutputs(); | |||||
| fAudioAdapter = audio_io; | fAudioAdapter = audio_io; | ||||
| fCapturePortList = new jack_port_t* [fCaptureChannels]; | fCapturePortList = new jack_port_t* [fCaptureChannels]; | ||||
| @@ -120,49 +118,26 @@ extern "C" | |||||
| #include "JackPortAudioAdapter.h" | #include "JackPortAudioAdapter.h" | ||||
| #endif | #endif | ||||
| #define max(x,y) (((x)>(y)) ? (x) : (y)) | |||||
| #define min(x,y) (((x)<(y)) ? (x) : (y)) | |||||
| using namespace Jack; | using namespace Jack; | ||||
| EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params) | EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params) | ||||
| { | { | ||||
| Jack::JackAudioAdapter* adapter; | Jack::JackAudioAdapter* adapter; | ||||
| const char** ports; | |||||
| jack_log("Loading audioadapter"); | jack_log("Loading audioadapter"); | ||||
| // Find out input and output ports numbers | |||||
| int input = 0; | |||||
| if ((ports = jack_get_ports(jack_client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput)) != NULL) { | |||||
| while (ports[input]) input++; | |||||
| } | |||||
| if (ports) | |||||
| free(ports); | |||||
| int output = 0; | |||||
| if ((ports = jack_get_ports(jack_client, NULL, NULL, JackPortIsPhysical|JackPortIsInput)) != NULL) { | |||||
| while (ports[output]) output++; | |||||
| } | |||||
| if (ports) | |||||
| free(ports); | |||||
| input = max(2, input); | |||||
| output = max(2, output); | |||||
| #ifdef __linux__ | #ifdef __linux__ | ||||
| adapter = new Jack::JackCallbackAudioAdapter(jack_client, | adapter = new Jack::JackCallbackAudioAdapter(jack_client, | ||||
| new Jack::JackAlsaAdapter(input, output, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params), input, output); | |||||
| new Jack::JackAlsaAdapter(jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params)); | |||||
| #endif | #endif | ||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| adapter = new Jack::JackCallbackAudioAdapter(jack_client, | adapter = new Jack::JackCallbackAudioAdapter(jack_client, | ||||
| new Jack::JackPortAudioAdapter(input, output, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params), input, output); | |||||
| new Jack::JackPortAudioAdapter(jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params)); | |||||
| #endif | #endif | ||||
| #ifdef __APPLE__ | #ifdef __APPLE__ | ||||
| adapter = new Jack::JackCallbackAudioAdapter(jack_client, | adapter = new Jack::JackCallbackAudioAdapter(jack_client, | ||||
| new Jack::JackCoreAudioAdapter(input, output, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params), input, output); | |||||
| new Jack::JackCoreAudioAdapter(jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client), params)); | |||||
| #endif | #endif | ||||
| assert(adapter); | assert(adapter); | ||||
| @@ -45,9 +45,7 @@ namespace Jack | |||||
| public: | public: | ||||
| JackAudioAdapter(jack_client_t* jack_client, | JackAudioAdapter(jack_client_t* jack_client, | ||||
| JackAudioAdapterInterface* audio_io, | |||||
| int input, | |||||
| int output); | |||||
| JackAudioAdapterInterface* audio_io); | |||||
| virtual ~JackAudioAdapter(); | virtual ~JackAudioAdapter(); | ||||
| int Open(); | int Open(); | ||||
| @@ -84,10 +84,8 @@ namespace Jack | |||||
| public: | public: | ||||
| JackAudioAdapterInterface(int input, int output, jack_nframes_t buffer_size, jack_nframes_t sample_rate) | |||||
| :fCaptureChannels(input), | |||||
| fPlaybackChannels(output), | |||||
| fBufferSize(buffer_size), | |||||
| JackAudioAdapterInterface(jack_nframes_t buffer_size, jack_nframes_t sample_rate) | |||||
| :fBufferSize(buffer_size), | |||||
| fSampleRate(sample_rate), | fSampleRate(sample_rate), | ||||
| fProducerDLL(buffer_size, sample_rate), | fProducerDLL(buffer_size, sample_rate), | ||||
| fConsumerDLL(buffer_size, sample_rate), | fConsumerDLL(buffer_size, sample_rate), | ||||
| @@ -132,6 +130,16 @@ namespace Jack | |||||
| } | } | ||||
| void ResampleFactor(jack_nframes_t& frame1, jack_nframes_t& frame2); | void ResampleFactor(jack_nframes_t& frame1, jack_nframes_t& frame2); | ||||
| int GetInputs() | |||||
| { | |||||
| return fCaptureChannels; | |||||
| } | |||||
| int GetOutputs() | |||||
| { | |||||
| return fPlaybackChannels; | |||||
| } | |||||
| }; | }; | ||||
| } | } | ||||
| @@ -94,11 +94,8 @@ void JackCallbackAudioAdapter::Reset() | |||||
| fAudioAdapter->Reset(); | fAudioAdapter->Reset(); | ||||
| } | } | ||||
| JackCallbackAudioAdapter::JackCallbackAudioAdapter(jack_client_t* jack_client, | |||||
| JackAudioAdapterInterface* audio_io, | |||||
| int input, | |||||
| int output) | |||||
| : JackAudioAdapter(jack_client, audio_io, input, output) | |||||
| JackCallbackAudioAdapter::JackCallbackAudioAdapter(jack_client_t* jack_client, JackAudioAdapterInterface* audio_io) | |||||
| : JackAudioAdapter(jack_client, audio_io) | |||||
| { | { | ||||
| int i; | int i; | ||||
| @@ -42,9 +42,7 @@ namespace Jack | |||||
| public: | public: | ||||
| JackCallbackAudioAdapter(jack_client_t* jack_client, | JackCallbackAudioAdapter(jack_client_t* jack_client, | ||||
| JackAudioAdapterInterface* audio_io, | |||||
| int input, | |||||
| int output); | |||||
| JackAudioAdapterInterface* audio_io); | |||||
| ~JackCallbackAudioAdapter(); | ~JackCallbackAudioAdapter(); | ||||
| }; | }; | ||||
| @@ -22,6 +22,52 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
| namespace Jack | namespace Jack | ||||
| { | { | ||||
| JackAlsaAdapter::JackAlsaAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(buffer_size, sample_rate) | |||||
| ,fThread(this), fAudioInterface(GetInputs(), GetOutputs(), buffer_size, sample_rate) | |||||
| { | |||||
| const JSList* node; | |||||
| const jack_driver_param_t* param; | |||||
| fCaptureChannels = 2; | |||||
| fPlaybackChannels = 2; | |||||
| for (node = params; node; node = jack_slist_next(node)) { | |||||
| param = (const jack_driver_param_t*) node->data; | |||||
| switch (param->character) { | |||||
| case 'i': | |||||
| fCaptureChannels = param->value.ui; | |||||
| break; | |||||
| case 'o': | |||||
| fPlaybackChannels = param->value.ui; | |||||
| break; | |||||
| case 'C': | |||||
| break; | |||||
| case 'P': | |||||
| break; | |||||
| case 'D': | |||||
| break; | |||||
| case 'n': | |||||
| break; | |||||
| case 'd': | |||||
| break; | |||||
| case 'r': | |||||
| SetSampleRate(param->value.ui); | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| int JackAlsaAdapter::Open() | int JackAlsaAdapter::Open() | ||||
| { | { | ||||
| if (fAudioInterface.open() == 0) { | if (fAudioInterface.open() == 0) { | ||||
| @@ -528,11 +528,7 @@ namespace Jack | |||||
| public: | public: | ||||
| JackAlsaAdapter(int input, int output, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(input, output, buffer_size, sample_rate) | |||||
| ,fThread(this), fAudioInterface(input, output, buffer_size, sample_rate) | |||||
| {} | |||||
| JackAlsaAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params); | |||||
| ~JackAlsaAdapter() | ~JackAlsaAdapter() | ||||
| {} | {} | ||||
| @@ -152,6 +152,51 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, | |||||
| return noErr; | return noErr; | ||||
| } | } | ||||
| JackCoreAudioAdapter::JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(buffer_size, sample_rate),fInputData(0),fState(false) | |||||
| { | |||||
| const JSList* node; | |||||
| const jack_driver_param_t* param; | |||||
| fCaptureChannels = 2; | |||||
| fPlaybackChannels = 2; | |||||
| for (node = params; node; node = jack_slist_next(node)) { | |||||
| param = (const jack_driver_param_t*) node->data; | |||||
| switch (param->character) { | |||||
| case 'c' : | |||||
| break; | |||||
| case 'i': | |||||
| fCaptureChannels = param->value.ui; | |||||
| break; | |||||
| case 'o': | |||||
| fPlaybackChannels = param->value.ui; | |||||
| break; | |||||
| case 'C': | |||||
| break; | |||||
| case 'P': | |||||
| break; | |||||
| case 'D': | |||||
| break; | |||||
| case 'r': | |||||
| SetSampleRate(param->value.ui); | |||||
| break; | |||||
| case 'l': | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| OSStatus JackCoreAudioAdapter::GetDefaultDevice(AudioDeviceID* id) | OSStatus JackCoreAudioAdapter::GetDefaultDevice(AudioDeviceID* id) | ||||
| { | { | ||||
| OSStatus res; | OSStatus res; | ||||
| @@ -97,10 +97,8 @@ namespace Jack | |||||
| public: | public: | ||||
| JackCoreAudioAdapter(int input, int output, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(input, output, buffer_size, sample_rate),fInputData(0),fState(false) | |||||
| {} | |||||
| ~JackCoreAudioAdapter() | |||||
| JackCoreAudioAdapter( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params); | |||||
| ~JackCoreAudioAdapter() | |||||
| {} | {} | ||||
| virtual int Open(); | virtual int Open(); | ||||
| @@ -66,6 +66,53 @@ int JackPortAudioAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||||
| } | } | ||||
| return paContinue; | return paContinue; | ||||
| } | } | ||||
| JackPortAudioAdapter::JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(buffer_size, sample_rate) | |||||
| { | |||||
| const JSList* node; | |||||
| const jack_driver_param_t* param; | |||||
| fCaptureChannels = 2; | |||||
| fPlaybackChannels = 2; | |||||
| for (node = params; node; node = jack_slist_next(node)) { | |||||
| param = (const jack_driver_param_t*) node->data; | |||||
| switch (param->character) { | |||||
| case 'c' : | |||||
| break; | |||||
| case 'i': | |||||
| fCaptureChannels = param->value.ui; | |||||
| break; | |||||
| case 'o': | |||||
| fPlaybackChannels = param->value.ui; | |||||
| break; | |||||
| case 'C': | |||||
| break; | |||||
| case 'P': | |||||
| break; | |||||
| case 'D': | |||||
| break; | |||||
| case 'r': | |||||
| SetSampleRate(param->value.ui); | |||||
| break; | |||||
| case 'd': | |||||
| break; | |||||
| case 'l': | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| int JackPortAudioAdapter::Open() | int JackPortAudioAdapter::Open() | ||||
| { | { | ||||
| @@ -44,10 +44,8 @@ namespace Jack | |||||
| public: | public: | ||||
| JackPortAudioAdapter(int input, int output, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) | |||||
| :JackAudioAdapterInterface(input, output, buffer_size, sample_rate) | |||||
| {} | |||||
| ~JackPortAudioAdapter() | |||||
| JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params); | |||||
| ~JackPortAudioAdapter() | |||||
| {} | {} | ||||
| int Open(); | int Open(); | ||||