diff --git a/ChangeLog b/ChangeLog index 74b49830..3e9e10fa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,10 @@ Romain Moret Jackdmp changes log --------------------------- +2008-07-18 Stephane Letz + + * Correct audioadapter when a sample rate value different from jack server one is chosen. + 2008-07-12 Stephane Letz * Loopback driver working again. diff --git a/common/JackAudioAdapterInterface.cpp b/common/JackAudioAdapterInterface.cpp index 546e404d..b3f506f2 100644 --- a/common/JackAudioAdapterInterface.cpp +++ b/common/JackAudioAdapterInterface.cpp @@ -81,7 +81,8 @@ void JackAudioAdapterInterface::ResampleFactor(jack_nframes_t& frame1, jack_nfra jack_nframes_t time2 = fProducerDLL.Time2Frames(time); frame1 = time1; frame2 = time2; - jack_log("JackAudioAdapterInterface::ResampleFactor src_ratio_input = %f src_ratio_output = %f", double(time1) / double(time2), double(time2) / double(time1)); + jack_log("JackAudioAdapterInterface::ResampleFactor time1 = %ld time2 = %ld src_ratio_input = %f src_ratio_output = %f", + long(time1), long(time2), double(time1) / double(time2), double(time2) / double(time1)); } } diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index 6fbd1a55..f8c23951 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -120,7 +120,15 @@ namespace Jack { fSampleRate = sample_rate; fConsumerDLL.Init(fBufferSize, fSampleRate); - // Producer (Audio) keep the same SR + // Producer (Audio) keeps the same SR + return 0; + } + + virtual int SetIntSampleRate(jack_nframes_t sample_rate) + { + fSampleRate = sample_rate; + // Consummer (Audio) keeps the same SR + fProducerDLL.Init(fBufferSize, fSampleRate); return 0; } diff --git a/common/JackFilters.h b/common/JackFilters.h index 1e8195f8..89e8f551 100644 --- a/common/JackFilters.h +++ b/common/JackFilters.h @@ -116,14 +116,14 @@ namespace Jack jack_nframes_t Time2Frames(jack_time_t time) { - jack_nframes_t res = fFrames + (long) rint(((double) (long(time - fCurrentWakeup)) / ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) * fBufferSize); - return (res < 0) ? 1 : res; + long delta = (long) rint(((double) (long(time - fCurrentWakeup)) / ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) * fBufferSize); + return (delta < 0) ? ((fFrames > 0) ? fFrames : 1) : (fFrames + delta); } jack_time_t Frames2Time(jack_nframes_t frames) { - jack_time_t res = fCurrentWakeup + (long) rint(((double) (long(frames - fFrames)) * ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) / fBufferSize); - return (res < 0) ? 1 : res; + long delta = (long) rint(((double) (long(frames - fFrames)) * ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) / fBufferSize); + return (delta < 0) ? ((fCurrentWakeup > 0) ? fCurrentWakeup : 1) : (fCurrentWakeup + delta); } jack_nframes_t CurFrame() @@ -203,11 +203,6 @@ namespace Jack } }; - inline float Range(float min, float max, float val) - { - return (val < min) ? min : ((val > max) ? max : val); - } - } #endif diff --git a/common/JackLibSampleRateResampler.cpp b/common/JackLibSampleRateResampler.cpp index 0d4aa65d..be3eb2a4 100644 --- a/common/JackLibSampleRateResampler.cpp +++ b/common/JackLibSampleRateResampler.cpp @@ -67,7 +67,7 @@ unsigned int JackLibSampleRateResampler::ReadResample(float* buffer, unsigned in res = src_process(fResampler, &src_data); if (res != 0) { - jack_error("JackLibSampleRateResampler::ReadResample err = %s", src_strerror(res)); + jack_error("JackLibSampleRateResampler::ReadResample ratio = %f err = %s", fRatio, src_strerror(res)); return 0; } @@ -117,7 +117,7 @@ unsigned int JackLibSampleRateResampler::WriteResample(float* buffer, unsigned i res = src_process(fResampler, &src_data); if (res != 0) { - jack_error("JackLibSampleRateResampler::ReadResample err = %s", src_strerror(res)); + jack_error("JackLibSampleRateResampler::ReadResample ratio = %f err = %s", fRatio, src_strerror(res)); return 0; } diff --git a/common/JackLibSampleRateResampler.h b/common/JackLibSampleRateResampler.h index 1127f889..2708416a 100644 --- a/common/JackLibSampleRateResampler.h +++ b/common/JackLibSampleRateResampler.h @@ -26,6 +26,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { + inline float Range(float min, float max, float val) + { + return (val < min) ? min : ((val > max) ? max : val); + } + class JackLibSampleRateResampler : public JackResampler { @@ -45,7 +50,7 @@ namespace Jack void SetRatio(unsigned int num, unsigned int denom) { JackResampler::SetRatio(num, denom); - fRatio = double(num) / double(denom); + fRatio = Range(0.25f, 4.0f, (double(num) / double(denom))); } void Reset(); diff --git a/linux/alsa/JackAlsaAdapter.cpp b/linux/alsa/JackAlsaAdapter.cpp index 993c36ce..b448e89d 100644 --- a/linux/alsa/JackAlsaAdapter.cpp +++ b/linux/alsa/JackAlsaAdapter.cpp @@ -62,7 +62,7 @@ namespace Jack break; case 'r': - SetSampleRate(param->value.ui); + SetIntSampleRate(param->value.ui); break; } } diff --git a/macosx/JackCoreAudioAdapter.cpp b/macosx/JackCoreAudioAdapter.cpp index 3bea310f..0c0366b7 100644 --- a/macosx/JackCoreAudioAdapter.cpp +++ b/macosx/JackCoreAudioAdapter.cpp @@ -188,7 +188,7 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, break; case 'r': - SetSampleRate(param->value.ui); + SetIntSampleRate(param->value.ui); break; case 'l': diff --git a/windows/JackPortAudioAdapter.cpp b/windows/JackPortAudioAdapter.cpp index 6a755238..5adbeb8d 100644 --- a/windows/JackPortAudioAdapter.cpp +++ b/windows/JackPortAudioAdapter.cpp @@ -111,7 +111,7 @@ JackPortAudioAdapter::JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nfra break; case 'r': - SetSampleRate(param->value.ui); + SetIntSampleRate(param->value.ui); break; case 'd':