|
Wave Arts VQE
1.00
Voice Quality Enhancement
|
00001 //=========================================================== 00002 // 00003 // Copyright (C) 2011 Wave Arts, Inc., 99 Massachusetts Ave., 00004 // Arlington, MA 02474. All rights reserved. 00005 // 00006 //=========================================================== 00007 // 00008 // WaAudioDev C++ wrapper around Mac Core Audio using AUHAL and output audio units. 00009 // 00010 // Rob Martino, August 2011 00011 // 00012 00018 00019 00020 #ifndef __WadMacHAL_H__ 00021 #define __WadMacHAL_H__ 00022 /* 00023 #define checkErr( err) \ 00024 if(err) {\ 00025 OSStatus error = static_cast<OSStatus>(err);\ 00026 fprintf(stdout, "WadMacHAL Error: %ld -> %s: %d\n", error,\ 00027 __FILE__, \ 00028 __LINE__\ 00029 );\ 00030 fflush(stdout);\ 00031 } 00032 */ 00033 00034 00035 #include "WaAudioDev.h" 00036 #include <CoreAudio/CoreAudio.h> 00037 #include <CoreServices/CoreServices.h> 00038 #include <AudioToolbox/AudioToolbox.h> 00039 #include <AudioUnit/AudioUnit.h> 00040 #include <pthread.h> 00041 #include "CAStreamBasicDescription.h" 00042 #include "WadResPort.h" 00043 #include "WadConvPort.h" 00044 00049 typedef struct { 00050 WadDevInfo info; 00051 AudioDeviceID id; 00052 } WaACDevInfo; 00053 00054 #pragma mark -- WadMacHAL 00055 00056 // we define the class here so that is is not accessible from any object aside from WadMacHALManager 00061 class WadMacHAL : public WaAudioDev 00062 { 00063 public: 00065 WadMacHAL(); 00067 ~WadMacHAL(); 00068 00069 int Init(); 00070 00071 // implement WaAudioDev 00072 virtual int GetNumDevices(int *pNumDev); 00073 virtual int GetDevInfo(int devId, WadDevInfo *pInfo); 00074 virtual int GetDefaultInDevId(int *pId); 00075 virtual int GetDefaultOutDevId(int *pId); 00076 virtual int Open(WadParam *param, WadCallbackFn *inFn, WadCallbackFn *outFn, void *arg); 00077 virtual int Start(); 00078 virtual int Stop(); 00079 virtual void Close(); 00080 virtual void Wait(); 00081 virtual int SetVol(int devId, bool outputFlag, float vol); 00082 virtual int GetVol(int devId, bool outputFlag, float *pVol); 00083 virtual bool IsRunning() { return m_running; } 00084 virtual int GetBufTime(bool isOutput, int *pBufTimeMsec); 00085 virtual WadAPI GetAPI(); 00086 00088 OSStatus Init(AudioDeviceID input, AudioDeviceID output); 00090 void Cleanup(); 00092 OSStatus SetInputDeviceAsCurrent(AudioDeviceID in); 00094 OSStatus SetOutputDeviceAsCurrent(AudioDeviceID out); 00095 00096 00097 protected: 00098 WaACDevInfo *m_Devs; 00099 00100 private: 00101 OSStatus CreateOutput(AudioDeviceID out); 00102 OSStatus SetupAUHAL(AudioDeviceID in); 00103 OSStatus EnableIO(); 00104 OSStatus CallbackSetup(); 00105 OSStatus SetupBuffers(); 00106 00107 static OSStatus InputProc(void *inRefCon, 00108 AudioUnitRenderActionFlags *ioActionFlags, 00109 const AudioTimeStamp *inTimeStamp, 00110 UInt32 inBusNumber, 00111 UInt32 inNumberFrames, 00112 AudioBufferList * ioData); 00113 00114 static OSStatus OutputProc(void *inRefCon, 00115 AudioUnitRenderActionFlags *ioActionFlags, 00116 const AudioTimeStamp *inTimeStamp, 00117 UInt32 inBusNumber, 00118 UInt32 inNumberFrames, 00119 AudioBufferList * ioData); 00120 00121 void *m_Arg; 00122 00123 WadCallbackFn *appInFn; 00124 WadCallbackFn *appOutFn; 00125 00126 CAStreamBasicDescription m_inFormat; 00127 CAStreamBasicDescription m_outFormat; 00128 00129 int m_NumDevs; 00130 00131 AudioDeviceID *m_audioDevices; 00132 AudioUnit m_inputUnit; 00133 AudioBufferList *m_inputBuffer; 00134 AudioUnit m_outputUnit; 00135 00136 bool m_running; 00137 00138 CFRunLoopRef m_loopRef; 00139 00140 //pthread_mutex_t mutex; 00141 }; 00142 00150 class WadResMacHAL : public WadMacHAL 00151 { 00152 protected: 00153 WadResPort *resPort; 00154 bool openingViaResPort; 00155 bool closingViaResPort; 00156 WadConvPort *convPort; 00157 00158 public: 00159 WadResMacHAL(); 00160 ~WadResMacHAL(); 00161 00162 int Open(WadParam *param, WadCallbackFn *inFn, WadCallbackFn *outFn, void *arg); 00163 void Close(); 00164 }; 00165 00166 #endif //__WadMacHAL_H__
1.7.5.1