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