Browse Source

DLL based resampling seems to work, cleanup

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2597 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 17 years ago
parent
commit
4dfe4f3a6a
9 changed files with 28 additions and 139 deletions
  1. +2
    -16
      common/JackCallbackNetIOAdapter.cpp
  2. +0
    -1
      common/JackFilters.h
  3. +0
    -16
      common/JackIOAdapter.h
  4. +8
    -9
      common/JackLibSampleRateResampler.cpp
  5. +4
    -4
      common/JackNetIOAdapter.cpp
  6. +2
    -5
      common/JackResampler.cpp
  7. +2
    -2
      common/wscript
  8. +3
    -38
      macosx/JackCoreAudioIOAdapter.cpp
  9. +7
    -48
      windows/JackPortAudioIOAdapter.cpp

+ 2
- 16
common/JackCallbackNetIOAdapter.cpp View File

@@ -35,26 +35,12 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg)
float* buffer;
int i;
/*
adapter->fLastCallbackTime = adapter->fCurCallbackTime;
adapter->fCurCallbackTime = jack_get_time();
*/
if (!adapter->fIOAdapter->IsRunning())
return 0;
// adapter->fIOAdapter->SetCallbackDeltaTime(adapter->fCurCallbackTime - adapter->fLastCallbackTime);
// DLL
// DLL
adapter->fIOAdapter->SetCallbackTime(jack_get_time());
//jack_info("ReadSpace = %ld", adapter->fCaptureRingBuffer[0].ReadSpace());
//jack_info("WriteSpace = %ld", adapter->fPlaybackRingBuffer[0].WriteSpace());
printf("ReadSpace = %ld\n", adapter->fCaptureRingBuffer[0]->ReadSpace());
printf("WriteSpace = %ld\n", adapter->fPlaybackRingBuffer[0]->WriteSpace());
for (i = 0; i < adapter->fCaptureChannels; i++) {
buffer = static_cast<float*>(jack_port_get_buffer(adapter->fCapturePortList[i], frames));
adapter->fCaptureRingBuffer[i]->Read(buffer, frames);


+ 0
- 1
common/JackFilters.h View File

@@ -51,7 +51,6 @@ namespace Jack
jack_time_t mean = 0;
for (int i = 0; i < MAX_SIZE; i++)
mean += fTable[i];
return mean / MAX_SIZE;
}
};


+ 0
- 16
common/JackIOAdapter.h View File

@@ -42,10 +42,6 @@ namespace Jack
int fBufferSize;
float fSampleRate;
jack_time_t fLastCallbackTime;
jack_time_t fCurCallbackTime;
jack_time_t fDeltaTime;
JackFilter fProducerFilter;
JackFilter fConsumerFilter;
@@ -65,9 +61,6 @@ namespace Jack
fPlaybackChannels(output),
fBufferSize(buffer_size),
fSampleRate(sample_rate),
fLastCallbackTime(0),
fCurCallbackTime(0),
fDeltaTime(0),
fProducerDLL(buffer_size, sample_rate),
fConsumerDLL(buffer_size, sample_rate),
fRunning(false)
@@ -91,17 +84,8 @@ namespace Jack
fBufferSize = buffer_size;
}
virtual void SetCallbackDeltaTime(jack_time_t delta_usec)
{
jack_log("SetCallbackDeltaTime %ld", delta_usec);
//printf("SetCallbackDeltaTime %ld\n", delta_usec);
fDeltaTime = delta_usec;
}
virtual void SetCallbackTime(jack_time_t callback_usec)
{
jack_log("SetCallbackTime %ld", callback_usec);
//printf("SetCallbackDeltaTime %ld\n", delta_usec);
fConsumerDLL.IncFrame(callback_usec);
}


+ 8
- 9
common/JackLibSampleRateResampler.cpp View File

@@ -25,7 +25,6 @@ namespace Jack
JackLibSampleRateResampler::JackLibSampleRateResampler()
:JackResampler(),fRatio(1)
{
jack_log("JackLibSampleRateResampler::JackLibSampleRateResampler");
int error;
fResampler = src_new(SRC_LINEAR, 1, &error);
if (error != 0)
@@ -47,7 +46,7 @@ int JackLibSampleRateResampler::ReadResample(float* buffer, unsigned int frames)
jack_ringbuffer_get_read_vector(fRingBuffer, ring_buffer_data);
unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(float);
jack_log("OUPUT available = %ld", available_frames);
jack_log("Output available = %ld", available_frames);
for (int j = 0; j < 2; j++) {
@@ -68,16 +67,16 @@ int JackLibSampleRateResampler::ReadResample(float* buffer, unsigned int frames)
written_frames += src_data.output_frames_gen;
if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) {
jack_error("OUTPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen);
jack_error("Output : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, 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_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(fRingBuffer, src_data.input_frames_used * sizeof(float));
}
}
if (written_frames < frames) {
jack_error("OUPUT available = %ld", available_frames);
jack_error("Output available = %ld", available_frames);
jack_error("JackLibSampleRateResampler::ReadResample error written_frames = %ld", written_frames);
}
@@ -94,7 +93,7 @@ int JackLibSampleRateResampler::WriteResample(float* buffer, unsigned int frames
jack_ringbuffer_get_write_vector(fRingBuffer, 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);
jack_log("Input available = %ld", available_frames);
for (int j = 0; j < 2; j++) {
@@ -115,16 +114,16 @@ int JackLibSampleRateResampler::WriteResample(float* buffer, unsigned int frames
read_frames += src_data.input_frames_used;
if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) {
jack_error("INPUT : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen);
jack_error("Input : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen);
}
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_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(fRingBuffer, src_data.output_frames_gen * sizeof(float));
}
}
if (read_frames < frames) {
jack_error("INPUT available = %ld", available_frames);
jack_error("Input available = %ld", available_frames);
jack_error("JackLibSampleRateResampler::ReadResample error read_frames = %ld", read_frames);
}


+ 4
- 4
common/JackNetIOAdapter.cpp View File

@@ -115,16 +115,16 @@ extern "C"
return 1;
} else {
jack_log("Loading NetAudio Adapter");
/*
adapter = new Jack::JackCallbackNetIOAdapter(jack_client,
new Jack::JackPortAudioIOAdapter(2, 2, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client)), 2, 2);
*/
/*
#ifdef __APPLE__
adapter = new Jack::JackCallbackNetIOAdapter(jack_client,
new Jack::JackCoreAudioIOAdapter(2, 2, jack_get_buffer_size(jack_client), jack_get_sample_rate(jack_client)), 2, 2);
#endif
*/
assert(adapter);


+ 2
- 5
common/JackResampler.cpp View File

@@ -24,7 +24,6 @@ namespace Jack

JackResampler::JackResampler():fNum(1),fDenom(1)
{
jack_log("JackResampler::JackResampler");
fRingBuffer = jack_ringbuffer_create(sizeof(float) * DEFAULT_RB_SIZE);
jack_ringbuffer_read_advance(fRingBuffer, (sizeof(float) * DEFAULT_RB_SIZE) / 2);
}
@@ -48,11 +47,10 @@ unsigned int JackResampler::WriteSpace()
int JackResampler::Read(float* buffer, unsigned int frames)
{
size_t len = jack_ringbuffer_read_space(fRingBuffer);
jack_log("JackResampler::Read INPUT available = %ld", len / sizeof(float));
jack_log("JackResampler::Read input available = %ld", len / sizeof(float));
if (len < frames * sizeof(float)) {
jack_error("JackResampler::Read : producer too slow, missing frames = %d", frames);
//jack_ringbuffer_read(fRingBuffer, buffer, len);
return 0;
} else {
jack_ringbuffer_read(fRingBuffer, (char*)buffer, frames * sizeof(float));
@@ -63,11 +61,10 @@ int JackResampler::Read(float* buffer, unsigned int frames)
int JackResampler::Write(float* buffer, unsigned int frames)
{
size_t len = jack_ringbuffer_write_space(fRingBuffer);
jack_log("JackResampler::Write OUTPUT available = %ld", len / sizeof(float));
jack_log("JackResampler::Write output available = %ld", len / sizeof(float));
if (len < frames * sizeof(float)) {
jack_error("JackResampler::Write : consumer too slow, skip frames = %d", frames);
//jack_ringbuffer_write(fRingBuffer, buffer, len);
return 0;
} else {
jack_ringbuffer_write(fRingBuffer, (char*)buffer, frames * sizeof(float));


+ 2
- 2
common/wscript View File

@@ -194,8 +194,8 @@ def build(bld):

create_jack_process_obj(bld, 'netmanager', 'JackNetManager.cpp', serverlib)

process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib)
#process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib)
#process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../macosx/JackCoreAudioIOAdapter.cpp', serverlib)
process = create_jack_process_obj(bld, 'netioadapter', 'JackResampler.cpp JackLibSampleRateResampler.cpp JackIOAdapter.cpp JackNetIOAdapter.cpp JackCallbackNetIOAdapter.cpp ../windows/JackPortAudioIOAdapter.cpp', serverlib)

process.env.append_value("LINKFLAGS", "-lsamplerate")
if bld.env()['IS_MACOSX']:


+ 3
- 38
macosx/JackCoreAudioIOAdapter.cpp View File

@@ -121,21 +121,7 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon,
AudioBufferList *ioData)
{
JackCoreAudioIOAdapter* adapter = static_cast<JackCoreAudioIOAdapter*>(inRefCon);
jack_log("JackCoreAudioIOAdapter::Render inNumberFrames %ld", inNumberFrames);
AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData);
/*
adapter->fLastCallbackTime = adapter->fCurCallbackTime;
adapter->fCurCallbackTime = jack_get_time();
adapter->fConsumerFilter.AddValue(adapter->fCurCallbackTime - adapter->fLastCallbackTime);
adapter->fProducerFilter.AddValue(adapter->fDeltaTime);
*/
//jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime);
//printf("JackCoreAudioIOAdapter::Render delta %ld\n", adapter->fCurCallbackTime - adapter->fLastCallbackTime);
AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData);
if (!adapter->fRunning) {
adapter->fRunning = true;
@@ -144,31 +130,15 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon,
adapter->fConsumerDLL.Init(time);
}
// DLL based
//adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime);
// DLL
jack_time_t time = jack_get_time();
adapter->fProducerDLL.IncFrame(time);
/*
jack_time_t time1 = adapter->fConsumerDLL.CurFrame2Time();
jack_time_t time2 = adapter->fProducerDLL.CurFrame2Time();
*/
jack_nframes_t time1 = adapter->fConsumerDLL.Time2Frames(time);
jack_nframes_t time2 = adapter->fProducerDLL.Time2Frames(time);
printf("time1 %ld time2 %ld\n",time1, time2);

double src_ratio_output = double(time2) / double(time1);
double src_ratio_input = double(time1) / double(time2);
/*
jack_time_t val2 = adapter->fConsumerFilter.GetVal();
jack_time_t val1 = adapter->fProducerFilter.GetVal();
double src_ratio_output = double(val1) / double(val2);
double src_ratio_input = double(val2) / double(val1);
*/
if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) {
jack_error("src_ratio_input = %f", src_ratio_input);
src_ratio_input = 1;
@@ -185,21 +155,16 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon,
src_ratio_input = Range(0.8f, 1.2f, src_ratio_input);
src_ratio_output = Range(0.8f, 1.2f, src_ratio_output);
//jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
//jack_info("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", src_ratio_input, src_ratio_output);
jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
for (int i = 0; i < adapter->fCaptureChannels; i++) {
adapter->fCaptureRingBuffer[i]->SetRatio(time1, time2);
adapter->fCaptureRingBuffer[i]->WriteResample((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames);
// adapter->fCaptureRingBuffer[i].Write((float*)adapter->fInputData->mBuffers[i].mData, inNumberFrames);
}
for (int i = 0; i < adapter->fPlaybackChannels; i++) {
adapter->fPlaybackRingBuffer[i]->SetRatio(time2, time1);
adapter->fPlaybackRingBuffer[i]->ReadResample((float*)ioData->mBuffers[i].mData, inNumberFrames);
// adapter->fPlaybackRingBuffer[i].Read((float*)ioData->mBuffers[i].mData, inNumberFrames);
}
return noErr;


+ 7
- 48
windows/JackPortAudioIOAdapter.cpp View File

@@ -34,14 +34,6 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer,
float** paBuffer;
float* buffer;
adapter->fLastCallbackTime = adapter->fCurCallbackTime;
adapter->fCurCallbackTime = jack_get_time();
adapter->fConsumerFilter.AddValue(adapter->fCurCallbackTime - adapter->fLastCallbackTime);
adapter->fProducerFilter.AddValue(adapter->fDeltaTime);
jack_log("JackPortAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime);
if (!adapter->fRunning) {
adapter->fRunning = true;
jack_time_t time = jack_get_time();
@@ -49,42 +41,15 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer,
adapter->fConsumerDLL.Init(time);
}
/*
double src_ratio_output = double(adapter->fCurCallbackTime - adapter->fLastCallbackTime) / double(adapter->fDeltaTime);
double src_ratio_input = double(adapter->fDeltaTime) / double(adapter->fCurCallbackTime - adapter->fLastCallbackTime);
*/
// DLL based
//adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime);
// DLL
jack_time_t time = jack_get_time();
adapter->fProducerDLL.IncFrame(time);
jack_nframes_t time1 = adapter->fConsumerDLL.Time2Frames(time);
jack_nframes_t time2 = adapter->fProducerDLL.Time2Frames(time);
//time1 = 1;
//time2 = 1;

/*
if ((adapter->fConsumerDLL.CurTime2Frame() / adapter->fSampleRate) > 10) {
printf("REINIT DLL\n");
adapter->fConsumerDLL.Init(time);
adapter->fConsumerDLL.Init(time);
}
*/
//printf("time1 %ld time2 %ld\n",time1, time2);

double src_ratio_output = double(time2) / double(time1);
double src_ratio_input = double(time1) / double(time2);
/*
jack_time_t val2 = adapter->fConsumerFilter.GetVal();
jack_time_t val1 = adapter->fProducerFilter.GetVal();
double src_ratio_output = double(val1) / double(val2);
double src_ratio_input = double(val2) / double(val1);
*/
if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) {
jack_error("src_ratio_input = %f", src_ratio_input);
src_ratio_input = 1;
@@ -98,31 +63,25 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer,
time1 = 1;
time2 = 1;
}
src_ratio_input = Range(0.8f, 1.2f, src_ratio_input);
src_ratio_output = Range(0.8f, 1.2f, src_ratio_output);
//jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
jack_log("Callback resampler src_ratio_input = %f src_ratio_output = %f", src_ratio_input, src_ratio_output);
paBuffer = (float**)inputBuffer;
for (int i = 0; i < adapter->fCaptureChannels; i++) {
buffer = (float*)paBuffer[i];
adapter->fCaptureRingBuffer[i]->SetRatio(time1, time2);
//adapter->fCaptureRingBuffer[i].WriteResample(buffer, framesPerBuffer);
//adapter->fCaptureRingBuffer[i].SetRatio(double(adapter->fNum) * adapter->fError1, adapter->fDenom);
adapter->fCaptureRingBuffer[i]->Write(buffer, framesPerBuffer);
}
adapter->fCaptureRingBuffer[i]->WriteResample(buffer, framesPerBuffer);
}
paBuffer = (float**)outputBuffer;
for (int i = 0; i < adapter->fPlaybackChannels; i++) {
buffer = (float*)paBuffer[i];
adapter->fPlaybackRingBuffer[i]->SetRatio(time2, time1);
//adapter->fPlaybackRingBuffer[i].ReadResample(buffer, framesPerBuffer);
//adapter->fCaptureRingBuffer[i].SetRatio(double(adapter->fDenom) * adapter->fError1, adapter->fNum);
adapter->fPlaybackRingBuffer[i]->Read(buffer, framesPerBuffer);
adapter->fPlaybackRingBuffer[i]->ReadResample(buffer, framesPerBuffer);
}
printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", double(time1) / double(time2), double(time2) / double(time1));
return paContinue;
}


Loading…
Cancel
Save