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, | |||
| JackAudioAdapterInterface* audio_io, | |||
| int input, | |||
| int output) | |||
| JackAudioAdapterInterface* audio_io) | |||
| { | |||
| int i; | |||
| char name[32]; | |||
| fJackClient = jack_client; | |||
| fCaptureChannels = input; | |||
| fPlaybackChannels = output; | |||
| fCaptureChannels = audio_io->GetInputs(); | |||
| fPlaybackChannels = audio_io->GetOutputs(); | |||
| fAudioAdapter = audio_io; | |||
| fCapturePortList = new jack_port_t* [fCaptureChannels]; | |||
| @@ -120,49 +118,26 @@ extern "C" | |||
| #include "JackPortAudioAdapter.h" | |||
| #endif | |||
| #define max(x,y) (((x)>(y)) ? (x) : (y)) | |||
| #define min(x,y) (((x)<(y)) ? (x) : (y)) | |||
| using namespace Jack; | |||
| EXPORT int jack_internal_initialize(jack_client_t* jack_client, const JSList* params) | |||
| { | |||
| Jack::JackAudioAdapter* adapter; | |||
| const char** ports; | |||
| 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__ | |||
| 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 | |||
| #ifdef WIN32 | |||
| 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 | |||
| #ifdef __APPLE__ | |||
| 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 | |||
| assert(adapter); | |||
| @@ -45,9 +45,7 @@ namespace Jack | |||
| public: | |||
| JackAudioAdapter(jack_client_t* jack_client, | |||
| JackAudioAdapterInterface* audio_io, | |||
| int input, | |||
| int output); | |||
| JackAudioAdapterInterface* audio_io); | |||
| virtual ~JackAudioAdapter(); | |||
| int Open(); | |||
| @@ -84,10 +84,8 @@ namespace Jack | |||
| 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), | |||
| fProducerDLL(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); | |||
| int GetInputs() | |||
| { | |||
| return fCaptureChannels; | |||
| } | |||
| int GetOutputs() | |||
| { | |||
| return fPlaybackChannels; | |||
| } | |||
| }; | |||
| } | |||
| @@ -94,11 +94,8 @@ void JackCallbackAudioAdapter::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; | |||
| @@ -42,9 +42,7 @@ namespace Jack | |||
| public: | |||
| JackCallbackAudioAdapter(jack_client_t* jack_client, | |||
| JackAudioAdapterInterface* audio_io, | |||
| int input, | |||
| int output); | |||
| JackAudioAdapterInterface* audio_io); | |||
| ~JackCallbackAudioAdapter(); | |||
| }; | |||
| @@ -22,6 +22,52 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
| 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() | |||
| { | |||
| if (fAudioInterface.open() == 0) { | |||
| @@ -528,11 +528,7 @@ namespace Jack | |||
| 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() | |||
| {} | |||
| @@ -152,6 +152,51 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, | |||
| 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 res; | |||
| @@ -97,10 +97,8 @@ namespace Jack | |||
| 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(); | |||
| @@ -66,6 +66,53 @@ int JackPortAudioAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
| } | |||
| 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() | |||
| { | |||
| @@ -44,10 +44,8 @@ namespace Jack | |||
| 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(); | |||