Remove unnecessary check in CStreamPlayer::Request().
[SDL.s60v3.git] / src / audio / symbian / streamplayer.cpp
blob58986ee2b4f3100fc6f5c3ce1078193610961fee
1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
4 static int GetSampleRate(int aRate)
6 switch(aRate)
8 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
9 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
10 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
11 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
12 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
13 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
14 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
15 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
16 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
17 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
18 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
19 default: break;
21 return KErrNotFound;
24 static int GetChannels(int aChannels)
26 switch(aChannels)
28 case 1: return TMdaAudioDataSettings::EChannelsMono;
29 case 2: return TMdaAudioDataSettings::EChannelsStereo;
30 default: break;
32 return KErrNotFound;
35 int CStreamPlayer::ClosestSupportedRate(int aRate)
37 if(aRate > 96000)
38 return 96000;
40 int rate = aRate;
41 while(GetSampleRate(rate) == KErrNotFound)
43 ++rate;
45 return rate;
48 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs)
49 : iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
53 CStreamPlayer::~CStreamPlayer()
55 iState |= EDied;
56 if(iState & EInited)
57 Close();
58 User::After(100000); //wait buffer to be flushed
59 ASSERT(iPtr.Length() == 0);
60 delete iStream;
63 void CStreamPlayer::ConstructL()
65 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
66 iSilence.SetMax();
67 iSilence.FillZ();
70 int CStreamPlayer::OpenStream(int aRate, int aChannels, TUint32 aType)
72 Close();
74 iType = aType;
76 iRate = GetSampleRate(aRate);
77 if(iRate == KErrNotFound)
78 return KErrNotSupported;
80 iChannels = GetChannels(aChannels);
81 if(iChannels == KErrNotFound)
82 return KErrNotSupported;
84 Open();
86 return KErrNone;
89 void CStreamPlayer::SetVolume(int aNew)
91 if(aNew > MaxVolume())
92 return;
93 if(aNew < 0)
94 return;
96 iVolume = aNew;
98 iState |= EVolumeChange;
101 void CStreamPlayer::Open()
103 TMdaAudioDataSettings audioSettings;
104 audioSettings.Query();
105 audioSettings.iSampleRate = iRate;
106 audioSettings.iChannels = iChannels;
107 audioSettings.iVolume = 0;
109 iState &= ~EStopped;
110 iStream->Open(&audioSettings);
113 void CStreamPlayer::Stop()
115 if(iState & (EStarted | EInited))
117 Close();
118 iState |= EStopped;
122 void CStreamPlayer::Start()
124 if(iPtr.Length() == 0)
126 iState |= EStarted;
127 if(iState & EInited)
129 Request();
131 else if(iState & EStopped)
133 Open();
138 void CStreamPlayer::Close()
140 iState &= ~EInited;
141 iStream->Stop();
142 iState &= ~EStarted;
145 void CStreamPlayer::Request()
147 iPtr.Set(KNullDesC8);
149 if(iState & EVolumeChange)
151 const TReal newVol = iVolume;
152 const TReal newMax = MaxVolume();
153 const int maxVol = iStream->MaxVolume();
154 const TReal max = static_cast<TReal>(maxVol);
155 const TReal newvolume = (newVol * max) / newMax;
156 const int vol = static_cast<TReal>(newvolume);
157 iStream->SetVolume(vol);
158 iState &= ~EVolumeChange;
161 if(iState & EStarted)
163 iPtr.Set(iProvider.Data());
165 if(iPtr.Length() == 0)
167 iPtr.Set(iSilence);
169 TRAPD(err, iStream->WriteL(iPtr));
170 if(err != KErrNone)
172 iObs.Complete(MStreamObs::EWrite, err);
177 void CStreamPlayer::SetCapsL()
179 iStream->SetDataTypeL(iType);
180 iStream->SetAudioPropertiesL(iRate, iChannels);
183 void CStreamPlayer::MaoscOpenComplete(int aError)
185 if(aError == KErrNone)
187 TRAPD(err, SetCapsL());
188 if(err == KErrNone)
190 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
191 iState |= EInited;
193 SetVolume(Volume());
195 if(iState & EStarted)
197 Request();
200 aError = err;
202 if(!(iState & EDied))
203 iObs.Complete(MStreamObs::EInit, aError);
206 void CStreamPlayer::MaoscBufferCopied(int aError, const TDesC8& /*aBuffer*/)
208 iPtr.Set(KNullDesC8);
209 if(aError == KErrNone)
211 if(iState & EInited)
212 Request();
213 else
214 iStream->Stop();
216 else if(!(iState & EDied))
217 iObs.Complete(MStreamObs::EPlay, aError);
220 void CStreamPlayer::MaoscPlayComplete(int aError)
222 iPtr.Set(KNullDesC8);
223 iState &= ~EStarted;
224 if(!(iState & EDied))
225 iObs.Complete(MStreamObs::EClose, aError);