00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __JackCoreAudioAdapter__
00021 #define __JackCoreAudioAdapter__
00022
00023 #include "JackAudioAdapterInterface.h"
00024 #include "jack.h"
00025 #include "jslist.h"
00026 #include <AudioToolbox/AudioConverter.h>
00027 #include <CoreAudio/CoreAudio.h>
00028 #include <AudioUnit/AudioUnit.h>
00029
00030 namespace Jack
00031 {
00032
00033 typedef UInt8 CAAudioHardwareDeviceSectionID;
00034 #define kAudioDeviceSectionInput ((CAAudioHardwareDeviceSectionID)0x01)
00035 #define kAudioDeviceSectionOutput ((CAAudioHardwareDeviceSectionID)0x00)
00036 #define kAudioDeviceSectionGlobal ((CAAudioHardwareDeviceSectionID)0x00)
00037 #define kAudioDeviceSectionWildcard ((CAAudioHardwareDeviceSectionID)0xFF)
00038
00043 class JackCoreAudioAdapter : public JackAudioAdapterInterface
00044 {
00045
00046 private:
00047
00048 AudioUnit fAUHAL;
00049 AudioBufferList* fInputData;
00050
00051 char fCaptureUID[256];
00052 char fPlaybackUID[256];
00053
00054 bool fCapturing;
00055 bool fPlaying;
00056
00057 AudioDeviceID fDeviceID;
00058 bool fState;
00059
00060 AudioUnitRenderActionFlags* fActionFags;
00061 AudioTimeStamp* fCurrentTime;
00062
00063 static OSStatus Render(void *inRefCon,
00064 AudioUnitRenderActionFlags *ioActionFlags,
00065 const AudioTimeStamp *inTimeStamp,
00066 UInt32 inBusNumber,
00067 UInt32 inNumberFrames,
00068 AudioBufferList *ioData);
00069
00070 static OSStatus SRNotificationCallback(AudioDeviceID inDevice,
00071 UInt32 inChannel,
00072 Boolean isInput,
00073 AudioDevicePropertyID inPropertyID,
00074 void* inClientData);
00075 static OSStatus DeviceNotificationCallback(AudioDeviceID inDevice,
00076 UInt32 inChannel,
00077 Boolean isInput,
00078 AudioDevicePropertyID inPropertyID,
00079 void* inClientData);
00080
00081 OSStatus GetDefaultDevice(AudioDeviceID* id);
00082 OSStatus GetTotalChannels(AudioDeviceID device, int& channelCount, bool isInput);
00083 OSStatus GetDeviceIDFromUID(const char* UID, AudioDeviceID* id);
00084 OSStatus GetDefaultInputDevice(AudioDeviceID* id);
00085 OSStatus GetDefaultOutputDevice(AudioDeviceID* id);
00086 OSStatus GetDeviceNameFromID(AudioDeviceID id, char* name);
00087
00088
00089 int SetupDevices(const char* capture_driver_uid,
00090 const char* playback_driver_uid,
00091 char* capture_driver_name,
00092 char* playback_driver_name);
00093
00094 int SetupChannels(bool capturing,
00095 bool playing,
00096 int& inchannels,
00097 int& outchannels,
00098 int& in_nChannels,
00099 int& out_nChannels,
00100 bool strict);
00101
00102 int OpenAUHAL(bool capturing,
00103 bool playing,
00104 int inchannels,
00105 int outchannels,
00106 int in_nChannels,
00107 int out_nChannels,
00108 jack_nframes_t buffer_size,
00109 jack_nframes_t samplerate,
00110 bool strict);
00111
00112 int SetupBufferSizeAndSampleRate(jack_nframes_t buffer_size, jack_nframes_t samplerate);
00113 int SetupBuffers(int inchannels);
00114 void DisposeBuffers();
00115 void CloseAUHAL();
00116
00117 int AddListeners();
00118 void RemoveListeners();
00119
00120 public:
00121
00122 JackCoreAudioAdapter( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
00123 ~JackCoreAudioAdapter()
00124 {}
00125
00126 virtual int Open();
00127 virtual int Close();
00128
00129 virtual int SetSampleRate(jack_nframes_t sample_rate);
00130 virtual int SetBufferSize(jack_nframes_t buffer_size);
00131
00132 };
00133 }
00134
00135 #ifdef __cplusplus
00136 extern "C"
00137 {
00138 #endif
00139
00140 #include "JackCompilerDeps.h"
00141 #include "driver_interface.h"
00142
00143 SERVER_EXPORT jack_driver_desc_t* jack_get_descriptor();
00144
00145 #ifdef __cplusplus
00146 }
00147 #endif
00148
00149 #endif