Remove LOCAL_C abomination.
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
blob20b88780e4dd50e0a677aeadde6a76d546e4b345
1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
4 const int KMaxVolume = 256;
6 static int GetSampleRate(int aRate)
8 switch(aRate)
10 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
11 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
12 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
13 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
14 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
15 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
16 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
17 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
18 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
19 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
20 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
21 default: break;
23 return KErrNotFound;
26 static int GetChannels(int aChannels)
28 switch(aChannels)
30 case 1: return TMdaAudioDataSettings::EChannelsMono;
31 case 2: return TMdaAudioDataSettings::EChannelsStereo;
32 default: break;
34 return KErrNotFound;
37 int CStreamPlayer::ClosestSupportedRate(int aRate)
39 if(aRate > 96000)
40 return 96000;
42 int rate = aRate;
43 while(GetSampleRate(rate) == KErrNotFound)
45 ++rate;
47 return rate;
50 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs)
51 : iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
55 CStreamPlayer::~CStreamPlayer()
57 iState |= EDied;
58 if(iState & EInited)
59 Close();
60 User::After(100000); //wait buffer to be flushed
61 ASSERT(iPtr.Length() == 0);
62 delete iStream;
65 void CStreamPlayer::ConstructL()
67 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
68 iSilence.SetMax();
69 iSilence.FillZ();
72 int CStreamPlayer::OpenStream(int aRate, int aChannels, TUint32 aType)
74 Close();
76 iType = aType;
78 iRate = GetSampleRate(aRate);
79 if(iRate == KErrNotFound)
80 return KErrNotSupported;
82 iChannels = GetChannels(aChannels);
83 if(iChannels == KErrNotFound)
84 return KErrNotSupported;
86 Open();
88 return KErrNone;
91 int CStreamPlayer::MaxVolume() const
93 return KMaxVolume;
96 void CStreamPlayer::SetVolume(int aNew)
98 const int maxi = MaxVolume();
100 if(aNew > maxi)
101 return;
102 if(aNew < 0)
103 return;
105 iVolume = aNew;
107 iState |= EVolumeChange;
110 int CStreamPlayer::Volume() const
112 return iVolume;
115 void CStreamPlayer::Open()
117 TMdaAudioDataSettings audioSettings;
118 audioSettings.Query();
119 audioSettings.iCaps = TMdaAudioDataSettings::ERealTime | TMdaAudioDataSettings::ESampleRateFixed;
120 audioSettings.iSampleRate = iRate;
121 audioSettings.iChannels = iChannels;
122 audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting;
123 audioSettings.iVolume = 0;
125 iState &= ~EStopped;
126 iStream->Open(&audioSettings);
129 void CStreamPlayer::Stop()
131 if(iState & (EStarted | EInited))
133 Close();
134 iState |= EStopped;
138 void CStreamPlayer::Start()
140 if(iPtr.Length() == 0)
142 iState |= EStarted;
143 if(iState & EInited)
145 Request();
147 else if(iState & EStopped)
149 Open();
154 void CStreamPlayer::Close()
156 iState &= ~EInited;
157 iStream->Stop();
158 iState &= ~EStarted;
161 void CStreamPlayer::Request()
163 if(iState & EInited)
165 iPtr.Set(KNullDesC8);
167 if(iState & EVolumeChange)
169 const TReal newVol = iVolume;
170 const TReal newMax = MaxVolume();
171 const int maxVol = iStream->MaxVolume();
172 const TReal max = static_cast<TReal>(maxVol);
173 const TReal newvolume = (newVol * max) / newMax;
174 const int vol = static_cast<TReal>(newvolume);
175 iStream->SetVolume(vol);
176 iState &= ~EVolumeChange;
179 if(iState & EStarted)
181 iPtr.Set(iProvider.Data());
183 if(iPtr.Length() == 0)
185 iPtr.Set(iSilence);
187 TRAPD(err, iStream->WriteL(iPtr));
188 if(err != KErrNone)
190 iObs.Complete(MStreamObs::EWrite, err);
196 void CStreamPlayer::SetCapsL()
198 iStream->SetDataTypeL(iType);
199 iStream->SetAudioPropertiesL(iRate, iChannels);
202 void CStreamPlayer::MaoscOpenComplete(int aError)
204 if(aError == KErrNone)
206 TRAPD(err, SetCapsL());
207 if(err == KErrNone)
209 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
210 iState |= EInited;
212 SetVolume(Volume());
214 if(iState & EStarted)
216 Request();
219 aError = err;
221 if(!(iState & EDied))
222 iObs.Complete(MStreamObs::EInit, aError);
225 void CStreamPlayer::MaoscBufferCopied(int aError, const TDesC8& /*aBuffer*/)
227 iPtr.Set(KNullDesC8);
228 if(aError == KErrNone)
230 if(iState & EInited)
231 Request();
232 else
233 iStream->Stop();
235 else if(!(iState & EDied))
236 iObs.Complete(MStreamObs::EPlay, aError);
239 void CStreamPlayer::MaoscPlayComplete(int aError)
241 iPtr.Set(KNullDesC8);
242 iState &= ~EStarted;
243 if(!(iState & EDied))
244 iObs.Complete(MStreamObs::EClose, aError);
247 TBool CStreamPlayer::Playing() const
249 return (iState & EInited) && (iState & EStarted);
252 TBool CStreamPlayer::Closed() const
254 return !(iState & EInited) && !(iState & EDied);