Browse Source

New JackResampler class

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2587 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 17 years ago
parent
commit
f3b7dcc0d0
6 changed files with 32 additions and 192 deletions
  1. +8
    -50
      common/JackCallbackNetIOAdapter.cpp
  2. +3
    -3
      common/JackCallbackNetIOAdapter.h
  3. +0
    -35
      common/JackIOAdapter.cpp
  4. +6
    -14
      common/JackIOAdapter.h
  5. +1
    -1
      common/wscript
  6. +14
    -89
      windows/JackPortAudioIOAdapter.cpp

+ 8
- 50
common/JackCallbackNetIOAdapter.cpp View File

@@ -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;
}


+ 3
- 3
common/JackCallbackNetIOAdapter.h View File

@@ -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;


+ 0
- 35
common/JackIOAdapter.cpp View File

@@ -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;
}

+ 6
- 14
common/JackIOAdapter.h View File

@@ -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;


+ 1
- 1
common/wscript View File

@@ -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")


+ 14
- 89
windows/JackPortAudioIOAdapter.cpp View File

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


Loading…
Cancel
Save