git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3358 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.2
| @@ -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 | |||
| @@ -215,6 +215,8 @@ namespace Jack | |||
| jack_log ( "JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels ); | |||
| return fPlaybackChannels; | |||
| } | |||
| void PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int inNumberFrames); | |||
| }; | |||
| @@ -293,38 +293,22 @@ OSStatus JackCoreAudioAdapter::Render(void *inRefCon, | |||
| { | |||
| JackCoreAudioAdapter* adapter = static_cast<JackCoreAudioAdapter*>(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) | |||
| { | |||
| @@ -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<JackPortAudioAdapter*>(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 ) | |||
| { | |||