179 lines
5.5 KiB
C++
179 lines
5.5 KiB
C++
/*
|
|
Copyright (C) 2008 Grame
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
#ifndef __JackAudioAdapterInterface__
|
|
#define __JackAudioAdapterInterface__
|
|
|
|
#include "JackResampler.h"
|
|
#include "JackFilters.h"
|
|
#include <stdio.h>
|
|
|
|
namespace Jack
|
|
{
|
|
|
|
#ifdef JACK_MONITOR
|
|
|
|
#define TABLE_MAX 100000
|
|
|
|
struct Measure
|
|
{
|
|
int delta;
|
|
int time1;
|
|
int time2;
|
|
float r1;
|
|
float r2;
|
|
int pos1;
|
|
int pos2;
|
|
};
|
|
|
|
struct MeasureTable
|
|
{
|
|
|
|
Measure fTable[TABLE_MAX];
|
|
int fCount;
|
|
|
|
MeasureTable() :fCount(0)
|
|
{}
|
|
|
|
void Write(int time1, int time2, float r1, float r2, int pos1, int pos2);
|
|
void Save(unsigned int fHostBufferSize, unsigned int fHostSampleRate, unsigned int fAdaptedSampleRate, unsigned int fAdaptedBufferSize);
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
/*!
|
|
\brief Base class for audio adapters.
|
|
*/
|
|
|
|
class JackAudioAdapterInterface
|
|
{
|
|
|
|
protected:
|
|
|
|
#ifdef JACK_MONITOR
|
|
MeasureTable fTable;
|
|
#endif
|
|
//channels
|
|
int fCaptureChannels;
|
|
int fPlaybackChannels;
|
|
|
|
//host parameters
|
|
jack_nframes_t fHostBufferSize;
|
|
jack_nframes_t fHostSampleRate;
|
|
|
|
//adapted parameters
|
|
jack_nframes_t fAdaptedBufferSize;
|
|
jack_nframes_t fAdaptedSampleRate;
|
|
|
|
//PI controller
|
|
JackPIControler fPIControler;
|
|
|
|
JackResampler** fCaptureRingBuffer;
|
|
JackResampler** fPlaybackRingBuffer;
|
|
|
|
unsigned int fQuality;
|
|
unsigned int fRingbufferCurSize;
|
|
jack_time_t fPullAndPushTime;
|
|
|
|
bool fRunning;
|
|
bool fAdaptative;
|
|
|
|
void ResetRingBuffers();
|
|
void AdaptRingBufferSize();
|
|
void GrowRingBufferSize();
|
|
|
|
public:
|
|
|
|
JackAudioAdapterInterface(jack_nframes_t buffer_size, jack_nframes_t sample_rate, jack_nframes_t ring_buffer_size = DEFAULT_ADAPTATIVE_SIZE):
|
|
fCaptureChannels(0),
|
|
fPlaybackChannels(0),
|
|
fHostBufferSize(buffer_size),
|
|
fHostSampleRate(sample_rate),
|
|
fAdaptedBufferSize(buffer_size),
|
|
fAdaptedSampleRate(sample_rate),
|
|
fPIControler(sample_rate / sample_rate, 256),
|
|
fCaptureRingBuffer(NULL), fPlaybackRingBuffer(NULL),
|
|
fQuality(0),
|
|
fRingbufferCurSize(ring_buffer_size),
|
|
fPullAndPushTime(0),
|
|
fRunning(false),
|
|
fAdaptative(true)
|
|
{}
|
|
|
|
JackAudioAdapterInterface(jack_nframes_t host_buffer_size,
|
|
jack_nframes_t host_sample_rate,
|
|
jack_nframes_t adapted_buffer_size,
|
|
jack_nframes_t adapted_sample_rate,
|
|
jack_nframes_t ring_buffer_size = DEFAULT_ADAPTATIVE_SIZE) :
|
|
fCaptureChannels(0),
|
|
fPlaybackChannels(0),
|
|
fHostBufferSize(host_buffer_size),
|
|
fHostSampleRate(host_sample_rate),
|
|
fAdaptedBufferSize(adapted_buffer_size),
|
|
fAdaptedSampleRate(adapted_sample_rate),
|
|
fPIControler(host_sample_rate / host_sample_rate, 256),
|
|
fQuality(0),
|
|
fRingbufferCurSize(ring_buffer_size),
|
|
fPullAndPushTime(0),
|
|
fRunning(false),
|
|
fAdaptative(true)
|
|
{}
|
|
|
|
virtual ~JackAudioAdapterInterface()
|
|
{}
|
|
|
|
virtual void Reset();
|
|
|
|
virtual void Create();
|
|
virtual void Destroy();
|
|
|
|
virtual int Open()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
virtual int Close()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
virtual int SetHostBufferSize(jack_nframes_t buffer_size);
|
|
virtual int SetAdaptedBufferSize(jack_nframes_t buffer_size);
|
|
virtual int SetBufferSize(jack_nframes_t buffer_size);
|
|
virtual int SetHostSampleRate(jack_nframes_t sample_rate);
|
|
virtual int SetAdaptedSampleRate(jack_nframes_t sample_rate);
|
|
virtual int SetSampleRate(jack_nframes_t sample_rate);
|
|
void SetInputs(int inputs);
|
|
void SetOutputs(int outputs);
|
|
int GetInputs();
|
|
int GetOutputs();
|
|
|
|
virtual int GetInputLatency(int port_index) { return 0; }
|
|
virtual int GetOutputLatency(int port_index) { return 0; }
|
|
|
|
int PushAndPull(jack_default_audio_sample_t** inputBuffer, jack_default_audio_sample_t** outputBuffer, unsigned int frames);
|
|
int PullAndPush(jack_default_audio_sample_t** inputBuffer, jack_default_audio_sample_t** outputBuffer, unsigned int frames);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|