git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2587 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -33,7 +33,7 @@ namespace Jack | |||
| int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) | |||
| { | |||
| JackCallbackNetIOAdapter* adapter = static_cast<JackCallbackNetIOAdapter*>(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<char*>(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<float*>(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<char*>(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<float*>(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; | |||
| } | |||
| @@ -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; | |||
| @@ -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; | |||
| } | |||
| @@ -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 <samplerate.h> | |||
| 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; | |||
| @@ -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") | |||
| @@ -89,9 +89,7 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
| JackPortAudioIOAdapter* adapter = static_cast<JackPortAudioIOAdapter*>(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<float*>(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<float*>(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(); | |||