git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3356 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.2
@@ -27,7 +27,8 @@ Michael Voigt | |||||
* Fix JackNetDriver::Close method. | * Fix JackNetDriver::Close method. | ||||
* For audio device reservation, add card_to_num function. | * For audio device reservation, add card_to_num function. | ||||
* Fix buffer size and sample rate handling in JackAlsaAdapter. | |||||
* Fix buffer size and sample rate handling in JackAlsaAdapter. | |||||
* Add control for adapter ringbuffer size. | |||||
2009-02-23 Stephane Letz <letz@grame.fr> | 2009-02-23 Stephane Letz <letz@grame.fr> | ||||
@@ -140,9 +140,9 @@ namespace Jack | |||||
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; | fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; | ||||
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; | fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; | ||||
for ( i = 0; i < fCaptureChannels; i++ ) | for ( i = 0; i < fCaptureChannels; i++ ) | ||||
fCaptureRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality()); | |||||
fCaptureRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality(), fAudioAdapter->GetRingbufferSize()); | |||||
for ( i = 0; i < fPlaybackChannels; i++ ) | for ( i = 0; i < fPlaybackChannels; i++ ) | ||||
fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality()); | |||||
fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality(), fAudioAdapter->GetRingbufferSize()); | |||||
fAudioAdapter->SetRingBuffers ( fCaptureRingBuffer, fPlaybackRingBuffer ); | fAudioAdapter->SetRingBuffers ( fCaptureRingBuffer, fPlaybackRingBuffer ); | ||||
if (fCaptureChannels > 0) | if (fCaptureChannels > 0) | ||||
jack_log ( "ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace() ); | jack_log ( "ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace() ); | ||||
@@ -90,7 +90,8 @@ namespace Jack | |||||
JackResampler** fPlaybackRingBuffer; | JackResampler** fPlaybackRingBuffer; | ||||
unsigned int fQuality; | unsigned int fQuality; | ||||
unsigned int fRingbufferSize; | |||||
bool fRunning; | bool fRunning; | ||||
public: | public: | ||||
@@ -104,8 +105,8 @@ namespace Jack | |||||
fAdaptedSampleRate ( sample_rate ), | fAdaptedSampleRate ( sample_rate ), | ||||
fHostDLL ( buffer_size, sample_rate ), | fHostDLL ( buffer_size, sample_rate ), | ||||
fAdaptedDLL ( buffer_size, sample_rate ), | fAdaptedDLL ( buffer_size, sample_rate ), | ||||
fQuality(0), | |||||
fRunning ( false ) | |||||
fQuality(0), fRingbufferSize(DEFAULT_RB_SIZE), | |||||
fRunning(false) | |||||
{} | {} | ||||
virtual ~JackAudioAdapterInterface() | virtual ~JackAudioAdapterInterface() | ||||
@@ -129,6 +130,11 @@ namespace Jack | |||||
void ResetRingBuffers(); | void ResetRingBuffers(); | ||||
unsigned int GetRingbufferSize() | |||||
{ | |||||
return fRingbufferSize; | |||||
} | |||||
unsigned int GetQuality() | unsigned int GetQuality() | ||||
{ | { | ||||
return fQuality; | return fQuality; | ||||
@@ -31,8 +31,8 @@ JackLibSampleRateResampler::JackLibSampleRateResampler() | |||||
jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error)); | jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error)); | ||||
} | } | ||||
JackLibSampleRateResampler::JackLibSampleRateResampler(unsigned int quality) | |||||
:JackResampler(),fRatio(1) | |||||
JackLibSampleRateResampler::JackLibSampleRateResampler(unsigned int quality, unsigned int ringbuffer_size) | |||||
:JackResampler(ringbuffer_size),fRatio(1) | |||||
{ | { | ||||
switch (quality) { | switch (quality) { | ||||
case 0: | case 0: | ||||
@@ -46,7 +46,7 @@ class JackLibSampleRateResampler : public JackResampler | |||||
public: | public: | ||||
JackLibSampleRateResampler(); | JackLibSampleRateResampler(); | ||||
JackLibSampleRateResampler(unsigned int quality); | |||||
JackLibSampleRateResampler(unsigned int quality, unsigned int ringbuffer_size); | |||||
virtual ~JackLibSampleRateResampler(); | virtual ~JackLibSampleRateResampler(); | ||||
unsigned int ReadResample(float* buffer, unsigned int frames); | unsigned int ReadResample(float* buffer, unsigned int frames); | ||||
@@ -28,6 +28,12 @@ JackResampler::JackResampler():fNum(1),fDenom(1) | |||||
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2); | jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2); | ||||
} | } | ||||
JackResampler::JackResampler(unsigned int ringbuffer_size):fNum(1),fDenom(1) | |||||
{ | |||||
fRingBuffer = jack_ringbuffer_create(sizeof(float) * ringbuffer_size); | |||||
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * ringbuffer_size) / 2); | |||||
} | |||||
JackResampler::~JackResampler() | JackResampler::~JackResampler() | ||||
{ | { | ||||
if (fRingBuffer) | if (fRingBuffer) | ||||
@@ -40,10 +40,11 @@ class JackResampler | |||||
jack_ringbuffer_t* fRingBuffer; | jack_ringbuffer_t* fRingBuffer; | ||||
unsigned int fNum; | unsigned int fNum; | ||||
unsigned int fDenom; | unsigned int fDenom; | ||||
public: | public: | ||||
JackResampler(); | JackResampler(); | ||||
JackResampler(unsigned int ringbuffer_size); | |||||
virtual ~JackResampler(); | virtual ~JackResampler(); | ||||
virtual void Reset(); | virtual void Reset(); | ||||
@@ -66,16 +66,19 @@ namespace Jack | |||||
fAudioInterface.fCardName = strdup ( param->value.str ); | fAudioInterface.fCardName = strdup ( param->value.str ); | ||||
break; | break; | ||||
case 'r': | case 'r': | ||||
fAudioInterface.fFrequency = param->value.ui; | |||||
fAudioInterface.fFrequency = param->value.ui; | |||||
SetAdaptedSampleRate ( param->value.ui ); | SetAdaptedSampleRate ( param->value.ui ); | ||||
break; | break; | ||||
case 'p': | case 'p': | ||||
fAudioInterface.fBuffering = param->value.ui; | |||||
fAudioInterface.fBuffering = param->value.ui; | |||||
SetAdaptedBufferSize ( param->value.ui ); | SetAdaptedBufferSize ( param->value.ui ); | ||||
break; | break; | ||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
break; | break; | ||||
case 'g': | |||||
fRingbufferSize = param->value.ui; | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -222,7 +225,7 @@ extern "C" | |||||
strcpy ( desc->name, "audioadapter" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | strcpy ( desc->name, "audioadapter" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | ||||
strcpy ( desc->desc, "netjack audio <==> net backend adapter" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | strcpy ( desc->desc, "netjack audio <==> net backend adapter" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | ||||
desc->nparams = 10; | |||||
desc->nparams = 11; | |||||
desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) ); | ||||
i = 0; | i = 0; | ||||
@@ -310,6 +313,14 @@ extern "C" | |||||
desc->params[i].value.ui = 0; | desc->params[i].value.ui = 0; | ||||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | ||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | ||||
i++; | |||||
strcpy(desc->params[i].name, "ring-buffer"); | |||||
desc->params[i].character = 'g'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.ui = 0; | |||||
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 32768)"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||
@@ -392,6 +392,10 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, | |||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
break; | break; | ||||
case 'g': | |||||
fRingbufferSize = param->value.ui; | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -997,7 +1001,7 @@ extern "C" | |||||
strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | ||||
strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | ||||
desc->nparams = 11; | |||||
desc->nparams = 12; | |||||
desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | ||||
i = 0; | i = 0; | ||||
@@ -1087,6 +1091,14 @@ extern "C" | |||||
desc->params[i].value.ui = 0; | desc->params[i].value.ui = 0; | ||||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | ||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | ||||
i++; | |||||
strcpy(desc->params[i].name, "ring-buffer"); | |||||
desc->params[i].character = 'g'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.ui = 0; | |||||
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 32768)"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||
@@ -181,6 +181,10 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample | |||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
break; | break; | ||||
case 'g': | |||||
fRingbufferSize = param->value.ui; | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -756,6 +760,14 @@ extern "C" | |||||
desc->params[i].value.ui = 0; | desc->params[i].value.ui = 0; | ||||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | ||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | ||||
i++; | |||||
strcpy(desc->params[i].name, "ring-buffer"); | |||||
desc->params[i].character = 'g'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.ui = 0; | |||||
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 32768)"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||
@@ -34,7 +34,7 @@ namespace Jack | |||||
typedef jack_default_audio_sample_t jack_sample_t; | typedef jack_default_audio_sample_t jack_sample_t; | ||||
#define OSS_DRIVER_N_PARAMS 12 | |||||
#define OSS_DRIVER_N_PARAMS 13 | |||||
#define OSS_DRIVER_DEF_DEV "/dev/dsp" | #define OSS_DRIVER_DEF_DEV "/dev/dsp" | ||||
#define OSS_DRIVER_DEF_FS 48000 | #define OSS_DRIVER_DEF_FS 48000 | ||||
#define OSS_DRIVER_DEF_BLKSIZE 1024 | #define OSS_DRIVER_DEF_BLKSIZE 1024 | ||||
@@ -128,6 +128,9 @@ namespace Jack | |||||
case 'q': | case 'q': | ||||
fQuality = param->value.ui; | fQuality = param->value.ui; | ||||
break; | break; | ||||
case 'g': | |||||
fRingbufferSize = param->value.ui; | |||||
break; | |||||
} | } | ||||
} | } | ||||
@@ -247,7 +250,7 @@ extern "C" | |||||
strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | strcpy(desc->name, "audioadapter"); // size MUST be less then JACK_DRIVER_NAME_MAX + 1 | ||||
strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | strcpy(desc->desc, "netjack audio <==> net backend adapter"); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1 | ||||
desc->nparams = 9; | |||||
desc->nparams = 10; | |||||
desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | desc->params = (jack_driver_param_desc_t*)calloc(desc->nparams, sizeof(jack_driver_param_desc_t)); | ||||
i = 0; | i = 0; | ||||
@@ -322,6 +325,14 @@ extern "C" | |||||
desc->params[i].value.ui = 0; | desc->params[i].value.ui = 0; | ||||
strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); | ||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | ||||
i++; | |||||
strcpy(desc->params[i].name, "ring-buffer"); | |||||
desc->params[i].character = 'g'; | |||||
desc->params[i].type = JackDriverParamInt; | |||||
desc->params[i].value.ui = 0; | |||||
strcpy(desc->params[i].short_desc, "Resampling ringbuffer size in frames (default = 32768)"); | |||||
strcpy(desc->params[i].long_desc, desc->params[i].short_desc); | |||||
return desc; | return desc; | ||||
} | } | ||||