changed: Improve (fallback) logic for subtitle downloading
[vuplus_xbmc] / xbmc / cores / AudioEngine / Engines / CoreAudio / CoreAudioAEHALIOS.h
1 #pragma once
2 /*
3  *      Copyright (C) 2011-2013 Team XBMC
4  *      http://xbmc.org
5  *
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)
9  *  any later version.
10  *
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.
15  *
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/>.
19  *
20  */
21
22 #if defined(TARGET_DARWIN_IOS)
23
24 #include <list>
25 #include <vector>
26
27 #include "ICoreAudioAEHAL.h"
28 #include "CoreAudioAEHAL.h"
29 #include "utils/StdString.h"
30
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>
36
37 #define kOutputBus 0
38 #define kInputBus 1
39 #define MAX_CONNECTION_LIMIT  8
40 #define INVALID_BUS -1
41
42 // Forward declarations
43 class CCoreAudioAE;
44 class CIOSCoreAudioConverter;
45
46 typedef std::list<AudioComponentInstance> IOSCoreAudioDeviceList;
47
48 // There is only one AudioSystemObject instance system-side.
49 // Therefore, all CIOSCoreAudioHardware methods are static
50 class CIOSCoreAudioHardware
51 {
52 public:
53   static AudioComponentInstance FindAudioDevice(std::string deviceName);
54   static AudioComponentInstance GetDefaultOutputDevice();
55   static UInt32 GetOutputDevices(IOSCoreAudioDeviceList* pList);
56 };
57
58 class CCoreAudioUnit
59 {
60 public:
61   CCoreAudioUnit();
62   virtual ~CCoreAudioUnit();
63
64   virtual bool Open(AUGraph audioGraph, AudioComponentDescription desc);
65   virtual bool Open(AUGraph audioGraph, OSType type, OSType subType, OSType manufacturer);
66   virtual void Close();
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);
75   virtual bool Stop();
76   virtual bool Start();
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;}
82 protected:
83   bool SetRenderProc();
84   bool RemoveRenderProc();
85   static OSStatus RenderCallback(void *inRefCon,
86                                  AudioUnitRenderActionFlags *ioActionFlags,
87                                  const AudioTimeStamp *inTimeStamp,
88                                  UInt32 inBusNumber,
89                                  UInt32 inNumberFrames,
90                                  AudioBufferList *ioData);
91   ICoreAudioSource*   m_pSource;
92   AudioUnit           m_audioUnit;
93   AUNode              m_audioNode;
94   AUGraph             m_audioGraph;
95   bool                m_Initialized;
96   AURenderCallback    m_renderProc;
97   int                 m_busNumber;
98 };
99
100 class CAUOutputDevice : public CCoreAudioUnit
101 {
102 public:
103   CAUOutputDevice();
104   virtual ~CAUOutputDevice();
105   UInt32 GetBufferFrameSize();
106
107   /*
108   Float32 GetCurrentVolume();
109   bool SetCurrentVolume(Float32 vol);
110   */
111   bool EnableInputOuput();
112 };
113
114 class CAUMultiChannelMixer : public CAUOutputDevice
115 {
116 public:
117   CAUMultiChannelMixer();
118   virtual ~CAUMultiChannelMixer();
119
120   UInt32 GetInputBusCount();
121   bool SetInputBusFormat(UInt32 busCount, AudioStreamBasicDescription *pFormat);
122   bool SetInputBusCount(UInt32 busCount);
123   UInt32 GetOutputBusCount();
124   bool SetOutputBusCount(UInt32 busCount);
125
126   Float32 GetCurrentVolume();
127   bool SetCurrentVolume(Float32 vol);
128 };
129
130 class CCoreAudioGraph
131 {
132 private:
133   AUGraph           m_audioGraph;
134
135   CAUOutputDevice  *m_audioUnit;
136   CAUMultiChannelMixer   *m_mixerUnit;
137   CAUOutputDevice  *m_inputUnit;
138
139   int m_reservedBusNumber[MAX_CONNECTION_LIMIT];
140   bool              m_initialized;
141   bool              m_allowMixing;
142
143   typedef std::list<CAUOutputDevice*> AUUnitList;
144   AUUnitList        m_auUnitList;
145
146 public:
147   CCoreAudioGraph();
148   ~CCoreAudioGraph();
149
150   bool Open(ICoreAudioSource *pSource, AEAudioFormat &format, bool allowMixing, float initVolume);
151   bool Close();
152   bool Start();
153   bool Stop();
154   bool SetInputSource(ICoreAudioSource* pSource);
155   bool SetCurrentVolume(Float32 vol);
156   CAUOutputDevice *DestroyUnit(CAUOutputDevice *outputUnit);
157   CAUOutputDevice *CreateUnit(AEAudioFormat &format);
158   int GetFreeBus();
159   void ReleaseBus(int busNumber);
160   bool IsBusFree(int busNumber);
161   int GetMixerChannelOffset(int busNumber);
162   void ShowGraph();
163   float GetLatency();
164 };
165
166 class CCoreAudioAEHALIOS : public ICoreAudioAEHAL
167 {
168 protected:
169   CCoreAudioGraph  *m_audioGraph;
170   bool              m_Initialized;
171   bool              m_Passthrough;
172   AEAudioFormat     m_initformat;
173   bool              m_allowMixing;
174   bool              m_encoded;
175   AEDataFormat      m_rawDataFormat;
176   float             m_initVolume;
177 public:
178   unsigned int      m_NumLatencyFrames;
179   unsigned int      m_OutputBufferIndex;
180   CCoreAudioAE     *m_ae;
181
182   CCoreAudioAEHALIOS();
183   virtual ~CCoreAudioAEHALIOS();
184
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);
191   virtual void   Stop();
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; }
199 };
200
201 #endif