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) | int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) | ||||
{ | { | ||||
JackCallbackNetIOAdapter* adapter = static_cast<JackCallbackNetIOAdapter*>(arg); | JackCallbackNetIOAdapter* adapter = static_cast<JackCallbackNetIOAdapter*>(arg); | ||||
char* buffer; | |||||
float* buffer; | |||||
int i; | int i; | ||||
adapter->fLastCallbackTime = adapter->fCurCallbackTime; | adapter->fLastCallbackTime = adapter->fCurCallbackTime; | ||||
@@ -45,33 +45,13 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) | |||||
adapter->fIOAdapter->SetCallbackDeltaTime(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | adapter->fIOAdapter->SetCallbackDeltaTime(adapter->fCurCallbackTime - adapter->fLastCallbackTime); | ||||
for (i = 0; i < adapter->fCaptureChannels; i++) { | 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++) { | 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; | return 0; | ||||
@@ -94,21 +74,9 @@ JackCallbackNetIOAdapter::JackCallbackNetIOAdapter(jack_client_t* jack_client, | |||||
fCurCallbackTime = 0; | fCurCallbackTime = 0; | ||||
fLastCallbackTime = 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); | fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); | ||||
if (jack_set_process_callback(fJackClient, Process, this) < 0) | if (jack_set_process_callback(fJackClient, Process, this) < 0) | ||||
@@ -128,16 +96,6 @@ fail: | |||||
JackCallbackNetIOAdapter::~JackCallbackNetIOAdapter() | 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[] fCaptureRingBuffer; | ||||
delete[] fPlaybackRingBuffer; | delete[] fPlaybackRingBuffer; | ||||
} | } | ||||
@@ -31,9 +31,9 @@ namespace Jack | |||||
private: | private: | ||||
jack_ringbuffer_t** fCaptureRingBuffer; | |||||
jack_ringbuffer_t** fPlaybackRingBuffer; | |||||
JackResampler* fCaptureRingBuffer; | |||||
JackResampler* fPlaybackRingBuffer; | |||||
jack_time_t fLastCallbackTime; | jack_time_t fLastCallbackTime; | ||||
jack_time_t fCurCallbackTime; | jack_time_t fCurCallbackTime; | ||||
@@ -24,46 +24,11 @@ namespace Jack | |||||
int JackIOAdapterInterface::Open() | 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; | return 0; | ||||
fail: | |||||
Close(); | |||||
return -1; | |||||
} | } | ||||
int JackIOAdapterInterface::Close() | 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; | return 0; | ||||
} | } | ||||
@@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include "ringbuffer.h" | #include "ringbuffer.h" | ||||
#include "jack.h" | #include "jack.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include "JackResampler.h" | |||||
#include <samplerate.h> | #include <samplerate.h> | ||||
namespace Jack | namespace Jack | ||||
@@ -43,11 +44,8 @@ namespace Jack | |||||
jack_time_t fCurCallbackTime; | jack_time_t fCurCallbackTime; | ||||
jack_time_t fDeltaTime; | jack_time_t fDeltaTime; | ||||
SRC_STATE** fCaptureResampler; | |||||
SRC_STATE** fPlaybackResampler; | |||||
jack_ringbuffer_t** fCaptureRingBuffer; | |||||
jack_ringbuffer_t** fPlaybackRingBuffer; | |||||
JackResampler* fCaptureRingBuffer; | |||||
JackResampler* fPlaybackRingBuffer; | |||||
bool fRunning; | bool fRunning; | ||||
public: | public: | ||||
@@ -61,17 +59,11 @@ namespace Jack | |||||
fCurCallbackTime(0), | fCurCallbackTime(0), | ||||
fDeltaTime(0), | fDeltaTime(0), | ||||
fRunning(false) | fRunning(false) | ||||
{ | |||||
fCaptureResampler = new SRC_STATE*[fCaptureChannels]; | |||||
fPlaybackResampler = new SRC_STATE*[fPlaybackChannels]; | |||||
} | |||||
{} | |||||
virtual ~JackIOAdapterInterface() | virtual ~JackIOAdapterInterface() | ||||
{ | |||||
delete[] fCaptureResampler; | |||||
delete[] fPlaybackResampler; | |||||
} | |||||
{} | |||||
void SetRingBuffers(jack_ringbuffer_t** input, jack_ringbuffer_t** output) | |||||
void SetRingBuffers(JackResampler* input, JackResampler* output) | |||||
{ | { | ||||
fCaptureRingBuffer = input; | fCaptureRingBuffer = input; | ||||
fPlaybackRingBuffer = output; | fPlaybackRingBuffer = output; | ||||
@@ -196,7 +196,7 @@ def build(bld): | |||||
#create_jack_process_obj(bld, 'netioadapter', 'JackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib) | #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") | process.env.append_value("LINKFLAGS", "-lsamplerate") | ||||
if bld.env()['IS_MACOSX']: | if bld.env()['IS_MACOSX']: | ||||
process.env.append_value("LINKFLAGS", "../macosx/libportaudio.a -framework CoreAudio -framework AudioUnit -framework AudioToolbox -framework CoreServices") | 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); | JackPortAudioIOAdapter* adapter = static_cast<JackPortAudioIOAdapter*>(userData); | ||||
float** paBuffer; | float** paBuffer; | ||||
float* buffer; | float* buffer; | ||||
SRC_DATA src_data; | |||||
int res; | int res; | ||||
jack_ringbuffer_data_t ring_buffer_data[2]; | |||||
adapter->fLastCallbackTime = adapter->fCurCallbackTime; | adapter->fLastCallbackTime = adapter->fCurCallbackTime; | ||||
adapter->fCurCallbackTime = jack_get_time(); | adapter->fCurCallbackTime = jack_get_time(); | ||||
@@ -106,18 +104,18 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||||
paBuffer = (float**)inputBuffer; | paBuffer = (float**)inputBuffer; | ||||
for (int i = 0; i < adapter->fCaptureChannels; i++) { | 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; | paBuffer = (float**)outputBuffer; | ||||
for (int i = 0; i < adapter->fPlaybackChannels; i++) { | 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; | paBuffer = (float**)inputBuffer; | ||||
for (int i = 0; i < adapter->fCaptureChannels; i++) { | for (int i = 0; i < adapter->fCaptureChannels; i++) { | ||||
buffer = (float*)paBuffer[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; | paBuffer = (float**)outputBuffer; | ||||
for (int i = 0; i < adapter->fPlaybackChannels; i++) { | for (int i = 0; i < adapter->fPlaybackChannels; i++) { | ||||
buffer = (float*)paBuffer[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; | return paContinue; | ||||
@@ -251,7 +177,6 @@ int JackPortAudioIOAdapter::Open() | |||||
jack_log("JackPortAudioIOAdapter::Pa_GetDefaultInputDevice %ld", Pa_GetDefaultInputDevice()); | jack_log("JackPortAudioIOAdapter::Pa_GetDefaultInputDevice %ld", Pa_GetDefaultInputDevice()); | ||||
jack_log("JackPortAudioIOAdapter::Pa_GetDefaultOutputDevice %ld", Pa_GetDefaultOutputDevice()); | jack_log("JackPortAudioIOAdapter::Pa_GetDefaultOutputDevice %ld", Pa_GetDefaultOutputDevice()); | ||||
jack_log("JackPortAudioIOAdapter::Open fBufferSize = %ld fSampleRate %f", fBufferSize, fSampleRate); | jack_log("JackPortAudioIOAdapter::Open fBufferSize = %ld fSampleRate %f", fBufferSize, fSampleRate); | ||||
inputDevice = Pa_GetDefaultInputDevice(); | inputDevice = Pa_GetDefaultInputDevice(); | ||||