00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __JackCoreAudioDriver__
00021 #define __JackCoreAudioDriver__
00022
00023 #include <AudioToolbox/AudioConverter.h>
00024 #include <CoreAudio/CoreAudio.h>
00025 #include <AudioUnit/AudioUnit.h>
00026 #include "JackAudioDriver.h"
00027 #include "JackTime.h"
00028
00029 #include <vector>
00030
00031 using namespace std;
00032
00033 namespace Jack
00034 {
00035
00036 #define kVersion 102
00037
00038 typedef UInt8 CAAudioHardwareDeviceSectionID;
00039 #define kAudioDeviceSectionInput ((CAAudioHardwareDeviceSectionID)0x01)
00040 #define kAudioDeviceSectionOutput ((CAAudioHardwareDeviceSectionID)0x00)
00041 #define kAudioDeviceSectionGlobal ((CAAudioHardwareDeviceSectionID)0x00)
00042 #define kAudioDeviceSectionWildcard ((CAAudioHardwareDeviceSectionID)0xFF)
00043
00044 #define WAIT_COUNTER 60
00045
00052 class JackCoreAudioDriver : public JackAudioDriver
00053 {
00054
00055 private:
00056
00057 AudioUnit fAUHAL;
00058
00059 AudioBufferList* fJackInputData;
00060 AudioBufferList* fDriverOutputData;
00061
00062 AudioDeviceID fDeviceID;
00063 AudioObjectID fPluginID;
00064
00065 AudioUnitRenderActionFlags* fActionFags;
00066 AudioTimeStamp* fCurrentTime;
00067
00068 bool fState;
00069 bool fHogged;
00070
00071
00072 bool fCapturing;
00073 bool fPlaying;
00074
00075 int fInChannels;
00076 int fOutChannels;
00077
00078 char fCaptureUID[256];
00079 char fPlaybackUID[256];
00080
00081 bool fMonitor;
00082 float fIOUsage;
00083 float fComputationGrain;
00084 bool fClockDriftCompensate;
00085
00086
00087
00088
00089
00090
00091
00092 static OSStatus Render(void *inRefCon,
00093 AudioUnitRenderActionFlags *ioActionFlags,
00094 const AudioTimeStamp *inTimeStamp,
00095 UInt32 inBusNumber,
00096 UInt32 inNumberFrames,
00097 AudioBufferList *ioData);
00098
00099 static OSStatus MeasureCallback(AudioDeviceID inDevice,
00100 const AudioTimeStamp* inNow,
00101 const AudioBufferList* inInputData,
00102 const AudioTimeStamp* inInputTime,
00103 AudioBufferList* outOutputData,
00104 const AudioTimeStamp* inOutputTime,
00105 void* inClientData);
00106
00107 static OSStatus DeviceNotificationCallback(AudioDeviceID inDevice,
00108 UInt32 inChannel,
00109 Boolean isInput,
00110 AudioDevicePropertyID inPropertyID,
00111 void* inClientData);
00112
00113 static OSStatus SRNotificationCallback(AudioDeviceID inDevice,
00114 UInt32 inChannel,
00115 Boolean isInput,
00116 AudioDevicePropertyID inPropertyID,
00117 void* inClientData);
00118
00119 OSStatus GetDeviceIDFromUID(const char* UID, AudioDeviceID* id);
00120 OSStatus GetDefaultDevice(AudioDeviceID* id);
00121 OSStatus GetDefaultInputDevice(AudioDeviceID* id);
00122 OSStatus GetDefaultOutputDevice(AudioDeviceID* id);
00123 OSStatus GetDeviceNameFromID(AudioDeviceID id, char* name);
00124 OSStatus GetTotalChannels(AudioDeviceID device, int& channelCount, bool isInput);
00125
00126
00127 OSStatus CreateAggregateDevice(AudioDeviceID captureDeviceID, AudioDeviceID playbackDeviceID, jack_nframes_t samplerate, AudioDeviceID* outAggregateDevice);
00128 OSStatus CreateAggregateDeviceAux(vector<AudioDeviceID> captureDeviceID, vector<AudioDeviceID> playbackDeviceID, jack_nframes_t samplerate, AudioDeviceID* outAggregateDevice);
00129 OSStatus DestroyAggregateDevice();
00130 bool IsAggregateDevice(AudioDeviceID device);
00131
00132 int SetupDevices(const char* capture_driver_uid,
00133 const char* playback_driver_uid,
00134 char* capture_driver_name,
00135 char* playback_driver_name,
00136 jack_nframes_t samplerate);
00137
00138 int SetupChannels(bool capturing,
00139 bool playing,
00140 int& inchannels,
00141 int& outchannels,
00142 int& in_nChannels,
00143 int& out_nChannels,
00144 bool strict);
00145
00146 int SetupBuffers(int inchannels);
00147 void DisposeBuffers();
00148
00149 int SetupBufferSize(jack_nframes_t buffer_size);
00150 int SetupSampleRate(jack_nframes_t samplerate);
00151 int SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes_t samplerate);
00152
00153 int OpenAUHAL(bool capturing,
00154 bool playing,
00155 int inchannels,
00156 int outchannels,
00157 int in_nChannels,
00158 int out_nChannels,
00159 jack_nframes_t nframes,
00160 jack_nframes_t samplerate);
00161 void CloseAUHAL();
00162
00163 int AddListeners();
00164 void RemoveListeners();
00165
00166 bool TakeHogAux(AudioDeviceID deviceID, bool isInput);
00167 bool TakeHog();
00168
00169 public:
00170
00171 JackCoreAudioDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table);
00172 virtual ~JackCoreAudioDriver();
00173
00174 int Open(jack_nframes_t buffer_size,
00175 jack_nframes_t samplerate,
00176 bool capturing,
00177 bool playing,
00178 int chan_in,
00179 int chan_out,
00180 bool monitor,
00181 const char* capture_driver_name,
00182 const char* playback_driver_name,
00183 jack_nframes_t capture_latency,
00184 jack_nframes_t playback_latency,
00185 int async_output_latency,
00186 int computation_grain,
00187 bool hogged,
00188 bool clock_drift);
00189 int Close();
00190
00191 int Attach();
00192
00193 int Start();
00194 int Stop();
00195
00196 int Read();
00197 int Write();
00198
00199
00200 bool IsFixedBufferSize()
00201 {
00202 return false;
00203 }
00204
00205 int SetBufferSize(jack_nframes_t buffer_size);
00206 };
00207
00208 }
00209
00210 #endif