Big cleanup part 1.
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
bloba7a30ca5c088c92af245e7ba70ae53c819c7362e
1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
4 const TInt KMaxVolume(256);
6 LOCAL_C TInt GetSampleRate(TInt 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 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
20 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
22 return KErrNotFound;
25 LOCAL_C TInt GetChannels(TInt aChannels)
27 switch(aChannels)
29 case 1: return TMdaAudioDataSettings::EChannelsMono;
30 case 2: return TMdaAudioDataSettings::EChannelsStereo;
32 return KErrNotFound;
35 TInt CStreamPlayer::ClosestSupportedRate(TInt aRate)
37 if(aRate > 96000)
38 return 96000;
39 TInt rate = aRate;
40 while(GetSampleRate(rate) == KErrNotFound)
42 ++rate;
44 return rate;
47 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) :
48 iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
52 CStreamPlayer::~CStreamPlayer()
54 iState |= EDied;
55 if(iState & EInited)
56 Close();
57 User::After(100000); //wait buffer to be flushed
58 ASSERT(iPtr.Length() == 0);
59 delete iStream;
63 void CStreamPlayer::ConstructL()
65 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
66 iSilence.SetMax();
67 iSilence.FillZ();
71 TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType)
73 Close();
75 iType = aType;
77 iRate = GetSampleRate(aRate);
78 if(iRate == KErrNotFound)
79 return KErrNotSupported;
81 iChannels = GetChannels(aChannels);
82 if(iChannels == KErrNotFound)
83 return KErrNotSupported;
85 Open();
87 return KErrNone;
91 TInt CStreamPlayer::MaxVolume() const
93 return KMaxVolume;
96 void CStreamPlayer::SetVolume(TInt aNew)
99 const TInt maxi = MaxVolume();
100 if(aNew > maxi)
101 return;
102 if(aNew < 0)
103 return;
105 iVolume = aNew;
107 iState |= EVolumeChange;
110 TInt CStreamPlayer::Volume() const
112 return iVolume;
115 void CStreamPlayer::Open()
117 TMdaAudioDataSettings audioSettings;
118 audioSettings.Query();
119 audioSettings.iCaps = TMdaAudioDataSettings::ERealTime |
120 TMdaAudioDataSettings::ESampleRateFixed;
121 audioSettings.iSampleRate = iRate;
122 audioSettings.iChannels = iChannels;
123 audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting;
124 audioSettings.iVolume = 0;
126 iState &= ~EStopped;
127 iStream->Open(&audioSettings);
130 void CStreamPlayer::Stop()
132 if(iState & (EStarted | EInited))
134 Close();
135 iState |= EStopped;
139 void CStreamPlayer::Start()
141 if(iPtr.Length() == 0)
143 iState |= EStarted;
144 if(iState & EInited)
146 Request();
148 else if(iState & EStopped)
150 Open();
155 void CStreamPlayer::Close()
157 iState &= ~EInited;
158 iStream->Stop();
159 iState &= ~EStarted;
162 void CStreamPlayer::Request()
164 if(iState & EInited)
166 iPtr.Set(KNullDesC8);
168 if(iState & EVolumeChange)
170 const TReal newVol = iVolume;
171 const TReal newMax = MaxVolume();
172 const TInt maxVol = iStream->MaxVolume();
173 const TReal max = static_cast<TReal>(maxVol);
174 const TReal newvolume = (newVol * max) / newMax;
175 const TInt vol = static_cast<TReal>(newvolume);
176 iStream->SetVolume(vol);
177 iState &= ~EVolumeChange;
180 if(iState & EStarted)
182 iPtr.Set(iProvider.Data());
184 if(iPtr.Length() == 0)
186 iPtr.Set(iSilence);
188 TRAPD(err, iStream->WriteL(iPtr));
189 if(err != KErrNone)
191 iObs.Complete(MStreamObs::EWrite, err);
197 void CStreamPlayer::SetCapsL()
199 iStream->SetDataTypeL(iType);
200 iStream->SetAudioPropertiesL(iRate, iChannels);
203 void CStreamPlayer::MaoscOpenComplete(TInt aError)
205 if(aError == KErrNone)
207 TRAPD(err, SetCapsL());
208 if(err == KErrNone)
210 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
211 iState |= EInited;
214 SetVolume(Volume());
216 if(iState & EStarted)
218 Request();
222 aError = err;
224 if(!(iState & EDied))
225 iObs.Complete(MStreamObs::EInit, aError);
228 void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
230 iPtr.Set(KNullDesC8);
231 if(aError == KErrNone)
233 if(iState & EInited)
234 Request();
235 else
236 iStream->Stop();
238 else if(!(iState & EDied))
239 iObs.Complete(MStreamObs::EPlay, aError);
242 void CStreamPlayer::MaoscPlayComplete(TInt aError)
244 iPtr.Set(KNullDesC8);
245 iState &= ~EStarted;
246 if(!(iState & EDied))
247 iObs.Complete(MStreamObs::EClose, aError);
250 TBool CStreamPlayer::Playing() const
252 return (iState & EInited) && (iState & EStarted);
255 TBool CStreamPlayer::Closed() const
257 return !(iState & EInited) && !(iState & EDied);