diff --git a/ChangeLog b/ChangeLog index da106547..e1c71422 100644 --- a/ChangeLog +++ b/ChangeLog @@ -27,7 +27,8 @@ Michael Voigt * Fix JackNetDriver::Close method. * 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 diff --git a/common/JackAudioAdapter.cpp b/common/JackAudioAdapter.cpp index bffc6323..fe4e2c12 100644 --- a/common/JackAudioAdapter.cpp +++ b/common/JackAudioAdapter.cpp @@ -140,9 +140,9 @@ namespace Jack fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; 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++ ) - fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality()); + fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality(), fAudioAdapter->GetRingbufferSize()); fAudioAdapter->SetRingBuffers ( fCaptureRingBuffer, fPlaybackRingBuffer ); if (fCaptureChannels > 0) jack_log ( "ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace() ); diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index f5e4d4b5..180ac37c 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -90,7 +90,8 @@ namespace Jack JackResampler** fPlaybackRingBuffer; unsigned int fQuality; - + unsigned int fRingbufferSize; + bool fRunning; public: @@ -104,8 +105,8 @@ namespace Jack fAdaptedSampleRate ( sample_rate ), fHostDLL ( buffer_size, sample_rate ), fAdaptedDLL ( buffer_size, sample_rate ), - fQuality(0), - fRunning ( false ) + fQuality(0), fRingbufferSize(DEFAULT_RB_SIZE), + fRunning(false) {} virtual ~JackAudioAdapterInterface() @@ -129,6 +130,11 @@ namespace Jack void ResetRingBuffers(); + unsigned int GetRingbufferSize() + { + return fRingbufferSize; + } + unsigned int GetQuality() { return fQuality; diff --git a/common/JackLibSampleRateResampler.cpp b/common/JackLibSampleRateResampler.cpp index f7d90154..a2dfb472 100644 --- a/common/JackLibSampleRateResampler.cpp +++ b/common/JackLibSampleRateResampler.cpp @@ -31,8 +31,8 @@ JackLibSampleRateResampler::JackLibSampleRateResampler() 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) { case 0: diff --git a/common/JackLibSampleRateResampler.h b/common/JackLibSampleRateResampler.h index 480097c9..4e190c38 100644 --- a/common/JackLibSampleRateResampler.h +++ b/common/JackLibSampleRateResampler.h @@ -46,7 +46,7 @@ class JackLibSampleRateResampler : public JackResampler public: JackLibSampleRateResampler(); - JackLibSampleRateResampler(unsigned int quality); + JackLibSampleRateResampler(unsigned int quality, unsigned int ringbuffer_size); virtual ~JackLibSampleRateResampler(); unsigned int ReadResample(float* buffer, unsigned int frames); diff --git a/common/JackResampler.cpp b/common/JackResampler.cpp index f09b0413..3ad74b07 100644 --- a/common/JackResampler.cpp +++ b/common/JackResampler.cpp @@ -28,6 +28,12 @@ JackResampler::JackResampler():fNum(1),fDenom(1) 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() { if (fRingBuffer) diff --git a/common/JackResampler.h b/common/JackResampler.h index d656d59d..dc074f26 100644 --- a/common/JackResampler.h +++ b/common/JackResampler.h @@ -40,10 +40,11 @@ class JackResampler jack_ringbuffer_t* fRingBuffer; unsigned int fNum; unsigned int fDenom; - + public: JackResampler(); + JackResampler(unsigned int ringbuffer_size); virtual ~JackResampler(); virtual void Reset(); diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index 9ff4f120..2db2b15f 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -66,16 +66,19 @@ namespace Jack fAudioInterface.fCardName = strdup ( param->value.str ); break; case 'r': - fAudioInterface.fFrequency = param->value.ui; + fAudioInterface.fFrequency = param->value.ui; SetAdaptedSampleRate ( param->value.ui ); break; case 'p': - fAudioInterface.fBuffering = param->value.ui; + fAudioInterface.fBuffering = param->value.ui; SetAdaptedBufferSize ( param->value.ui ); break; case 'q': fQuality = param->value.ui; 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->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 ) ); i = 0; @@ -310,6 +313,14 @@ extern "C" desc->params[i].value.ui = 0; strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); 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; } diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp index d28f5cec..ba644f0c 100644 --- a/macosx/coreaudio/JackCoreAudioAdapter.cpp +++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp @@ -392,6 +392,10 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, case 'q': fQuality = param->value.ui; 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->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)); i = 0; @@ -1087,6 +1091,14 @@ extern "C" desc->params[i].value.ui = 0; strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); 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; } diff --git a/solaris/oss/JackOSSAdapter.cpp b/solaris/oss/JackOSSAdapter.cpp index e8cc5556..1dac6f5b 100644 --- a/solaris/oss/JackOSSAdapter.cpp +++ b/solaris/oss/JackOSSAdapter.cpp @@ -181,6 +181,10 @@ JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample case 'q': fQuality = param->value.ui; break; + + case 'g': + fRingbufferSize = param->value.ui; + break; } } @@ -756,6 +760,14 @@ extern "C" desc->params[i].value.ui = 0; strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); 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; } diff --git a/solaris/oss/JackOSSAdapter.h b/solaris/oss/JackOSSAdapter.h index 1a6dbe21..6e739f88 100644 --- a/solaris/oss/JackOSSAdapter.h +++ b/solaris/oss/JackOSSAdapter.h @@ -34,7 +34,7 @@ namespace Jack 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_FS 48000 #define OSS_DRIVER_DEF_BLKSIZE 1024 diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index d4dd31e8..41df3ead 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -128,6 +128,9 @@ namespace Jack case 'q': fQuality = param->value.ui; 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->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)); i = 0; @@ -322,6 +325,14 @@ extern "C" desc->params[i].value.ui = 0; strcpy(desc->params[i].short_desc, "Resample algorithm quality (0 - 4)"); 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; }