git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2595 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -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 <stdio.h> | |||
| @@ -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<float*>(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<float*>(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; | |||
| } | |||
| @@ -31,8 +31,8 @@ namespace Jack | |||
| private: | |||
| JackResampler* fCaptureRingBuffer; | |||
| JackResampler* fPlaybackRingBuffer; | |||
| JackResampler** fCaptureRingBuffer; | |||
| JackResampler** fPlaybackRingBuffer; | |||
| jack_time_t fLastCallbackTime; | |||
| jack_time_t fCurCallbackTime; | |||
| @@ -125,7 +125,6 @@ namespace Jack | |||
| } | |||
| }; | |||
| inline float Range(float min, float max, float val) | |||
| { | |||
| @@ -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; | |||
| @@ -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) | |||
| @@ -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); | |||
| @@ -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) { | |||
| @@ -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); | |||
| } | |||
| @@ -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 | |||
| { | |||
| @@ -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']: | |||
| @@ -122,7 +122,6 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
| { | |||
| JackCoreAudioIOAdapter* adapter = static_cast<JackCoreAudioIOAdapter*>(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); | |||
| } | |||
| @@ -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; | |||
| } | |||