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;
63 fAudioInterface.fPeriod = param->value.ui;
66 fAudioInterface.fCardName = strdup ( param->value.str );
69 fAudioInterface.fFrequency = param->value.ui;
70 SetAdaptedSampleRate ( param->value.ui );
73 fAudioInterface.fBuffering = param->value.ui;
74 SetAdaptedBufferSize ( param->value.ui );
77 fQuality = param->value.ui;
80 fRingbufferCurSize = param->value.ui;
86 fAudioInterface.setInputs ( fCaptureChannels );
87 fAudioInterface.setOutputs ( fPlaybackChannels );
90 int JackAlsaAdapter::Open()
93 if ( fAudioInterface.
open() )
97 if ( fThread.StartSync() < 0 )
99 jack_error (
"Cannot start audioadapter thread" );
107 fThread.AcquireRealTime(GetEngineControl()->fClientPriority);
111 int JackAlsaAdapter::Close()
114 fTable.Save(fHostBufferSize, fHostSampleRate, fAdaptedSampleRate, fAdaptedBufferSize);
116 switch ( fThread.GetStatus() )
120 case JackThread::kStarting:
121 case JackThread::kIniting:
122 if ( fThread.Kill() < 0 )
130 case JackThread::kRunning:
131 if ( fThread.Stop() < 0 )
141 return fAudioInterface.close();
147 for (
unsigned int i = 0; i < fAudioInterface.fPeriod; i++ )
148 fAudioInterface.
write();
152 bool JackAlsaAdapter::Execute()
155 if (fAudioInterface.
read() < 0)
158 PushAndPull(fAudioInterface.fInputSoftChannels, fAudioInterface.fOutputSoftChannels, fAdaptedBufferSize);
161 if (fAudioInterface.
write() < 0)
167 int JackAlsaAdapter::SetSampleRate ( jack_nframes_t sample_rate )
169 JackAudioAdapterInterface::SetHostSampleRate ( sample_rate );
174 int JackAlsaAdapter::SetBufferSize ( jack_nframes_t buffer_size )
176 JackAudioAdapterInterface::SetHostBufferSize ( buffer_size );
194 desc = jack_driver_descriptor_construct(
"audioadapter", JackDriverNone,
"netjack audio <==> net backend adapter", &filler);
196 strcpy(value.str,
"none");
197 jack_driver_descriptor_add_parameter(desc, &filler,
"capture",
'C', JackDriverParamString, &value, NULL,
"Provide capture ports. Optionally set device", NULL);
198 jack_driver_descriptor_add_parameter(desc, &filler,
"playback",
'P', JackDriverParamString, &value, NULL,
"Provide playback ports. Optionally set device", NULL);
200 strcpy(value.str,
"hw:0");
201 jack_driver_descriptor_add_parameter(desc, &filler,
"device",
'd', JackDriverParamString, &value, NULL,
"ALSA device name", NULL);
204 jack_driver_descriptor_add_parameter(desc, &filler,
"rate",
'r', JackDriverParamUInt, &value, NULL,
"Sample rate", NULL);
207 jack_driver_descriptor_add_parameter(desc, &filler,
"periodsize",
'p', JackDriverParamUInt, &value, NULL,
"Period size", NULL);
210 jack_driver_descriptor_add_parameter(desc, &filler,
"nperiods",
'n', JackDriverParamUInt, &value, NULL,
"Number of periods of playback latency", NULL);
213 jack_driver_descriptor_add_parameter(desc, &filler,
"duplex",
'D', JackDriverParamBool, &value, NULL,
"Provide both capture and playback ports", NULL);
216 jack_driver_descriptor_add_parameter(desc, &filler,
"in-channels",
'i', JackDriverParamInt, &value, NULL,
"Number of capture channels (defaults to hardware max)", NULL);
217 jack_driver_descriptor_add_parameter(desc, &filler,
"out-channels",
'o', JackDriverParamInt, &value, NULL,
"Number of playback channels (defaults to hardware max)", NULL);
220 jack_driver_descriptor_add_parameter(desc, &filler,
"quality",
'q', JackDriverParamUInt, &value, NULL,
"Resample algorithm quality (0 - 4)", NULL);
223 jack_driver_descriptor_add_parameter(desc, &filler,
"ring-buffer",
'g', JackDriverParamUInt, &value, NULL,
"Fixed ringbuffer size",
"Fixed ringbuffer size (if not set => automatic adaptative)");