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 #define WAIT_NOTIFICATION_COUNTER 30
00046
00053 class JackCoreAudioDriver : public JackAudioDriver
00054 {
00055
00056 private:
00057
00058 AudioUnit fAUHAL;
00059
00060 AudioBufferList* fJackInputData;
00061 AudioBufferList* fDriverOutputData;
00062
00063 AudioDeviceID fDeviceID;
00064 AudioObjectID fPluginID;
00065
00066 AudioUnitRenderActionFlags* fActionFags;
00067 const AudioTimeStamp* fCurrentTime;
00068
00069 bool fState;
00070 bool fHogged;
00071
00072 char fCaptureUID[256];
00073 char fPlaybackUID[256];
00074
00075 float fIOUsage;
00076 float fComputationGrain;
00077 bool fClockDriftCompensate;
00078
00079
00080 static OSStatus Render(void *inRefCon,
00081 AudioUnitRenderActionFlags *ioActionFlags,
00082 const AudioTimeStamp *inTimeStamp,
00083 UInt32 inBusNumber,
00084 UInt32 inNumberFrames,
00085 AudioBufferList *ioData);
00086
00087 static OSStatus AudioHardwareNotificationCallback(AudioHardwarePropertyID inPropertyID,void* inClientData);
00088
00089 static OSStatus DeviceNotificationCallback(AudioDeviceID inDevice,
00090 UInt32 inChannel,
00091 Boolean isInput,
00092 AudioDevicePropertyID inPropertyID,
00093 void* inClientData);
00094
00095 static OSStatus SRNotificationCallback(AudioDeviceID inDevice,
00096 UInt32 inChannel,
00097 Boolean isInput,
00098 AudioDevicePropertyID inPropertyID,
00099 void* inClientData);
00100
00101 static OSStatus BSNotificationCallback(AudioDeviceID inDevice,
00102 UInt32 inChannel,
00103 Boolean isInput,
00104 AudioDevicePropertyID inPropertyID,
00105 void* inClientData);
00106
00107 OSStatus GetDeviceIDFromUID(const char* UID, AudioDeviceID* id);
00108 OSStatus GetDefaultDevice(AudioDeviceID* id);
00109 OSStatus GetDefaultInputDevice(AudioDeviceID* id);
00110 OSStatus GetDefaultOutputDevice(AudioDeviceID* id);
00111 OSStatus GetDeviceNameFromID(AudioDeviceID id, char* name);
00112 OSStatus GetTotalChannels(AudioDeviceID device, int& channelCount, bool isInput);
00113 OSStatus GetStreamLatencies(AudioDeviceID device, bool isInput, vector<int>& latencies);
00114
00115
00116 OSStatus CreateAggregateDevice(AudioDeviceID captureDeviceID, AudioDeviceID playbackDeviceID, jack_nframes_t samplerate, AudioDeviceID* outAggregateDevice);
00117 OSStatus CreateAggregateDeviceAux(vector<AudioDeviceID> captureDeviceID, vector<AudioDeviceID> playbackDeviceID, jack_nframes_t samplerate, AudioDeviceID* outAggregateDevice);
00118 OSStatus DestroyAggregateDevice();
00119 bool IsAggregateDevice(AudioDeviceID device);
00120
00121 int SetupDevices(const char* capture_driver_uid,
00122 const char* playback_driver_uid,
00123 char* capture_driver_name,
00124 char* playback_driver_name,
00125 jack_nframes_t samplerate);
00126
00127 int SetupChannels(bool capturing,
00128 bool playing,
00129 int& inchannels,
00130 int& outchannels,
00131 int& in_nChannels,
00132 int& out_nChannels,
00133 bool strict);
00134
00135 int SetupBuffers(int inchannels);
00136 void DisposeBuffers();
00137
00138 int SetupBufferSize(jack_nframes_t buffer_size);
00139 int SetupSampleRate(jack_nframes_t samplerate);
00140 int SetupSampleRateAux(AudioDeviceID inDevice, jack_nframes_t samplerate);
00141
00142 int OpenAUHAL(bool capturing,
00143 bool playing,
00144 int inchannels,
00145 int outchannels,
00146 int in_nChannels,
00147 int out_nChannels,
00148 const vector<int>& chan_in_list,
00149 const vector<int>& chan_out_list,
00150 jack_nframes_t nframes,
00151 jack_nframes_t samplerate);
00152 void CloseAUHAL();
00153
00154 int AddListeners();
00155 void RemoveListeners();
00156
00157 bool TakeHogAux(AudioDeviceID deviceID, bool isInput);
00158 bool TakeHog();
00159
00160 void UpdateLatencies();
00161
00162 public:
00163
00164 JackCoreAudioDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table);
00165 virtual ~JackCoreAudioDriver();
00166
00167 int Open(jack_nframes_t buffer_size,
00168 jack_nframes_t samplerate,
00169 bool capturing,
00170 bool playing,
00171 int inchannels,
00172 int outchannels,
00173 const char* chan_in_list,
00174 const char* chan_out_list,
00175 bool monitor,
00176 const char* capture_driver_name,
00177 const char* playback_driver_name,
00178 jack_nframes_t capture_latency,
00179 jack_nframes_t playback_latency,
00180 int async_output_latency,
00181 int computation_grain,
00182 bool hogged,
00183 bool clock_drift);
00184 int Close();
00185
00186 int Attach();
00187
00188 int Start();
00189 int Stop();
00190
00191 int Read();
00192 int Write();
00193
00194
00195 bool IsFixedBufferSize()
00196 {
00197 return false;
00198 }
00199
00200 int SetBufferSize(jack_nframes_t buffer_size);
00201 };
00202
00203 }
00204
00205 #endif