jack2/common/JackAudioAdapterInterface.h

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