/* 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 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