/* Copyright (C) 2006 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 _asiosmpl_ #define _asiosmpl_ #include "asiosys.h" // Globals static int kBlockFrames = 256; static int kNumInputs = 4; static int kNumOutputs = 4; #if WINDOWS #include "jack.h" #include "rpc.h" #include "rpcndr.h" #ifndef COM_NO_WINDOWS_H #include #include "ole2.h" #endif #include "combase.h" #include "iasiodrv.h" #define MAX_PORTS 32 #define LONG_SAMPLE 1 #define PATH_SEP "\\" #include #include class JackRouter : public IASIO, public CUnknown { public: JackRouter(LPUNKNOWN pUnk, HRESULT *phr); ~JackRouter(); DECLARE_IUNKNOWN //STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \ // return GetOwner()->QueryInterface(riid,ppv); \ //}; \ //STDMETHODIMP_(ULONG) AddRef() { \ // return GetOwner()->AddRef(); \ //}; \ //STDMETHODIMP_(ULONG) Release() { \ // return GetOwner()->Release(); \ //}; // Factory method static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr); // IUnknown virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject); #else #include "asiodrvr.h" //--------------------------------------------------------------------------------------------- class JackRouter : public AsioDriver { public: JackRouter(); ~JackRouter(); #endif static int process(jack_nframes_t nframes, void* arg); static void shutdown(void* arg); ASIOBool init(void* sysRef); void getDriverName(char *name); // max 32 bytes incl. terminating zero long getDriverVersion(); void getErrorMessage(char *string); // max 128 bytes incl. ASIOError start(); ASIOError stop(); ASIOError getChannels(long *numInputChannels, long *numOutputChannels); ASIOError getLatencies(long *inputLatency, long *outputLatency); ASIOError getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity); ASIOError canSampleRate(ASIOSampleRate sampleRate); ASIOError getSampleRate(ASIOSampleRate *sampleRate); ASIOError setSampleRate(ASIOSampleRate sampleRate); ASIOError getClockSources(ASIOClockSource *clocks, long *numSources); ASIOError setClockSource(long index); ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp); ASIOError getChannelInfo(ASIOChannelInfo *info); ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels, long bufferSize, ASIOCallbacks *callbacks); ASIOError disposeBuffers(); ASIOError controlPanel(); ASIOError future(long selector, void *opt); ASIOError outputReady(); void bufferSwitch(); long getMilliSeconds() {return fMilliSeconds;} static bool fFirstActivate; static std::list > fConnections; // Connections list private: void bufferSwitchX(); double fSamplePosition; ASIOCallbacks* fCallbacks; ASIOTime fAsioTime; ASIOTimeStamp fTheSystemTime; #ifdef LONG_SAMPLE long* fInputBuffers[MAX_PORTS * 2]; long* fOutputBuffers[MAX_PORTS * 2]; #else float* fInputBuffers[MAX_PORTS * 2]; float* fOutputBuffers[MAX_PORTS * 2]; #endif long fInMap[MAX_PORTS]; long fOutMap[MAX_PORTS]; long fInputLatency; long fOutputLatency; long fActiveInputs; long fActiveOutputs; long fToggle; long fMilliSeconds; bool fActive, fStarted; bool fTimeInfoMode, fTcRead; char fErrorMessage[128]; bool fAutoConnectIn; bool fAutoConnectOut; // Jack part jack_client_t* fClient; jack_port_t* fInputPorts[MAX_PORTS]; jack_port_t* fOutputPorts[MAX_PORTS]; long fBufferSize; ASIOSampleRate fSampleRate; void AutoConnect(); void SaveConnections(); void RestoreConnections(); }; #endif