00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef CORE_AUDIO_DRIVER_H
00034 #define CORE_AUDIO_DRIVER_H
00035
00036 #include "Driver.h"
00037
00038 #include <CoreAudio/CoreAudio.h>
00039 #include <AudioToolbox/AudioConverter.h>
00040 #include <AudioUnit/AudioUnit.h>
00041
00042 #include "defines.h"
00043
00044
00045 class CoreAudioDriver : public Driver
00046 {
00047 public:
00048 CoreAudioDriver(AudioDevice* dev, int rate, nframes_t bufferSize);
00049 ~CoreAudioDriver();
00050
00051
00052
00053
00054
00055
00056
00057 int attach();
00058
00059
00060
00061 int setup(bool capture=true, bool playback=true, const QString& cardDevice="none");
00062
00063
00064 AudioUnit au_hal;
00065 AudioBufferList* input_list;
00066 AudioDeviceID device_id;
00067 int state;
00068
00069 channel_t playback_nchannels;
00070 channel_t capture_nchannels;
00071
00072 char capture_driver_name[256];
00073 char playback_driver_name[256];
00074
00075 int xrun_detected;
00076 int null_cycle_occured;
00077
00078
00079 void JCALog(char *fmt, ...);
00080 void printError(OSStatus err);
00081 OSStatus get_device_name_from_id(AudioDeviceID id, char name[256]);
00082 OSStatus get_device_id_from_uid(char* UID, AudioDeviceID* id);
00083 OSStatus get_default_device(AudioDeviceID * id);
00084 OSStatus get_default_input_device(AudioDeviceID* id);
00085 OSStatus get_default_output_device(AudioDeviceID* id);
00086 OSStatus get_total_channels(AudioDeviceID device, int* channelCount, bool isInput);
00087 OSStatus display_device_names();
00088
00089 OSStatus render(AudioUnitRenderActionFlags *ioActionFlags,
00090 const AudioTimeStamp *inTimeStamp,
00091 UInt32 inBusNumber,
00092 UInt32 inNumberFrames,
00093 AudioBufferList *ioData);
00094 OSStatus render_input(AudioUnitRenderActionFlags *ioActionFlags,
00095 const AudioTimeStamp *inTimeStamp,
00096 UInt32 inBusNumber,
00097 UInt32 inNumberFrames,
00098 AudioBufferList *ioData);
00099 OSStatus sr_notification(
00100 AudioDeviceID inDevice,
00101 UInt32 inChannel,
00102 Boolean isInput,
00103 AudioDevicePropertyID inPropertyID);
00104 OSStatus notification(
00105 AudioDeviceID inDevice,
00106 UInt32 inChannel,
00107 Boolean isInput,
00108 AudioDevicePropertyID inPropertyID);
00109
00110
00111 static OSStatus _render(void *inRefCon,
00112 AudioUnitRenderActionFlags *ioActionFlags,
00113 const AudioTimeStamp *inTimeStamp,
00114 UInt32 inBusNumber,
00115 UInt32 inNumberFrames,
00116 AudioBufferList *ioData);
00117 static OSStatus _render_input(
00118 void *inRefCon,
00119 AudioUnitRenderActionFlags *ioActionFlags,
00120 const AudioTimeStamp *inTimeStamp,
00121 UInt32 inBusNumber,
00122 UInt32 inNumberFrames,
00123 AudioBufferList *ioData);
00124 static OSStatus _sr_notification(
00125 AudioDeviceID inDevice,
00126 UInt32 inChannel,
00127 Boolean isInput,
00128 AudioDevicePropertyID inPropertyID,
00129 void* inClientData);
00130 static OSStatus _notification(
00131 AudioDeviceID inDevice,
00132 UInt32 inChannel,
00133 Boolean isInput,
00134 AudioDevicePropertyID inPropertyID,
00135 void* inClientData);
00136 };
00137
00138 #endif
00139
00140