Merge pull request #1797 from Montellese/delete_xsps
[vuplus_xbmc] / xbmc / cores / AudioEngine / Engines / CoreAudio / CoreAudioAEStream.h
1 #pragma once
2 /*
3  *      Copyright (C) 2011-2012 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 #include <samplerate.h>
23 #include <list>
24
25 #include "CoreAudioRingBuffer.h"
26 #include "ICoreAudioSource.h"
27 #include "cores/AudioEngine/AEAudioFormat.h"
28 #include "cores/AudioEngine/Interfaces/AEStream.h"
29 #include "cores/AudioEngine/Utils/AEConvert.h"
30 #include "cores/AudioEngine/Utils/AERemap.h"
31
32 #if defined(TARGET_DARWIN_IOS)
33 # include "CoreAudioAEHALIOS.h"
34 #else
35 # include "CoreAudioAEHALOSX.h"
36 #endif
37
38 class CoreAudioRingBuffer;
39
40 class CCoreAudioAEStream : public IAEStream, public ICoreAudioSource
41 {
42 protected:
43   friend class CCoreAudioAE;
44   CCoreAudioAEStream(enum AEDataFormat format, unsigned int sampleRate, unsigned int encodedSamplerate, CAEChannelInfo channelLayout, unsigned int options);
45   virtual ~CCoreAudioAEStream();
46
47   CAUOutputDevice    *m_outputUnit;
48
49 public:
50   void ReinitConverter();
51   void CloseConverter();
52   void OpenConverter();
53
54   void Initialize();
55   void InitializeRemap();
56   virtual void Destroy();
57
58   virtual const unsigned int GetFrameSize() const;
59   virtual unsigned int GetSpace();
60   virtual unsigned int AddData(void *data, unsigned int size);
61   unsigned int GetFrames(uint8_t *buffer, unsigned int size);
62   virtual double GetDelay();
63   virtual bool   IsBuffering();
64   virtual double GetCacheTime();
65   virtual double GetCacheTotal();
66
67   bool IsPaused();
68   virtual bool IsDraining();
69   virtual bool IsDrained();
70   bool IsDestroyed();
71   bool IsValid();
72
73   virtual void Pause();
74   virtual void Resume();
75   virtual void Drain();
76   virtual void Flush();
77
78   virtual float GetVolume();
79   virtual float GetReplayGain();
80   virtual void  SetVolume(float volume);
81   virtual void  SetReplayGain(float factor);
82
83   virtual const unsigned int      GetChannelCount() const;
84   virtual const unsigned int      GetSampleRate() const;
85   virtual const unsigned int      GetEncodedSampleRate() const;
86   virtual const enum AEDataFormat GetDataFormat() const;
87   virtual const bool              IsRaw() const;
88
89   /* for dynamic sample rate changes (smoothvideo) */
90   virtual double GetResampleRatio();
91   virtual bool   SetResampleRatio(double ratio);
92
93   virtual void RegisterAudioCallback(IAudioCallback* pCallback);
94   virtual void UnRegisterAudioCallback();
95
96   virtual void FadeVolume(float from, float to, unsigned int time);
97   virtual bool IsFading();
98   virtual void RegisterSlave(IAEStream *stream);
99
100   OSStatus Render(AudioUnitRenderActionFlags* actionFlags, 
101     const AudioTimeStamp* pTimeStamp, 
102     UInt32 busNumber, 
103     UInt32 frameCount, 
104     AudioBufferList* pBufList);
105
106 private:
107   void InternalFlush();
108
109   OSStatus OnRender(AudioUnitRenderActionFlags *ioActionFlags, 
110     const AudioTimeStamp *inTimeStamp, 
111     UInt32 inBusNumber, 
112     UInt32 inNumberFrames, 
113     AudioBufferList *ioData);
114
115   AEDataFormat            m_rawDataFormat;
116
117   AEAudioFormat           m_OutputFormat;
118   unsigned int            m_chLayoutCountOutput;
119   AEAudioFormat           m_StreamFormat;
120   unsigned int            m_chLayoutCountStream;
121   unsigned int            m_StreamBytesPerSample;
122   unsigned int            m_OutputBytesPerSample;
123
124   //bool                    m_forceResample; /* true if we are to force resample even when the rates match */
125   //bool                    m_resample;      /* true if the audio needs to be resampled  */
126   bool                    m_convert;       /* true if the bitspersample needs converting */
127   bool                    m_valid;         /* true if the stream is valid */
128   bool                    m_delete;        /* true if CCoreAudioAE is to free this object */
129   CAERemap                m_remap;         /* the remapper */
130   float                   m_volume;        /* the volume level */
131   float                   m_rgain;         /* replay gain level */
132   IAEStream               *m_slave;        /* slave aestream */
133
134   CAEConvert::AEConvertToFn m_convertFn;
135
136   CoreAudioRingBuffer    *m_Buffer;
137   float                  *m_convertBuffer;      /* buffer for converted data */
138   int                     m_convertBufferSize;
139   //float                  *m_resampleBuffer;     /* buffer for resample data */
140   //int                     m_resampleBufferSize;
141   uint8_t                *m_upmixBuffer;        /* buffer for remap data */
142   int                     m_upmixBufferSize;
143   uint8_t                *m_remapBuffer;        /* buffer for remap data */
144   int                     m_remapBufferSize;
145   uint8_t                *m_vizRemapBuffer;     /* buffer for remap data */
146   int                     m_vizRemapBufferSize;
147
148   SRC_STATE              *m_ssrc;
149   SRC_DATA                m_ssrcData;
150   bool                    m_paused;
151   bool                    m_draining;
152   unsigned int            m_AvgBytesPerSec;
153
154   /* vizualization internals */
155   CAERemap                m_vizRemap;
156   IAudioCallback         *m_audioCallback;
157
158   /* fade values */
159   bool              m_fadeRunning;
160   bool              m_fadeDirUp;
161   float             m_fadeStep;
162   float             m_fadeTarget;
163   unsigned int      m_fadeTime;
164   bool              m_isRaw;
165   unsigned int      m_frameSize;
166   bool              m_doRemap;
167   void              Upmix(void *input, unsigned int channelsInput, void *output, unsigned int channelsOutput, unsigned int frames, AEDataFormat dataFormat);
168   bool              m_firstInput;
169 };
170