3 * Copyright (C) 2011-2012 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 #include <samplerate.h>
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"
33 #if defined(TARGET_DARWIN_IOS)
34 # include "CoreAudioAEHALIOS.h"
36 # include "CoreAudioAEHALOSX.h"
39 class CoreAudioRingBuffer;
41 class CCoreAudioAEStream : public IAEStream, public ICoreAudioSource
44 friend class CCoreAudioAE;
45 CCoreAudioAEStream(enum AEDataFormat format, unsigned int sampleRate, unsigned int encodedSamplerate, CAEChannelInfo channelLayout, unsigned int options);
46 virtual ~CCoreAudioAEStream();
48 CAUOutputDevice *m_outputUnit;
51 void ReinitConverter();
52 void CloseConverter();
56 void InitializeRemap();
57 virtual void Destroy();
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();
69 virtual bool IsDraining();
70 virtual bool IsDrained();
75 virtual void Resume();
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); }
86 virtual float RunLimiter(float* frame, int channels) { return m_limiter.Run(frame, channels); }
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;
94 /* for dynamic sample rate changes (smoothvideo) */
95 virtual double GetResampleRatio();
96 virtual bool SetResampleRatio(double ratio);
98 virtual void RegisterAudioCallback(IAudioCallback* pCallback);
99 virtual void UnRegisterAudioCallback();
101 virtual void FadeVolume(float from, float to, unsigned int time);
102 virtual bool IsFading();
103 virtual void RegisterSlave(IAEStream *stream);
105 OSStatus Render(AudioUnitRenderActionFlags* actionFlags,
106 const AudioTimeStamp* pTimeStamp,
109 AudioBufferList* pBufList);
112 void InternalFlush();
114 OSStatus OnRender(AudioUnitRenderActionFlags *ioActionFlags,
115 const AudioTimeStamp *inTimeStamp,
117 UInt32 inNumberFrames,
118 AudioBufferList *ioData);
120 AEDataFormat m_rawDataFormat;
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;
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 */
140 CAEConvert::AEConvertToFn m_convertFn;
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;
158 unsigned int m_AvgBytesPerSec;
160 /* vizualization internals */
162 IAudioCallback *m_audioCallback;
169 unsigned int m_fadeTime;
171 unsigned int m_frameSize;
173 void Upmix(void *input, unsigned int channelsInput, void *output, unsigned int channelsOutput, unsigned int frames, AEDataFormat dataFormat);