From f42e0a4b0a9fce260450a802af1023ac58ec093f Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 25 Feb 2009 23:01:55 +0000 Subject: [PATCH] Share some code in JackAudioAdapterInterface class. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3358 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackAudioAdapterInterface.cpp | 33 ++++++++++++++ common/JackAudioAdapterInterface.h | 2 + macosx/coreaudio/JackCoreAudioAdapter.cpp | 34 ++++---------- windows/portaudio/JackPortAudioAdapter.cpp | 52 +++++----------------- 4 files changed, 54 insertions(+), 67 deletions(-) diff --git a/common/JackAudioAdapterInterface.cpp b/common/JackAudioAdapterInterface.cpp index 2ce9ef47..dea2d1f3 100644 --- a/common/JackAudioAdapterInterface.cpp +++ b/common/JackAudioAdapterInterface.cpp @@ -141,5 +141,38 @@ namespace Jack { return 0; } + + void JackAudioAdapterInterface::PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int inNumberFrames) + { + bool failure = false; + + jack_time_t time1, time2; + ResampleFactor(time1, time2); + + for (int i = 0; i < fCaptureChannels; i++) { + fCaptureRingBuffer[i]->SetRatio(time1, time2); + if (fCaptureRingBuffer[i]->WriteResample(inputBuffer[i], inNumberFrames) < inNumberFrames) + failure = true; + } + + for (int i = 0; i < fPlaybackChannels; i++) { + fPlaybackRingBuffer[i]->SetRatio(time2, time1); + if (fPlaybackRingBuffer[i]->ReadResample(outputBuffer[i], inNumberFrames) < inNumberFrames) + failure = true; + } + + #ifdef JACK_MONITOR + fTable.Write(time1, time2, double(time1) / double(time2), double(time2) / double(time1), + fCaptureRingBuffer[0]->ReadSpace(), fPlaybackRingBuffer[0]->WriteSpace()); + #endif + + // Reset all ringbuffers in case of failure + if (failure) { + jack_error("JackAudioAdapterInterface::PushAndPull ringbuffer failure... reset"); + ResetRingBuffers(); + } + } + + } // namespace diff --git a/common/JackAudioAdapterInterface.h b/common/JackAudioAdapterInterface.h index 180ac37c..6647d008 100644 --- a/common/JackAudioAdapterInterface.h +++ b/common/JackAudioAdapterInterface.h @@ -215,6 +215,8 @@ namespace Jack jack_log ( "JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels ); return fPlaybackChannels; } + + void PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int inNumberFrames); }; diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp index ba644f0c..516cf72f 100644 --- a/macosx/coreaudio/JackCoreAudioAdapter.cpp +++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp @@ -293,38 +293,22 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, { JackCoreAudioAdapter* adapter = static_cast(inRefCon); AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData); - bool failure = false; - - jack_time_t time1, time2; - adapter->ResampleFactor(time1, time2); - + + float* inputBuffer[adapter->fCaptureChannels]; + float* outputBuffer[adapter->fPlaybackChannels]; + for (int i = 0; i < adapter->fCaptureChannels; i++) { - adapter->fCaptureRingBuffer[i]->SetRatio(time1, time2); - if (adapter->fCaptureRingBuffer[i]->WriteResample((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames) < inNumberFrames) - failure = true; + inputBuffer[i] = (float*)adapter->fInputData->mBuffers[i].mData; } - for (int i = 0; i < adapter->fPlaybackChannels; i++) { - adapter->fPlaybackRingBuffer[i]->SetRatio(time2, time1); - if (adapter->fPlaybackRingBuffer[i]->ReadResample((float*)ioData->mBuffers[i].mData, inNumberFrames) < inNumberFrames) - failure = true; - } - -#ifdef JACK_MONITOR - adapter->fTable.Write(time1, time2, double(time1) / double(time2), double(time2) / double(time1), - adapter->fCaptureRingBuffer[0]->ReadSpace(), adapter->fPlaybackRingBuffer[0]->WriteSpace()); -#endif - - // Reset all ringbuffers in case of failure - if (failure) { - jack_error("JackCoreAudioAdapter::Render ringbuffer failure... reset"); - adapter->ResetRingBuffers(); + outputBuffer[i] = (float*)ioData->mBuffers[i].mData; } - + + adapter->PushAndPull((float**)inputBuffer, (float**)outputBuffer, inNumberFrames); return noErr; } - JackCoreAudioAdapter::JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) +JackCoreAudioAdapter::JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params) :JackAudioAdapterInterface(buffer_size, sample_rate), fInputData(0), fCapturing(false), fPlaying(false), fState(false) { diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index 41df3ead..a7aa9619 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -26,51 +26,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { - - int JackPortAudioAdapter::Render ( const void* inputBuffer, - void* outputBuffer, - unsigned long framesPerBuffer, - const PaStreamCallbackTimeInfo* timeInfo, - PaStreamCallbackFlags statusFlags, - void* userData) + + int JackPortAudioAdapter::Render(const void* inputBuffer, + void* outputBuffer, + unsigned long framesPerBuffer, + const PaStreamCallbackTimeInfo* timeInfo, + PaStreamCallbackFlags statusFlags, + void* userData) { JackPortAudioAdapter* adapter = static_cast(userData); - float** paBuffer; - bool failure = false; - - jack_time_t time1, time2; - adapter->ResampleFactor ( time1, time2 ); - - paBuffer = (float**)inputBuffer; - for ( int i = 0; i < adapter->fCaptureChannels; i++ ) - { - adapter->fCaptureRingBuffer[i]->SetRatio ( time1, time2 ); - if (adapter->fCaptureRingBuffer[i]->WriteResample ( (float*)paBuffer[i], framesPerBuffer ) < framesPerBuffer ) - failure = true; - } - - paBuffer = (float**)outputBuffer; - for ( int i = 0; i < adapter->fPlaybackChannels; i++ ) - { - adapter->fPlaybackRingBuffer[i]->SetRatio ( time2, time1 ); - if ( adapter->fPlaybackRingBuffer[i]->ReadResample ( (float*)paBuffer[i], framesPerBuffer ) < framesPerBuffer ) - failure = true; - } - -#ifdef JACK_MONITOR - adapter->fTable.Write ( time1, time2, double(time1) / double(time2), double(time2) / double(time1), - adapter->fCaptureRingBuffer[0]->ReadSpace(), adapter->fPlaybackRingBuffer[0]->WriteSpace() ); -#endif - - // Reset all ringbuffers in case of failure - if ( failure ) - { - jack_error ( "JackPortAudioAdapter::Render ringbuffer failure... reset" ); - adapter->ResetRingBuffers(); - } - return paContinue; + adapter->PushAndPull((float**)inputBuffer, (float**)outputBuffer, framesPerBuffer); + return noErr; } - + JackPortAudioAdapter::JackPortAudioAdapter ( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params ) : JackAudioAdapterInterface ( buffer_size, sample_rate ) {