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(); | |||