20 #include "JackPortAudioAdapter.h"
21 #include "JackError.h"
26 int JackPortAudioAdapter::Render(
const void* inputBuffer,
28 unsigned long framesPerBuffer,
33 JackPortAudioAdapter* adapter =
static_cast<JackPortAudioAdapter*
>(userData);
34 adapter->PushAndPull((jack_default_audio_sample_t**)inputBuffer, (jack_default_audio_sample_t**)outputBuffer, framesPerBuffer);
38 JackPortAudioAdapter::JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate,
const JSList* params)
39 : JackAudioAdapterInterface(buffer_size, sample_rate)
41 jack_log(
"JackPortAudioAdapter::JackPortAudioAdapter buffer_size = %d, sample_rate = %d", buffer_size, sample_rate);
51 for (node = params; node; node = jack_slist_next(node)) {
54 switch (param->character)
57 fCaptureChannels = param->value.ui;
60 fPlaybackChannels = param->value.ui;
63 if (fPaDevices.GetInputDeviceFromName(param->value.str, fInputDevice, in_max) < 0) {
64 jack_error(
"Can't use %s, taking default input device", param->value.str);
69 if (fPaDevices.GetOutputDeviceFromName(param->value.str, fOutputDevice, out_max) < 0) {
70 jack_error(
"Can't use %s, taking default output device", param->value.str);
75 SetAdaptedSampleRate(param->value.ui);
78 SetAdaptedBufferSize(param->value.ui);
81 if (fPaDevices.GetInputDeviceFromName(param->value.str, fInputDevice, in_max) < 0)
82 jack_error(
"Can't use %s, taking default input device", param->value.str);
83 if (fPaDevices.GetOutputDeviceFromName(param->value.str, fOutputDevice, out_max) < 0)
84 jack_error(
"Can't use %s, taking default output device", param->value.str);
87 fPaDevices.DisplayDevicesNames();
90 fQuality = param->value.ui;
93 fRingbufferCurSize = param->value.ui;
100 if (in_max == 0 && fInputDevice !=
paNoDevice)
101 in_max = fPaDevices.GetDeviceInfo(fInputDevice)->maxInputChannels;
102 if (out_max == 0 && fOutputDevice !=
paNoDevice)
103 out_max = fPaDevices.GetDeviceInfo(fOutputDevice)->maxOutputChannels;
106 if ((fCaptureChannels == 0) || (fCaptureChannels > in_max))
107 fCaptureChannels = in_max;
108 if ((fPlaybackChannels == 0) || (fPlaybackChannels > out_max))
109 fPlaybackChannels = out_max;
112 SetInputs(fCaptureChannels);
113 SetOutputs(fPlaybackChannels);
116 int JackPortAudioAdapter::Open()
127 jack_log(
"JackPortAudioAdapter::Open fInputDevice = %d DeviceName %s", fInputDevice, fPaDevices.GetFullName(fInputDevice).c_str());
128 jack_log(
"JackPortAudioAdapter::Open fOutputDevice = %d DeviceName %s", fOutputDevice, fPaDevices.GetFullName(fOutputDevice).c_str());
129 jack_log(
"JackPortAudioAdapter::Open fAdaptedBufferSize = %u fAdaptedSampleRate %u", fAdaptedBufferSize, fAdaptedSampleRate);
131 inputParameters.
device = fInputDevice;
135 ? fPaDevices.GetDeviceInfo(fInputDevice)->defaultLowInputLatency
139 outputParameters.
device = fOutputDevice;
143 ? fPaDevices.GetDeviceInfo(fOutputDevice)->defaultLowOutputLatency
148 (fInputDevice ==
paNoDevice) ? 0 : &inputParameters,
149 (fOutputDevice ==
paNoDevice) ? 0 : &outputParameters,
156 if (err != paNoError) {
163 if (err != paNoError) {
168 jack_log(
"JackPortAudioAdapter::Open OK");
172 int JackPortAudioAdapter::Close()
175 fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize);
177 jack_log(
"JackPortAudioAdapter::Close");
179 jack_log(
"JackPortAudioAdapter:: Pa_StopStream");
181 jack_log(
"JackPortAudioAdapter:: Pa_CloseStream");
185 int JackPortAudioAdapter::SetSampleRate(jack_nframes_t sample_rate)
187 JackAudioAdapterInterface::SetHostSampleRate(sample_rate);
192 int JackPortAudioAdapter::SetBufferSize(jack_nframes_t buffer_size)
194 JackAudioAdapterInterface::SetHostBufferSize(buffer_size);
212 desc = jack_driver_descriptor_construct(
"audioadapter", JackDriverNone,
"netjack audio <==> net backend adapter", &filler);
215 jack_driver_descriptor_add_parameter(desc, &filler,
"in-channels",
'i', JackDriverParamInt, &value, NULL,
"Maximum number of input channels", NULL);
216 jack_driver_descriptor_add_parameter(desc, &filler,
"out-channels",
'o', JackDriverParamInt, &value, NULL,
"Maximum number of output channels", NULL);
218 jack_driver_descriptor_add_parameter(desc, &filler,
"capture",
'C', JackDriverParamString, &value, NULL,
"Provide capture ports. Optionally set PortAudio device name", NULL);
220 jack_driver_descriptor_add_parameter(desc, &filler,
"playback",
'P', JackDriverParamString, &value, NULL,
"Provide playback ports. Optionally set PortAudio device name", NULL);
223 jack_driver_descriptor_add_parameter(desc, &filler,
"rate",
'r', JackDriverParamUInt, &value, NULL,
"Sample rate", NULL);
226 jack_driver_descriptor_add_parameter(desc, &filler,
"periodsize",
'p', JackDriverParamUInt, &value, NULL,
"Period size", NULL);
228 jack_driver_descriptor_add_parameter(desc, &filler,
"device",
'd', JackDriverParamString, &value, NULL,
"PortAudio device name", NULL);
231 jack_driver_descriptor_add_parameter(desc, &filler,
"list-devices",
'l', JackDriverParamBool, &value, NULL,
"Display available PortAudio devices", NULL);
234 jack_driver_descriptor_add_parameter(desc, &filler,
"quality",
'q', JackDriverParamInt, &value, NULL,
"Resample algorithm quality (0 - 4)", NULL);
237 jack_driver_descriptor_add_parameter(desc, &filler,
"ring-buffer",
'g', JackDriverParamInt, &value, NULL,
"Fixed ringbuffer size",
"Fixed ringbuffer size (if not set => automatic adaptative)");
PaDeviceIndex Pa_GetDefaultInputDevice(void)
PaError Pa_StopStream(PaStream *stream)
SERVER_EXPORT void jack_error(const char *fmt,...)
PaError Pa_OpenStream(PaStream **stream, const PaStreamParameters *inputParameters, const PaStreamParameters *outputParameters, double sampleRate, unsigned long framesPerBuffer, PaStreamFlags streamFlags, PaStreamCallback *streamCallback, void *userData)
PaError Pa_StartStream(PaStream *stream)
void * hostApiSpecificStreamInfo
PaSampleFormat sampleFormat
unsigned long PaStreamCallbackFlags
PaDeviceIndex Pa_GetDefaultOutputDevice(void)
const char * Pa_GetErrorText(PaError errorCode)
SERVER_EXPORT void jack_log(const char *fmt,...)
PaError Pa_CloseStream(PaStream *stream)