diff --git a/common/JackCallbackNetIOAdapter.cpp b/common/JackCallbackNetIOAdapter.cpp index 1f16ecc8..5c08fb8c 100644 --- a/common/JackCallbackNetIOAdapter.cpp +++ b/common/JackCallbackNetIOAdapter.cpp @@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "JackCallbackNetIOAdapter.h" +#include "JackLibSampleRateResampler.h" #include "JackError.h" #include "JackExports.h" #include @@ -51,17 +52,17 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) //jack_info("ReadSpace = %ld", adapter->fCaptureRingBuffer[0].ReadSpace()); //jack_info("WriteSpace = %ld", adapter->fPlaybackRingBuffer[0].WriteSpace()); - printf("ReadSpace = %ld\n", adapter->fCaptureRingBuffer[0].ReadSpace()); - printf("WriteSpace = %ld\n", adapter->fPlaybackRingBuffer[0].WriteSpace()); + printf("ReadSpace = %ld\n", adapter->fCaptureRingBuffer[0]->ReadSpace()); + printf("WriteSpace = %ld\n", adapter->fPlaybackRingBuffer[0]->WriteSpace()); for (i = 0; i < adapter->fCaptureChannels; i++) { buffer = static_cast(jack_port_get_buffer(adapter->fCapturePortList[i], frames)); - adapter->fCaptureRingBuffer[i].Read(buffer, frames); + adapter->fCaptureRingBuffer[i]->Read(buffer, frames); } for (i = 0; i < adapter->fPlaybackChannels; i++) { buffer = static_cast(jack_port_get_buffer(adapter->fPlaybackPortList[i], frames)); - adapter->fPlaybackRingBuffer[i].Write(buffer, frames); + adapter->fPlaybackRingBuffer[i]->Write(buffer, frames); } return 0; @@ -80,35 +81,25 @@ JackCallbackNetIOAdapter::JackCallbackNetIOAdapter(jack_client_t* jack_client, int output) : JackNetIOAdapter(jack_client, audio_io, input, output) { + int i; fCurCallbackTime = 0; fLastCallbackTime = 0; - fCaptureRingBuffer = new JackResampler[fCaptureChannels]; - fPlaybackRingBuffer = new JackResampler[fPlaybackChannels]; - - fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); + fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; + fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; - // Init Ringbuffers - /* - int frames = jack_get_buffer_size(jack_client); - float buffer[frames]; - int i; - for (i = 0; i < fCaptureChannels; i++) { - fCaptureRingBuffer[i].Read(buffer, frames); - fCaptureRingBuffer[i].Read(buffer, frames); - fCaptureRingBuffer[i].Read(buffer, frames); + fCaptureRingBuffer[i] = new JackLibSampleRateResampler(); } for (i = 0; i < fPlaybackChannels; i++) { - fPlaybackRingBuffer[i].Write(buffer, frames); - fPlaybackRingBuffer[i].Write(buffer, frames); - fPlaybackRingBuffer[i].Write(buffer, frames); - } - */ - - jack_log("ReadSpace = %ld", fCaptureRingBuffer[0].ReadSpace()); - jack_log("WriteSpace = %ld", fPlaybackRingBuffer[0].WriteSpace()); + fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(); + } + + fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); + + jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace()); + jack_log("WriteSpace = %ld", fPlaybackRingBuffer[0]->WriteSpace()); if (jack_set_process_callback(fJackClient, Process, this) < 0) goto fail; @@ -127,6 +118,16 @@ fail: JackCallbackNetIOAdapter::~JackCallbackNetIOAdapter() { + int i; + + for (i = 0; i < fCaptureChannels; i++) { + delete(fCaptureRingBuffer[i]); + } + + for (i = 0; i < fPlaybackChannels; i++) { + delete(fPlaybackRingBuffer[i]); + } + delete[] fCaptureRingBuffer; delete[] fPlaybackRingBuffer; } diff --git a/common/JackCallbackNetIOAdapter.h b/common/JackCallbackNetIOAdapter.h index dc169dc3..88def316 100644 --- a/common/JackCallbackNetIOAdapter.h +++ b/common/JackCallbackNetIOAdapter.h @@ -31,8 +31,8 @@ namespace Jack private: - JackResampler* fCaptureRingBuffer; - JackResampler* fPlaybackRingBuffer; + JackResampler** fCaptureRingBuffer; + JackResampler** fPlaybackRingBuffer; jack_time_t fLastCallbackTime; jack_time_t fCurCallbackTime; diff --git a/common/JackFilters.h b/common/JackFilters.h index 645009b5..3a542354 100644 --- a/common/JackFilters.h +++ b/common/JackFilters.h @@ -125,7 +125,6 @@ namespace Jack } }; - inline float Range(float min, float max, float val) { diff --git a/common/JackIOAdapter.h b/common/JackIOAdapter.h index 3a064d5a..34d2aae2 100644 --- a/common/JackIOAdapter.h +++ b/common/JackIOAdapter.h @@ -52,10 +52,10 @@ namespace Jack // DLL JackDelayLockedLoop fProducerDLL; JackDelayLockedLoop fConsumerDLL; - jack_time_t fCurFrames; - JackResampler* fCaptureRingBuffer; - JackResampler* fPlaybackRingBuffer; + JackResampler** fCaptureRingBuffer; + JackResampler** fPlaybackRingBuffer; + bool fRunning; public: @@ -75,7 +75,7 @@ namespace Jack virtual ~JackIOAdapterInterface() {} - void SetRingBuffers(JackResampler* input, JackResampler* output) + void SetRingBuffers(JackResampler** input, JackResampler** output) { fCaptureRingBuffer = input; fPlaybackRingBuffer = output; diff --git a/common/JackLibSampleRateResampler.cpp b/common/JackLibSampleRateResampler.cpp index 826d5bef..614bbe93 100644 --- a/common/JackLibSampleRateResampler.cpp +++ b/common/JackLibSampleRateResampler.cpp @@ -22,8 +22,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { -JackLibSampleRateResampler::JackLibSampleRateResampler():JackResampler(),fRatio(1) +JackLibSampleRateResampler::JackLibSampleRateResampler() + :JackResampler(),fRatio(1) { + jack_log("JackLibSampleRateResampler::JackLibSampleRateResampler"); int error; fResampler = src_new(SRC_LINEAR, 1, &error); if (error != 0) diff --git a/common/JackLibSampleRateResampler.h b/common/JackLibSampleRateResampler.h index 4a655da9..51def13c 100644 --- a/common/JackLibSampleRateResampler.h +++ b/common/JackLibSampleRateResampler.h @@ -42,7 +42,7 @@ namespace Jack int ReadResample(float* buffer, unsigned int frames); int WriteResample(float* buffer, unsigned int frames); - virtual void SetRatio(unsigned int num, unsigned int denom) + void SetRatio(unsigned int num, unsigned int denom) { JackResampler::SetRatio(num, denom); fRatio = double(num) / double(denom); diff --git a/common/JackNetIOAdapter.cpp b/common/JackNetIOAdapter.cpp index 971030f7..e440d3eb 100644 --- a/common/JackNetIOAdapter.cpp +++ b/common/JackNetIOAdapter.cpp @@ -115,15 +115,17 @@ extern "C" return 1; } else { jack_log("Loading NetAudio Adapter"); - + /* adapter = new Jack::JackCallbackNetIOAdapter(jack_client, new Jack::JackPortAudioIOAdapter(2, 2, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client)), 2, 2); - /* + */ + #ifdef __APPLE__ adapter = new Jack::JackCallbackNetIOAdapter(jack_client, new Jack::JackCoreAudioIOAdapter(2, 2, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client)), 2, 2); #endif - */ + + assert(adapter); if (adapter->Open() == 0) { diff --git a/common/JackResampler.cpp b/common/JackResampler.cpp index 02ceaeaf..ab7c075d 100644 --- a/common/JackResampler.cpp +++ b/common/JackResampler.cpp @@ -22,9 +22,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { -JackResampler::JackResampler() - :fNum(1),fDenom(1) +JackResampler::JackResampler():fNum(1),fDenom(1) { + jack_log("JackResampler::JackResampler"); fRingBuffer = jack_ringbuffer_create(sizeof(float) * DEFAULT_RB_SIZE); jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2); } diff --git a/common/JackResampler.h b/common/JackResampler.h index 7ad8fdc6..7d6865e9 100644 --- a/common/JackResampler.h +++ b/common/JackResampler.h @@ -27,7 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { - #define DEFAULT_RB_SIZE 16384 * 4 + #define DEFAULT_RB_SIZE 16384 * 1 class JackResampler { diff --git a/common/wscript b/common/wscript index f07b169d..a5857b55 100644 --- a/common/wscript +++ b/common/wscript @@ -194,8 +194,8 @@ def build(bld): create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib) - #process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp ackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib) - process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib) + process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib) + #process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib) process.env.append_value("LINKFLAGS", "-lsamplerate") if bld.env()['IS_MACOSX']: diff --git a/macosx/JackCoreAudioIOAdapter.cpp b/macosx/JackCoreAudioIOAdapter.cpp index 893692e8..cd0240d0 100644 --- a/macosx/JackCoreAudioIOAdapter.cpp +++ b/macosx/JackCoreAudioIOAdapter.cpp @@ -122,7 +122,6 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, { JackCoreAudioIOAdapter* adapter = static_cast(inRefCon); - jack_log("JackCoreAudioIOAdapter::Render inNumberFrames %ld", inNumberFrames); AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData); @@ -135,7 +134,7 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, adapter->fProducerFilter.AddValue(adapter->fDeltaTime); */ - jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); + //jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); //printf("JackCoreAudioIOAdapter::Render delta %ld\n", adapter->fCurCallbackTime - adapter->fLastCallbackTime); if (!adapter->fRunning) { @@ -143,7 +142,6 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, jack_time_t time = jack_get_time(); adapter->fProducerDLL.Init(time); adapter->fConsumerDLL.Init(time); - adapter->fCurFrames = 0; } // DLL based @@ -174,11 +172,15 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { jack_error("src_ratio_input = %f", src_ratio_input); src_ratio_input = 1; + time1 = 1; + time2 = 1; } if (src_ratio_output < 0.8f || src_ratio_output > 1.2f) { jack_error("src_ratio_output = %f", src_ratio_output); src_ratio_output = 1; + time1 = 1; + time2 = 1; } src_ratio_input = Range(0.8f, 1.2f, src_ratio_input); @@ -189,14 +191,14 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", src_ratio_input, src_ratio_output); for (int i = 0; i < adapter->fCaptureChannels; i++) { - adapter->fCaptureRingBuffer[i].SetRatio(time1, time2); - adapter->fCaptureRingBuffer[i].WriteResample((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames); + adapter->fCaptureRingBuffer[i]->SetRatio(time1, time2); + adapter->fCaptureRingBuffer[i]->WriteResample((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames); // adapter->fCaptureRingBuffer[i].Write((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames); } for (int i = 0; i < adapter->fPlaybackChannels; i++) { - adapter->fPlaybackRingBuffer[i].SetRatio(time2, time1); - adapter->fPlaybackRingBuffer[i].ReadResample((float*)ioData->mBuffers[i].mData, inNumberFrames); + adapter->fPlaybackRingBuffer[i]->SetRatio(time2, time1); + adapter->fPlaybackRingBuffer[i]->ReadResample((float*)ioData->mBuffers[i].mData, inNumberFrames); // adapter->fPlaybackRingBuffer[i].Read((float*)ioData->mBuffers[i].mData, inNumberFrames); } diff --git a/macosx/libportaudio.a b/macosx/libportaudio.a index cbf792a9..70355235 100644 Binary files a/macosx/libportaudio.a and b/macosx/libportaudio.a differ diff --git a/windows/JackPortAudioIOAdapter.cpp b/windows/JackPortAudioIOAdapter.cpp index 402b2d5b..c3ff33d6 100644 --- a/windows/JackPortAudioIOAdapter.cpp +++ b/windows/JackPortAudioIOAdapter.cpp @@ -47,7 +47,6 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, jack_time_t time = jack_get_time(); adapter->fProducerDLL.Init(time); adapter->fConsumerDLL.Init(time); - adapter->fCurFrames = 0; } /* @@ -59,10 +58,21 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, //adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime); jack_time_t time = jack_get_time(); adapter->fProducerDLL.IncFrame(time); - jack_nframes_t time1 = adapter->fConsumerDLL.Time2Frames(time); jack_nframes_t time2 = adapter->fProducerDLL.Time2Frames(time); + //time1 = 1; + //time2 = 1; + + + /* + if ((adapter->fConsumerDLL.CurTime2Frame() / adapter->fSampleRate) > 10) { + printf("REINIT DLL\n"); + adapter->fConsumerDLL.Init(time); + adapter->fConsumerDLL.Init(time); + } + */ + //printf("time1 %ld time2 %ld\n",time1, time2); double src_ratio_output = double(time2) / double(time1); @@ -78,11 +88,15 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { jack_error("src_ratio_input = %f", src_ratio_input); src_ratio_input = 1; + time1 = 1; + time2 = 1; } if (src_ratio_output < 0.8f || src_ratio_output > 1.2f) { jack_error("src_ratio_output = %f", src_ratio_output); src_ratio_output = 1; + time1 = 1; + time2 = 1; } src_ratio_input = Range(0.8f, 1.2f, src_ratio_input); src_ratio_output = Range(0.8f, 1.2f, src_ratio_output); @@ -92,23 +106,23 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, paBuffer = (float**)inputBuffer; for (int i = 0; i < adapter->fCaptureChannels; i++) { buffer = (float*)paBuffer[i]; - adapter->fCaptureRingBuffer[i].SetRatio(time1, time2); + adapter->fCaptureRingBuffer[i]->SetRatio(time1, time2); //adapter->fCaptureRingBuffer[i].WriteResample(buffer, framesPerBuffer); //adapter->fCaptureRingBuffer[i].SetRatio(double(adapter->fNum) * adapter->fError1, adapter->fDenom); - adapter->fCaptureRingBuffer[i].Write(buffer, framesPerBuffer); + adapter->fCaptureRingBuffer[i]->Write(buffer, framesPerBuffer); } paBuffer = (float**)outputBuffer; for (int i = 0; i < adapter->fPlaybackChannels; i++) { buffer = (float*)paBuffer[i]; - adapter->fPlaybackRingBuffer[i].SetRatio(time2, time1); + adapter->fPlaybackRingBuffer[i]->SetRatio(time2, time1); //adapter->fPlaybackRingBuffer[i].ReadResample(buffer, framesPerBuffer); //adapter->fCaptureRingBuffer[i].SetRatio(double(adapter->fDenom) * adapter->fError1, adapter->fNum); - adapter->fPlaybackRingBuffer[i].Read(buffer, framesPerBuffer); + adapter->fPlaybackRingBuffer[i]->Read(buffer, framesPerBuffer); } printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", double(time1) / double(time2), double(time2) / double(time1)); - + return paContinue; }