git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2597 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -35,26 +35,12 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) | |||
| float* buffer; | |||
| int i; | |||
| /* | |||
| adapter->fLastCallbackTime = adapter->fCurCallbackTime; | |||
| adapter->fCurCallbackTime = jack_get_time(); | |||
| */ | |||
| if (!adapter->fIOAdapter->IsRunning()) | |||
| return 0; | |||
| // adapter->fIOAdapter->SetCallbackDeltaTime(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| // DLL | |||
| // DLL | |||
| adapter->fIOAdapter->SetCallbackTime(jack_get_time()); | |||
| //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()); | |||
| 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); | |||
| @@ -51,7 +51,6 @@ namespace Jack | |||
| jack_time_t mean = 0; | |||
| for (int i = 0; i < MAX_SIZE; i++) | |||
| mean += fTable[i]; | |||
| return mean / MAX_SIZE; | |||
| } | |||
| }; | |||
| @@ -42,10 +42,6 @@ namespace Jack | |||
| int fBufferSize; | |||
| float fSampleRate; | |||
| jack_time_t fLastCallbackTime; | |||
| jack_time_t fCurCallbackTime; | |||
| jack_time_t fDeltaTime; | |||
| JackFilter fProducerFilter; | |||
| JackFilter fConsumerFilter; | |||
| @@ -65,9 +61,6 @@ namespace Jack | |||
| fPlaybackChannels(output), | |||
| fBufferSize(buffer_size), | |||
| fSampleRate(sample_rate), | |||
| fLastCallbackTime(0), | |||
| fCurCallbackTime(0), | |||
| fDeltaTime(0), | |||
| fProducerDLL(buffer_size, sample_rate), | |||
| fConsumerDLL(buffer_size, sample_rate), | |||
| fRunning(false) | |||
| @@ -91,17 +84,8 @@ namespace Jack | |||
| fBufferSize = buffer_size; | |||
| } | |||
| virtual void SetCallbackDeltaTime(jack_time_t delta_usec) | |||
| { | |||
| jack_log("SetCallbackDeltaTime %ld", delta_usec); | |||
| //printf("SetCallbackDeltaTime %ld\n", delta_usec); | |||
| fDeltaTime = delta_usec; | |||
| } | |||
| virtual void SetCallbackTime(jack_time_t callback_usec) | |||
| { | |||
| jack_log("SetCallbackTime %ld", callback_usec); | |||
| //printf("SetCallbackDeltaTime %ld\n", delta_usec); | |||
| fConsumerDLL.IncFrame(callback_usec); | |||
| } | |||
| @@ -25,7 +25,6 @@ namespace Jack | |||
| JackLibSampleRateResampler::JackLibSampleRateResampler() | |||
| :JackResampler(),fRatio(1) | |||
| { | |||
| jack_log("JackLibSampleRateResampler::JackLibSampleRateResampler"); | |||
| int error; | |||
| fResampler = src_new(SRC_LINEAR, 1, &error); | |||
| if (error != 0) | |||
| @@ -47,7 +46,7 @@ int JackLibSampleRateResampler::ReadResample(float* buffer, unsigned int frames) | |||
| jack_ringbuffer_get_read_vector(fRingBuffer, ring_buffer_data); | |||
| unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(float); | |||
| jack_log("OUPUT available = %ld", available_frames); | |||
| jack_log("Output available = %ld", available_frames); | |||
| for (int j = 0; j < 2; j++) { | |||
| @@ -68,16 +67,16 @@ int JackLibSampleRateResampler::ReadResample(float* buffer, unsigned int frames) | |||
| written_frames += src_data.output_frames_gen; | |||
| if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) { | |||
| jack_error("OUTPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_error("Output : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| } | |||
| jack_log("OUTPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_log("Output : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_ringbuffer_read_advance(fRingBuffer, src_data.input_frames_used * sizeof(float)); | |||
| } | |||
| } | |||
| if (written_frames < frames) { | |||
| jack_error("OUPUT available = %ld", available_frames); | |||
| jack_error("Output available = %ld", available_frames); | |||
| jack_error("JackLibSampleRateResampler::ReadResample error written_frames = %ld", written_frames); | |||
| } | |||
| @@ -94,7 +93,7 @@ int JackLibSampleRateResampler::WriteResample(float* buffer, unsigned int frames | |||
| jack_ringbuffer_get_write_vector(fRingBuffer, ring_buffer_data); | |||
| unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(float); | |||
| jack_log("INPUT available = %ld", available_frames); | |||
| jack_log("Input available = %ld", available_frames); | |||
| for (int j = 0; j < 2; j++) { | |||
| @@ -115,16 +114,16 @@ int JackLibSampleRateResampler::WriteResample(float* buffer, unsigned int frames | |||
| read_frames += src_data.input_frames_used; | |||
| if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) { | |||
| jack_error("INPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_error("Input : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| } | |||
| jack_log("INPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_log("Input : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen); | |||
| jack_ringbuffer_write_advance(fRingBuffer, src_data.output_frames_gen * sizeof(float)); | |||
| } | |||
| } | |||
| if (read_frames < frames) { | |||
| jack_error("INPUT available = %ld", available_frames); | |||
| jack_error("Input available = %ld", available_frames); | |||
| jack_error("JackLibSampleRateResampler::ReadResample error read_frames = %ld", read_frames); | |||
| } | |||
| @@ -115,16 +115,16 @@ 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); | |||
| @@ -24,7 +24,6 @@ namespace Jack | |||
| 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); | |||
| } | |||
| @@ -48,11 +47,10 @@ unsigned int JackResampler::WriteSpace() | |||
| int JackResampler::Read(float* buffer, unsigned int frames) | |||
| { | |||
| size_t len = jack_ringbuffer_read_space(fRingBuffer); | |||
| jack_log("JackResampler::Read INPUT available = %ld", len / sizeof(float)); | |||
| jack_log("JackResampler::Read input available = %ld", len / sizeof(float)); | |||
| if (len < frames * sizeof(float)) { | |||
| jack_error("JackResampler::Read : producer too slow, missing frames = %d", frames); | |||
| //jack_ringbuffer_read(fRingBuffer, buffer, len); | |||
| return 0; | |||
| } else { | |||
| jack_ringbuffer_read(fRingBuffer, (char*)buffer, frames * sizeof(float)); | |||
| @@ -63,11 +61,10 @@ int JackResampler::Read(float* buffer, unsigned int frames) | |||
| int JackResampler::Write(float* buffer, unsigned int frames) | |||
| { | |||
| size_t len = jack_ringbuffer_write_space(fRingBuffer); | |||
| jack_log("JackResampler::Write OUTPUT available = %ld", len / sizeof(float)); | |||
| jack_log("JackResampler::Write output available = %ld", len / sizeof(float)); | |||
| if (len < frames * sizeof(float)) { | |||
| jack_error("JackResampler::Write : consumer too slow, skip frames = %d", frames); | |||
| //jack_ringbuffer_write(fRingBuffer, buffer, len); | |||
| return 0; | |||
| } else { | |||
| jack_ringbuffer_write(fRingBuffer, (char*)buffer, frames * sizeof(float)); | |||
| @@ -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 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 = 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']: | |||
| @@ -121,21 +121,7 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
| AudioBufferList *ioData) | |||
| { | |||
| JackCoreAudioIOAdapter* adapter = static_cast<JackCoreAudioIOAdapter*>(inRefCon); | |||
| jack_log("JackCoreAudioIOAdapter::Render inNumberFrames %ld", inNumberFrames); | |||
| AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData); | |||
| /* | |||
| adapter->fLastCallbackTime = adapter->fCurCallbackTime; | |||
| adapter->fCurCallbackTime = jack_get_time(); | |||
| adapter->fConsumerFilter.AddValue(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| adapter->fProducerFilter.AddValue(adapter->fDeltaTime); | |||
| */ | |||
| //jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| //printf("JackCoreAudioIOAdapter::Render delta %ld\n", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData); | |||
| if (!adapter->fRunning) { | |||
| adapter->fRunning = true; | |||
| @@ -144,31 +130,15 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
| adapter->fConsumerDLL.Init(time); | |||
| } | |||
| // DLL based | |||
| //adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime); | |||
| // DLL | |||
| jack_time_t time = jack_get_time(); | |||
| adapter->fProducerDLL.IncFrame(time); | |||
| /* | |||
| jack_time_t time1 = adapter->fConsumerDLL.CurFrame2Time(); | |||
| jack_time_t time2 = adapter->fProducerDLL.CurFrame2Time(); | |||
| */ | |||
| jack_nframes_t time1 = adapter->fConsumerDLL.Time2Frames(time); | |||
| jack_nframes_t time2 = adapter->fProducerDLL.Time2Frames(time); | |||
| printf("time1 %ld time2 %ld\n",time1, time2); | |||
| double src_ratio_output = double(time2) / double(time1); | |||
| double src_ratio_input = double(time1) / double(time2); | |||
| /* | |||
| jack_time_t val2 = adapter->fConsumerFilter.GetVal(); | |||
| jack_time_t val1 = adapter->fProducerFilter.GetVal(); | |||
| double src_ratio_output = double(val1) / double(val2); | |||
| double src_ratio_input = double(val2) / double(val1); | |||
| */ | |||
| if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { | |||
| jack_error("src_ratio_input = %f", src_ratio_input); | |||
| src_ratio_input = 1; | |||
| @@ -185,21 +155,16 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
| src_ratio_input = Range(0.8f, 1.2f, src_ratio_input); | |||
| src_ratio_output = Range(0.8f, 1.2f, src_ratio_output); | |||
| //jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output); | |||
| //jack_info("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output); | |||
| printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", src_ratio_input, src_ratio_output); | |||
| jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", 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].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].Read((float*)ioData->mBuffers[i].mData, inNumberFrames); | |||
| } | |||
| return noErr; | |||
| @@ -34,14 +34,6 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
| float** paBuffer; | |||
| float* buffer; | |||
| adapter->fLastCallbackTime = adapter->fCurCallbackTime; | |||
| adapter->fCurCallbackTime = jack_get_time(); | |||
| adapter->fConsumerFilter.AddValue(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| adapter->fProducerFilter.AddValue(adapter->fDeltaTime); | |||
| jack_log("JackPortAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| if (!adapter->fRunning) { | |||
| adapter->fRunning = true; | |||
| jack_time_t time = jack_get_time(); | |||
| @@ -49,42 +41,15 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
| adapter->fConsumerDLL.Init(time); | |||
| } | |||
| /* | |||
| double src_ratio_output = double(adapter->fCurCallbackTime - adapter->fLastCallbackTime) / double(adapter->fDeltaTime); | |||
| double src_ratio_input = double(adapter->fDeltaTime) / double(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
| */ | |||
| // DLL based | |||
| //adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime); | |||
| // DLL | |||
| 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); | |||
| double src_ratio_input = double(time1) / double(time2); | |||
| /* | |||
| jack_time_t val2 = adapter->fConsumerFilter.GetVal(); | |||
| jack_time_t val1 = adapter->fProducerFilter.GetVal(); | |||
| double src_ratio_output = double(val1) / double(val2); | |||
| double src_ratio_input = double(val2) / double(val1); | |||
| */ | |||
| if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { | |||
| jack_error("src_ratio_input = %f", src_ratio_input); | |||
| src_ratio_input = 1; | |||
| @@ -98,31 +63,25 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
| 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); | |||
| //jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output); | |||
| jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output); | |||
| paBuffer = (float**)inputBuffer; | |||
| for (int i = 0; i < adapter->fCaptureChannels; i++) { | |||
| buffer = (float*)paBuffer[i]; | |||
| 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]->WriteResample(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].ReadResample(buffer, framesPerBuffer); | |||
| //adapter->fCaptureRingBuffer[i].SetRatio(double(adapter->fDenom) * adapter->fError1, adapter->fNum); | |||
| adapter->fPlaybackRingBuffer[i]->Read(buffer, framesPerBuffer); | |||
| adapter->fPlaybackRingBuffer[i]->ReadResample(buffer, framesPerBuffer); | |||
| } | |||
| printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", double(time1) / double(time2), double(time2) / double(time1)); | |||
| return paContinue; | |||
| } | |||