Wave Arts VQE  1.00
Voice Quality Enhancement
WadMacHAL.h
Go to the documentation of this file.
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__
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines