3 * Copyright (C) 2011-2013 Team XBMC
6 * This Program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * This Program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with XBMC; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
22 #if defined(TARGET_DARWIN_IOS)
27 #include "ICoreAudioAEHAL.h"
28 #include "CoreAudioAEHAL.h"
29 #include "utils/StdString.h"
31 #include <AudioUnit/AudioUnit.h>
32 #include <AudioUnit/AudioUnitProperties.h>
33 #include <AudioToolbox/AudioToolbox.h>
34 #include <AudioToolbox/AudioServices.h>
35 #include <CoreAudio/CoreAudioTypes.h>
39 #define MAX_CONNECTION_LIMIT 8
40 #define INVALID_BUS -1
42 // Forward declarations
44 class CIOSCoreAudioConverter;
46 typedef std::list<AudioComponentInstance> IOSCoreAudioDeviceList;
48 // There is only one AudioSystemObject instance system-side.
49 // Therefore, all CIOSCoreAudioHardware methods are static
50 class CIOSCoreAudioHardware
53 static AudioComponentInstance FindAudioDevice(std::string deviceName);
54 static AudioComponentInstance GetDefaultOutputDevice();
55 static UInt32 GetOutputDevices(IOSCoreAudioDeviceList* pList);
62 virtual ~CCoreAudioUnit();
64 virtual bool Open(AUGraph audioGraph, AudioComponentDescription desc);
65 virtual bool Open(AUGraph audioGraph, OSType type, OSType subType, OSType manufacturer);
67 virtual bool SetInputSource(ICoreAudioSource* pSource);
68 virtual bool IsInitialized() {return m_Initialized;}
69 virtual bool GetFormat(AudioStreamBasicDescription* pDesc, AudioUnitScope scope, AudioUnitElement bus);
70 virtual bool SetFormat(AudioStreamBasicDescription* pDesc, AudioUnitScope scope, AudioUnitElement bus);
71 virtual bool SetMaxFramesPerSlice(UInt32 maxFrames);
72 virtual void GetFormatDesc(AEAudioFormat format, AudioStreamBasicDescription *streamDesc);
73 virtual float GetLatency();
74 virtual bool SetSampleRate(Float64 sampleRate, AudioUnitScope scope, AudioUnitElement bus);
77 virtual AudioUnit GetUnit (){return m_audioUnit;}
78 virtual AUGraph GetGraph (){return m_audioGraph;}
79 virtual AUNode GetNode (){return m_audioNode;}
80 virtual int GetBus (){return m_busNumber;}
81 virtual void SetBus (int busNumber){m_busNumber = busNumber;}
84 bool RemoveRenderProc();
85 static OSStatus RenderCallback(void *inRefCon,
86 AudioUnitRenderActionFlags *ioActionFlags,
87 const AudioTimeStamp *inTimeStamp,
89 UInt32 inNumberFrames,
90 AudioBufferList *ioData);
91 ICoreAudioSource* m_pSource;
92 AudioUnit m_audioUnit;
96 AURenderCallback m_renderProc;
100 class CAUOutputDevice : public CCoreAudioUnit
104 virtual ~CAUOutputDevice();
105 UInt32 GetBufferFrameSize();
108 Float32 GetCurrentVolume();
109 bool SetCurrentVolume(Float32 vol);
111 bool EnableInputOuput();
114 class CAUMultiChannelMixer : public CAUOutputDevice
117 CAUMultiChannelMixer();
118 virtual ~CAUMultiChannelMixer();
120 UInt32 GetInputBusCount();
121 bool SetInputBusFormat(UInt32 busCount, AudioStreamBasicDescription *pFormat);
122 bool SetInputBusCount(UInt32 busCount);
123 UInt32 GetOutputBusCount();
124 bool SetOutputBusCount(UInt32 busCount);
126 Float32 GetCurrentVolume();
127 bool SetCurrentVolume(Float32 vol);
130 class CCoreAudioGraph
133 AUGraph m_audioGraph;
135 CAUOutputDevice *m_audioUnit;
136 CAUMultiChannelMixer *m_mixerUnit;
137 CAUOutputDevice *m_inputUnit;
139 int m_reservedBusNumber[MAX_CONNECTION_LIMIT];
143 typedef std::list<CAUOutputDevice*> AUUnitList;
144 AUUnitList m_auUnitList;
150 bool Open(ICoreAudioSource *pSource, AEAudioFormat &format, bool allowMixing, float initVolume);
154 bool SetInputSource(ICoreAudioSource* pSource);
155 bool SetCurrentVolume(Float32 vol);
156 CAUOutputDevice *DestroyUnit(CAUOutputDevice *outputUnit);
157 CAUOutputDevice *CreateUnit(AEAudioFormat &format);
159 void ReleaseBus(int busNumber);
160 bool IsBusFree(int busNumber);
161 int GetMixerChannelOffset(int busNumber);
166 class CCoreAudioAEHALIOS : public ICoreAudioAEHAL
169 CCoreAudioGraph *m_audioGraph;
172 AEAudioFormat m_initformat;
175 AEDataFormat m_rawDataFormat;
178 unsigned int m_NumLatencyFrames;
179 unsigned int m_OutputBufferIndex;
182 CCoreAudioAEHALIOS();
183 virtual ~CCoreAudioAEHALIOS();
185 virtual bool InitializePCM(ICoreAudioSource *pSource, AEAudioFormat &format, bool allowMixing);
186 virtual bool InitializePCMEncoded(ICoreAudioSource *pSource, AEAudioFormat &format);
187 virtual bool Initialize(ICoreAudioSource *ae, bool passThrough, AEAudioFormat &format, AEDataFormat rawDataFormat, std::string &device, float initVolume);
188 virtual void Deinitialize();
189 virtual void EnumerateOutputDevices(AEDeviceList &devices, bool passthrough);
190 virtual void SetDirectInput(ICoreAudioSource *pSource, AEAudioFormat &format);
192 virtual bool Start();
193 virtual double GetDelay();
194 virtual void SetVolume(float volume);
195 virtual unsigned int GetBufferIndex();
196 virtual CAUOutputDevice *DestroyUnit(CAUOutputDevice *outputUnit);
197 virtual CAUOutputDevice *CreateUnit(ICoreAudioSource *pSource, AEAudioFormat &format);
198 virtual bool AllowMixing() { return m_allowMixing; }