20 #if defined(HAVE_CONFIG_H)
24 #include "JackAlsaAdapter.h"
25 #include "JackGlobals.h"
26 #include "JackEngineControl.h"
31 JackAlsaAdapter::JackAlsaAdapter ( jack_nframes_t buffer_size, jack_nframes_t sample_rate,
const JSList* params ) :
32 JackAudioAdapterInterface ( buffer_size, sample_rate ),
34 fAudioInterface ( buffer_size, sample_rate )
40 fPlaybackChannels = 2;
42 fAudioInterface.fPeriod = 2;
44 for ( node = params; node; node = jack_slist_next ( node ) )
48 switch ( param->character )
51 fCaptureChannels = param->value.ui;
54 fPlaybackChannels = param->value.ui;
57 if (strncmp(param->value.str,
"none",4) != 0) {
58 fAudioInterface.fCaptureName = strdup ( param->value.str );
62 if (strncmp(param->value.str,
"none",4) != 0) {
63 fAudioInterface.fPlaybackName = strdup ( param->value.str );
69 fAudioInterface.fPeriod = param->value.ui;
72 fAudioInterface.fCardName = strdup ( param->value.str );
75 fAudioInterface.fFrequency = param->value.ui;
76 SetAdaptedSampleRate ( param->value.ui );
79 fAudioInterface.fBuffering = param->value.ui;
80 SetAdaptedBufferSize ( param->value.ui );
83 fQuality = param->value.ui;
86 fRingbufferCurSize = param->value.ui;
92 fAudioInterface.setInputs ( fCaptureChannels );
93 fAudioInterface.setOutputs ( fPlaybackChannels );
96 int JackAlsaAdapter::Open()
99 if ( fAudioInterface.
open() )
103 if ( fThread.StartSync() < 0 )
105 jack_error (
"Cannot start audioadapter thread" );
113 fThread.AcquireRealTime(GetEngineControl()->fClientPriority);
117 int JackAlsaAdapter::Close()
120 fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize);
122 switch ( fThread.GetStatus() )
126 case JackThread::kStarting:
127 case JackThread::kIniting:
128 if ( fThread.Kill() < 0 )
136 case JackThread::kRunning:
137 if ( fThread.Stop() < 0 )
147 return fAudioInterface.close();
153 for (
unsigned int i = 0; i < fAudioInterface.fPeriod; i++ )
154 fAudioInterface.
write();
158 bool JackAlsaAdapter::Execute()
161 if (fAudioInterface.
read() < 0)
164 PushAndPull(fAudioInterface.fInputSoftChannels, fAudioInterface.fOutputSoftChannels, fAdaptedBufferSize);
167 if (fAudioInterface.
write() < 0)
173 int JackAlsaAdapter::SetSampleRate ( jack_nframes_t sample_rate )
175 JackAudioAdapterInterface::SetHostSampleRate ( sample_rate );
180 int JackAlsaAdapter::SetBufferSize ( jack_nframes_t buffer_size )
182 JackAudioAdapterInterface::SetHostBufferSize ( buffer_size );
200 desc = jack_driver_descriptor_construct(
"audioadapter", JackDriverNone,
"netjack audio <==> net backend adapter", &filler);
202 strcpy(value.str,
"none");
203 jack_driver_descriptor_add_parameter(desc, &filler,
"capture",
'C', JackDriverParamString, &value, NULL,
"Provide capture ports. Optionally set device", NULL);
204 jack_driver_descriptor_add_parameter(desc, &filler,
"playback",
'P', JackDriverParamString, &value, NULL,
"Provide playback ports. Optionally set device", NULL);
206 strcpy(value.str,
"hw:0");
207 jack_driver_descriptor_add_parameter(desc, &filler,
"device",
'd', JackDriverParamString, &value, NULL,
"ALSA device name", NULL);
210 jack_driver_descriptor_add_parameter(desc, &filler,
"rate",
'r', JackDriverParamUInt, &value, NULL,
"Sample rate", NULL);
213 jack_driver_descriptor_add_parameter(desc, &filler,
"periodsize",
'p', JackDriverParamUInt, &value, NULL,
"Period size", NULL);
216 jack_driver_descriptor_add_parameter(desc, &filler,
"nperiods",
'n', JackDriverParamUInt, &value, NULL,
"Number of periods of playback latency", NULL);
219 jack_driver_descriptor_add_parameter(desc, &filler,
"duplex",
'D', JackDriverParamBool, &value, NULL,
"Provide both capture and playback ports", NULL);
222 jack_driver_descriptor_add_parameter(desc, &filler,
"in-channels",
'i', JackDriverParamInt, &value, NULL,
"Number of capture channels (defaults to hardware max)", NULL);
223 jack_driver_descriptor_add_parameter(desc, &filler,
"out-channels",
'o', JackDriverParamInt, &value, NULL,
"Number of playback channels (defaults to hardware max)", NULL);
226 jack_driver_descriptor_add_parameter(desc, &filler,
"quality",
'q', JackDriverParamUInt, &value, NULL,
"Resample algorithm quality (0 - 4)", NULL);
229 jack_driver_descriptor_add_parameter(desc, &filler,
"ring-buffer",
'g', JackDriverParamUInt, &value, NULL,
"Fixed ringbuffer size",
"Fixed ringbuffer size (if not set => automatic adaptative)");
SERVER_EXPORT void jack_error(const char *fmt,...)