From f3b7dcc0d0ca5f607d2f5c5702d8af1698eddc46 Mon Sep 17 00:00:00 2001 From: sletz Date: Wed, 2 Jul 2008 12:47:47 +0000 Subject: [PATCH] New JackResampler class git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2587 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackCallbackNetIOAdapter.cpp | 58 +++------------- common/JackCallbackNetIOAdapter.h | 6 +- common/JackIOAdapter.cpp | 35 ---------- common/JackIOAdapter.h | 20 ++---- common/wscript | 2 +- windows/JackPortAudioIOAdapter.cpp | 103 ++++------------------------ 6 files changed, 32 insertions(+), 192 deletions(-) diff --git a/common/JackCallbackNetIOAdapter.cpp b/common/JackCallbackNetIOAdapter.cpp index 7a88f60a..54b8f2a8 100644 --- a/common/JackCallbackNetIOAdapter.cpp +++ b/common/JackCallbackNetIOAdapter.cpp @@ -33,7 +33,7 @@ namespace Jack int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) { JackCallbackNetIOAdapter* adapter = static_cast(arg); - char* buffer; + float* buffer; int i; adapter->fLastCallbackTime = adapter->fCurCallbackTime; @@ -45,33 +45,13 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) adapter->fIOAdapter->SetCallbackDeltaTime(adapter->fCurCallbackTime - adapter->fLastCallbackTime); for (i = 0; i < adapter->fCaptureChannels; i++) { - - buffer = static_cast(jack_port_get_buffer(adapter->fCapturePortList[i], frames)); - size_t len = jack_ringbuffer_read_space(adapter->fCaptureRingBuffer[i]); - - jack_log("JackCallbackNetIOAdapter::Process INPUT available = %ld", len / sizeof(float)); - - if (len < frames * sizeof(float)) { - jack_error("JackCallbackNetIOAdapter::Process : producer too slow, skip frames = %d", frames); - //jack_ringbuffer_read(adapter->fCaptureRingBuffer, buffer, len); - } else { - jack_ringbuffer_read(adapter->fCaptureRingBuffer[i], buffer, frames * sizeof(float)); - } + buffer = static_cast(jack_port_get_buffer(adapter->fCapturePortList[i], frames)); + int len = adapter->fCaptureRingBuffer[i].Read(buffer, frames); } for (i = 0; i < adapter->fPlaybackChannels; i++) { - - buffer = static_cast(jack_port_get_buffer(adapter->fPlaybackPortList[i], frames)); - size_t len = jack_ringbuffer_write_space(adapter->fPlaybackRingBuffer[i]); - - jack_log("JackCallbackNetIOAdapter::Process OUTPUT available = %ld", len / sizeof(float)); - - if (len < frames * sizeof(float)) { - jack_error("JackCallbackNetIOAdapter::Process : consumer too slow, missing frames = %d", frames); - //jack_ringbuffer_write(adapter->fPlaybackRingBuffer, buffer, len); - } else { - jack_ringbuffer_write(adapter->fPlaybackRingBuffer[i], buffer, frames * sizeof(float)); - } + buffer = static_cast(jack_port_get_buffer(adapter->fPlaybackPortList[i], frames)); + int len = adapter->fPlaybackRingBuffer[i].Write(buffer, frames); } return 0; @@ -94,21 +74,9 @@ JackCallbackNetIOAdapter::JackCallbackNetIOAdapter(jack_client_t* jack_client, fCurCallbackTime = 0; fLastCallbackTime = 0; - fCaptureRingBuffer = new jack_ringbuffer_t*[fCaptureChannels]; - fPlaybackRingBuffer = new jack_ringbuffer_t*[fPlaybackChannels]; - - for (int i = 0; i < fCaptureChannels; i++) { - fCaptureRingBuffer[i] = jack_ringbuffer_create(sizeof(float) * DEFAULT_RB_SIZE); - if (fCaptureRingBuffer[i] == NULL) - goto fail; - } - - for (int i = 0; i < fPlaybackChannels; i++) { - fPlaybackRingBuffer[i] = jack_ringbuffer_create(sizeof(float) * DEFAULT_RB_SIZE); - if (fPlaybackRingBuffer[i] == NULL) - goto fail; - } - + fCaptureRingBuffer = new JackResampler[fCaptureChannels]; + fPlaybackRingBuffer = new JackResampler[fPlaybackChannels]; + fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); if (jack_set_process_callback(fJackClient, Process, this) < 0) @@ -128,16 +96,6 @@ fail: JackCallbackNetIOAdapter::~JackCallbackNetIOAdapter() { - for (int i = 0; i < fCaptureChannels; i++) { - if (fCaptureRingBuffer[i]) - jack_ringbuffer_free(fCaptureRingBuffer[i]); - } - - for (int i = 0; i < fPlaybackChannels; i++) { - if (fPlaybackRingBuffer[i]) - jack_ringbuffer_free(fPlaybackRingBuffer[i]); - } - delete[] fCaptureRingBuffer; delete[] fPlaybackRingBuffer; } diff --git a/common/JackCallbackNetIOAdapter.h b/common/JackCallbackNetIOAdapter.h index 9ed5c734..dc169dc3 100644 --- a/common/JackCallbackNetIOAdapter.h +++ b/common/JackCallbackNetIOAdapter.h @@ -31,9 +31,9 @@ namespace Jack private: - jack_ringbuffer_t** fCaptureRingBuffer; - jack_ringbuffer_t** fPlaybackRingBuffer; - + JackResampler* fCaptureRingBuffer; + JackResampler* fPlaybackRingBuffer; + jack_time_t fLastCallbackTime; jack_time_t fCurCallbackTime; diff --git a/common/JackIOAdapter.cpp b/common/JackIOAdapter.cpp index 26442713..71ec2367 100644 --- a/common/JackIOAdapter.cpp +++ b/common/JackIOAdapter.cpp @@ -24,46 +24,11 @@ namespace Jack int JackIOAdapterInterface::Open() { - int error; - - jack_log("fCaptureChannels %ld, fPlaybackChannels %ld", fCaptureChannels, fPlaybackChannels); - - for (int i = 0; i < fCaptureChannels; i++) { - fCaptureResampler[i] = src_new(SRC_LINEAR, 1, &error); - if (error != 0) { - jack_error("JackIOAdapterInterface::Open err = %s", src_strerror(error)); - goto fail; - } - } - - for (int i = 0; i < fPlaybackChannels; i++) { - fPlaybackResampler[i] = src_new(SRC_LINEAR, 1, &error); - if (error != 0) { - jack_error("JackIOAdapterInterface::Open err = %s", src_strerror(error)); - goto fail; - } - } - return 0; - -fail: - Close(); - return -1; } - int JackIOAdapterInterface::Close() { - for (int i = 0; i < fCaptureChannels; i++) { - if (fCaptureResampler[i] != NULL) - src_delete(fCaptureResampler[i]); - } - - for (int i = 0; i < fPlaybackChannels; i++) { - if (fPlaybackResampler[i] != NULL) - src_delete(fPlaybackResampler[i]); - } - return 0; } diff --git a/common/JackIOAdapter.h b/common/JackIOAdapter.h index 210aac9a..0c38110f 100644 --- a/common/JackIOAdapter.h +++ b/common/JackIOAdapter.h @@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "ringbuffer.h" #include "jack.h" #include "JackError.h" +#include "JackResampler.h" #include namespace Jack @@ -43,11 +44,8 @@ namespace Jack jack_time_t fCurCallbackTime; jack_time_t fDeltaTime; - SRC_STATE** fCaptureResampler; - SRC_STATE** fPlaybackResampler; - - jack_ringbuffer_t** fCaptureRingBuffer; - jack_ringbuffer_t** fPlaybackRingBuffer; + JackResampler* fCaptureRingBuffer; + JackResampler* fPlaybackRingBuffer; bool fRunning; public: @@ -61,17 +59,11 @@ namespace Jack fCurCallbackTime(0), fDeltaTime(0), fRunning(false) - { - fCaptureResampler = new SRC_STATE*[fCaptureChannels]; - fPlaybackResampler = new SRC_STATE*[fPlaybackChannels]; - } + {} virtual ~JackIOAdapterInterface() - { - delete[] fCaptureResampler; - delete[] fPlaybackResampler; - } + {} - void SetRingBuffers(jack_ringbuffer_t** input, jack_ringbuffer_t** output) + void SetRingBuffers(JackResampler* input, JackResampler* output) { fCaptureRingBuffer = input; fPlaybackRingBuffer = output; diff --git a/common/wscript b/common/wscript index 419e5f0a..178b3e1d 100644 --- a/common/wscript +++ b/common/wscript @@ -196,7 +196,7 @@ def build(bld): #create_jack_process_obj(bld, 'netioadapter', 'JackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib) - process = create_jack_process_obj(bld, 'netioadapter', 'JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib) + process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib) process.env.append_value("LINKFLAGS", "-lsamplerate") if bld.env()['IS_MACOSX']: process.env.append_value("LINKFLAGS", "../macosx/libportaudio.a -framework CoreAudio -framework AudioUnit -framework AudioToolbox -framework CoreServices") diff --git a/windows/JackPortAudioIOAdapter.cpp b/windows/JackPortAudioIOAdapter.cpp index 8c612f84..d99b909e 100644 --- a/windows/JackPortAudioIOAdapter.cpp +++ b/windows/JackPortAudioIOAdapter.cpp @@ -89,9 +89,7 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, JackPortAudioIOAdapter* adapter = static_cast(userData); float** paBuffer; float* buffer; - SRC_DATA src_data; int res; - jack_ringbuffer_data_t ring_buffer_data[2]; adapter->fLastCallbackTime = adapter->fCurCallbackTime; adapter->fCurCallbackTime = jack_get_time(); @@ -106,18 +104,18 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, paBuffer = (float**)inputBuffer; for (int i = 0; i < adapter->fCaptureChannels; i++) { - buffer = (float*)paBuffer[i]; - jack_ringbuffer_read(adapter->fCaptureRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); - jack_ringbuffer_read(adapter->fCaptureRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); - jack_ringbuffer_read(adapter->fCaptureRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); + buffer = static_cast(paBuffer[i]); + adapter->fCaptureRingBuffer[i].Read(buffer, framesPerBuffer); + adapter->fCaptureRingBuffer[i].Read(buffer, framesPerBuffer); + adapter->fCaptureRingBuffer[i].Read(buffer, framesPerBuffer); } paBuffer = (float**)outputBuffer; for (int i = 0; i < adapter->fPlaybackChannels; i++) { - buffer = (float*)paBuffer[i]; - jack_ringbuffer_write(adapter->fPlaybackRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); - jack_ringbuffer_write(adapter->fPlaybackRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); - jack_ringbuffer_write(adapter->fPlaybackRingBuffer[i], (char*)buffer, framesPerBuffer * sizeof(float)); + buffer = static_cast(paBuffer[i]); + adapter->fPlaybackRingBuffer[i].Write(buffer, framesPerBuffer); + adapter->fPlaybackRingBuffer[i].Write(buffer, framesPerBuffer); + adapter->fPlaybackRingBuffer[i].Write(buffer, framesPerBuffer); } } @@ -143,90 +141,18 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, paBuffer = (float**)inputBuffer; for (int i = 0; i < adapter->fCaptureChannels; i++) { - buffer = (float*)paBuffer[i]; - jack_ringbuffer_get_write_vector(adapter->fCaptureRingBuffer[i], 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); - - unsigned int frames_to_read = framesPerBuffer; - unsigned int read_frames = 0; - - if (available_frames < framesPerBuffer) { - jack_error("JackPortAudioIOAdapter::Render : consumer too slow, skip frames = %d", framesPerBuffer); - } else { - - for (int j = 0; j < 2; j++) { - - if (ring_buffer_data[j].len > 0) { - - src_data.data_in = &buffer[read_frames]; - src_data.data_out = (float*)ring_buffer_data[j].buf; - src_data.input_frames = frames_to_read; - src_data.output_frames = (ring_buffer_data[j].len / sizeof(float)); - src_data.end_of_input = 0; - src_data.src_ratio = src_ratio_input; - - res = src_process(adapter->fCaptureResampler[i], &src_data); - if (res != 0) - jack_error("JackPortAudioIOAdapter::Render err = %s", src_strerror(res)); - - frames_to_read -= src_data.input_frames_used; - read_frames += src_data.input_frames_used; - - 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(adapter->fCaptureRingBuffer[i], src_data.output_frames_gen * sizeof(float)); - } - } - - if (read_frames < framesPerBuffer) - jack_error("JackPortAudioIOAdapter::Render error read_frames = %ld", read_frames); - } + adapter->fCaptureRingBuffer[i].SetRatio(src_ratio_input); + int len = adapter->fCaptureRingBuffer[i].WriteResample(buffer, framesPerBuffer); + //int len = adapter->fCaptureRingBuffer[i].Write(buffer, framesPerBuffer); } paBuffer = (float**)outputBuffer; for (int i = 0; i < adapter->fPlaybackChannels; i++) { - buffer = (float*)paBuffer[i]; - jack_ringbuffer_get_read_vector(adapter->fPlaybackRingBuffer[i], ring_buffer_data); - - unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(float); - jack_log("OUTPUT available = %ld", available_frames); - - unsigned int frames_to_write = framesPerBuffer; - unsigned int written_frames = 0; - - if (available_frames < framesPerBuffer) { - jack_error("JackPortAudioIOAdapter::Render : producer too slow, skip frames = %d", framesPerBuffer); - } else { - - for (int j = 0; j < 2; j++) { - - if (ring_buffer_data[j].len > 0) { - - src_data.data_in = (float*)ring_buffer_data[j].buf; - src_data.data_out = &buffer[written_frames]; - src_data.input_frames = ring_buffer_data[j].len / sizeof(float); - src_data.output_frames = frames_to_write; - src_data.end_of_input = 0; - src_data.src_ratio = src_ratio_output; - - res = src_process(adapter->fPlaybackResampler[i], &src_data); - if (res != 0) - jack_error("JackPortAudioIOAdapter::Render err = %s", src_strerror(res)); - - frames_to_write -= src_data.output_frames_gen; - written_frames += 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(adapter->fPlaybackRingBuffer[i], src_data.input_frames_used * sizeof(float)); - } - } - - if (written_frames < framesPerBuffer) - jack_error("JackPortAudioIOAdapter::Render error written_frames = %ld", written_frames); - } + adapter->fPlaybackRingBuffer[i].SetRatio(src_ratio_output); + int len = adapter->fPlaybackRingBuffer[i].ReadResample(buffer, framesPerBuffer); + //int len = adapter->fPlaybackRingBuffer[i].Read(buffer, framesPerBuffer); } return paContinue; @@ -251,7 +177,6 @@ int JackPortAudioIOAdapter::Open() jack_log("JackPortAudioIOAdapter::Pa_GetDefaultInputDevice %ld", Pa_GetDefaultInputDevice()); jack_log("JackPortAudioIOAdapter::Pa_GetDefaultOutputDevice %ld", Pa_GetDefaultOutputDevice()); - jack_log("JackPortAudioIOAdapter::Open fBufferSize = %ld fSampleRate %f", fBufferSize, fSampleRate); inputDevice = Pa_GetDefaultInputDevice();