git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2595 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -18,6 +18,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include "JackCallbackNetIOAdapter.h" | |||
#include "JackLibSampleRateResampler.h" | |||
#include "JackError.h" | |||
#include "JackExports.h" | |||
#include <stdio.h> | |||
@@ -51,17 +52,17 @@ int JackCallbackNetIOAdapter::Process(jack_nframes_t frames, void* arg) | |||
//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()); | |||
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); | |||
adapter->fCaptureRingBuffer[i]->Read(buffer, frames); | |||
} | |||
for (i = 0; i < adapter->fPlaybackChannels; i++) { | |||
buffer = static_cast<float*>(jack_port_get_buffer(adapter->fPlaybackPortList[i], frames)); | |||
adapter->fPlaybackRingBuffer[i].Write(buffer, frames); | |||
adapter->fPlaybackRingBuffer[i]->Write(buffer, frames); | |||
} | |||
return 0; | |||
@@ -80,35 +81,25 @@ JackCallbackNetIOAdapter::JackCallbackNetIOAdapter(jack_client_t* jack_client, | |||
int output) | |||
: JackNetIOAdapter(jack_client, audio_io, input, output) | |||
{ | |||
int i; | |||
fCurCallbackTime = 0; | |||
fLastCallbackTime = 0; | |||
fCaptureRingBuffer = new JackResampler[fCaptureChannels]; | |||
fPlaybackRingBuffer = new JackResampler[fPlaybackChannels]; | |||
fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); | |||
fCaptureRingBuffer = new JackResampler*[fCaptureChannels]; | |||
fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels]; | |||
// Init Ringbuffers | |||
/* | |||
int frames = jack_get_buffer_size(jack_client); | |||
float buffer[frames]; | |||
int i; | |||
for (i = 0; i < fCaptureChannels; i++) { | |||
fCaptureRingBuffer[i].Read(buffer, frames); | |||
fCaptureRingBuffer[i].Read(buffer, frames); | |||
fCaptureRingBuffer[i].Read(buffer, frames); | |||
fCaptureRingBuffer[i] = new JackLibSampleRateResampler(); | |||
} | |||
for (i = 0; i < fPlaybackChannels; i++) { | |||
fPlaybackRingBuffer[i].Write(buffer, frames); | |||
fPlaybackRingBuffer[i].Write(buffer, frames); | |||
fPlaybackRingBuffer[i].Write(buffer, frames); | |||
} | |||
*/ | |||
jack_log("ReadSpace = %ld", fCaptureRingBuffer[0].ReadSpace()); | |||
jack_log("WriteSpace = %ld", fPlaybackRingBuffer[0].WriteSpace()); | |||
fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(); | |||
} | |||
fIOAdapter->SetRingBuffers(fCaptureRingBuffer, fPlaybackRingBuffer); | |||
jack_log("ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace()); | |||
jack_log("WriteSpace = %ld", fPlaybackRingBuffer[0]->WriteSpace()); | |||
if (jack_set_process_callback(fJackClient, Process, this) < 0) | |||
goto fail; | |||
@@ -127,6 +118,16 @@ fail: | |||
JackCallbackNetIOAdapter::~JackCallbackNetIOAdapter() | |||
{ | |||
int i; | |||
for (i = 0; i < fCaptureChannels; i++) { | |||
delete(fCaptureRingBuffer[i]); | |||
} | |||
for (i = 0; i < fPlaybackChannels; i++) { | |||
delete(fPlaybackRingBuffer[i]); | |||
} | |||
delete[] fCaptureRingBuffer; | |||
delete[] fPlaybackRingBuffer; | |||
} | |||
@@ -31,8 +31,8 @@ namespace Jack | |||
private: | |||
JackResampler* fCaptureRingBuffer; | |||
JackResampler* fPlaybackRingBuffer; | |||
JackResampler** fCaptureRingBuffer; | |||
JackResampler** fPlaybackRingBuffer; | |||
jack_time_t fLastCallbackTime; | |||
jack_time_t fCurCallbackTime; | |||
@@ -125,7 +125,6 @@ namespace Jack | |||
} | |||
}; | |||
inline float Range(float min, float max, float val) | |||
{ | |||
@@ -52,10 +52,10 @@ namespace Jack | |||
// DLL | |||
JackDelayLockedLoop fProducerDLL; | |||
JackDelayLockedLoop fConsumerDLL; | |||
jack_time_t fCurFrames; | |||
JackResampler* fCaptureRingBuffer; | |||
JackResampler* fPlaybackRingBuffer; | |||
JackResampler** fCaptureRingBuffer; | |||
JackResampler** fPlaybackRingBuffer; | |||
bool fRunning; | |||
public: | |||
@@ -75,7 +75,7 @@ namespace Jack | |||
virtual ~JackIOAdapterInterface() | |||
{} | |||
void SetRingBuffers(JackResampler* input, JackResampler* output) | |||
void SetRingBuffers(JackResampler** input, JackResampler** output) | |||
{ | |||
fCaptureRingBuffer = input; | |||
fPlaybackRingBuffer = output; | |||
@@ -22,8 +22,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
JackLibSampleRateResampler::JackLibSampleRateResampler():JackResampler(),fRatio(1) | |||
JackLibSampleRateResampler::JackLibSampleRateResampler() | |||
:JackResampler(),fRatio(1) | |||
{ | |||
jack_log("JackLibSampleRateResampler::JackLibSampleRateResampler"); | |||
int error; | |||
fResampler = src_new(SRC_LINEAR, 1, &error); | |||
if (error != 0) | |||
@@ -42,7 +42,7 @@ namespace Jack | |||
int ReadResample(float* buffer, unsigned int frames); | |||
int WriteResample(float* buffer, unsigned int frames); | |||
virtual void SetRatio(unsigned int num, unsigned int denom) | |||
void SetRatio(unsigned int num, unsigned int denom) | |||
{ | |||
JackResampler::SetRatio(num, denom); | |||
fRatio = double(num) / double(denom); | |||
@@ -115,15 +115,17 @@ 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); | |||
if (adapter->Open() == 0) { | |||
@@ -22,9 +22,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
JackResampler::JackResampler() | |||
:fNum(1),fDenom(1) | |||
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); | |||
} | |||
@@ -27,7 +27,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
namespace Jack | |||
{ | |||
#define DEFAULT_RB_SIZE 16384 * 4 | |||
#define DEFAULT_RB_SIZE 16384 * 1 | |||
class JackResampler | |||
{ | |||
@@ -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 ackLibSampleRateResampler.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']: | |||
@@ -122,7 +122,6 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
{ | |||
JackCoreAudioIOAdapter* adapter = static_cast<JackCoreAudioIOAdapter*>(inRefCon); | |||
jack_log("JackCoreAudioIOAdapter::Render inNumberFrames %ld", inNumberFrames); | |||
AudioUnitRender(adapter->fAUHAL, ioActionFlags, inTimeStamp, 1, inNumberFrames, adapter->fInputData); | |||
@@ -135,7 +134,7 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
adapter->fProducerFilter.AddValue(adapter->fDeltaTime); | |||
*/ | |||
jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
//jack_log("JackCoreAudioIOAdapter::Render delta %ld", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
//printf("JackCoreAudioIOAdapter::Render delta %ld\n", adapter->fCurCallbackTime - adapter->fLastCallbackTime); | |||
if (!adapter->fRunning) { | |||
@@ -143,7 +142,6 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
jack_time_t time = jack_get_time(); | |||
adapter->fProducerDLL.Init(time); | |||
adapter->fConsumerDLL.Init(time); | |||
adapter->fCurFrames = 0; | |||
} | |||
// DLL based | |||
@@ -174,11 +172,15 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { | |||
jack_error("src_ratio_input = %f", src_ratio_input); | |||
src_ratio_input = 1; | |||
time1 = 1; | |||
time2 = 1; | |||
} | |||
if (src_ratio_output < 0.8f || src_ratio_output > 1.2f) { | |||
jack_error("src_ratio_output = %f", src_ratio_output); | |||
src_ratio_output = 1; | |||
time1 = 1; | |||
time2 = 1; | |||
} | |||
src_ratio_input = Range(0.8f, 1.2f, src_ratio_input); | |||
@@ -189,14 +191,14 @@ OSStatus JackCoreAudioIOAdapter::Render(void *inRefCon, | |||
printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", 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]->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]->SetRatio(time2, time1); | |||
adapter->fPlaybackRingBuffer[i]->ReadResample((float*)ioData->mBuffers[i].mData, inNumberFrames); | |||
// adapter->fPlaybackRingBuffer[i].Read((float*)ioData->mBuffers[i].mData, inNumberFrames); | |||
} | |||
@@ -47,7 +47,6 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
jack_time_t time = jack_get_time(); | |||
adapter->fProducerDLL.Init(time); | |||
adapter->fConsumerDLL.Init(time); | |||
adapter->fCurFrames = 0; | |||
} | |||
/* | |||
@@ -59,10 +58,21 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
//adapter->fConsumerDLL.IncFrame(adapter->fConsumerTime); | |||
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); | |||
@@ -78,11 +88,15 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
if (src_ratio_input < 0.8f || src_ratio_input > 1.2f) { | |||
jack_error("src_ratio_input = %f", src_ratio_input); | |||
src_ratio_input = 1; | |||
time1 = 1; | |||
time2 = 1; | |||
} | |||
if (src_ratio_output < 0.8f || src_ratio_output > 1.2f) { | |||
jack_error("src_ratio_output = %f", src_ratio_output); | |||
src_ratio_output = 1; | |||
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); | |||
@@ -92,23 +106,23 @@ int JackPortAudioIOAdapter::Render(const void* inputBuffer, void* outputBuffer, | |||
paBuffer = (float**)inputBuffer; | |||
for (int i = 0; i < adapter->fCaptureChannels; i++) { | |||
buffer = (float*)paBuffer[i]; | |||
adapter->fCaptureRingBuffer[i].SetRatio(time1, time2); | |||
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]->Write(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]->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]->Read(buffer, framesPerBuffer); | |||
} | |||
printf("Callback resampler src_ratio_input = %f src_ratio_output = %f\n", double(time1) / double(time2), double(time2) / double(time1)); | |||
return paContinue; | |||
} | |||