Browse Source

Share some code in JackAudioAdapterInterface class.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3358 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.9.2
sletz 17 years ago
parent
commit
f42e0a4b0a
4 changed files with 54 additions and 67 deletions
  1. +33
    -0
      common/JackAudioAdapterInterface.cpp
  2. +2
    -0
      common/JackAudioAdapterInterface.h
  3. +9
    -25
      macosx/coreaudio/JackCoreAudioAdapter.cpp
  4. +10
    -42
      windows/portaudio/JackPortAudioAdapter.cpp

+ 33
- 0
common/JackAudioAdapterInterface.cpp View File

@@ -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

+ 2
- 0
common/JackAudioAdapterInterface.h View File

@@ -215,6 +215,8 @@ namespace Jack
jack_log ( "JackAudioAdapterInterface::GetOutputs %d", fPlaybackChannels );
return fPlaybackChannels;
}
void PushAndPull(float** inputBuffer, float** outputBuffer, unsigned int inNumberFrames);

};



+ 9
- 25
macosx/coreaudio/JackCoreAudioAdapter.cpp View File

@@ -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)
{



+ 10
- 42
windows/portaudio/JackPortAudioAdapter.cpp View File

@@ -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 )
{


Loading…
Cancel
Save