1 #include "streamplayer.h"
2 #include<mda/common/audio.h>
6 const TInt KMaxVolume(256);
8 LOCAL_C TInt GetSampleRate(TInt aRate)
12 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz;
13 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz;
14 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz;
15 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz;
16 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz;
17 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz;
18 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz;
19 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz;
20 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz;
21 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz;
22 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz;
27 LOCAL_C TInt GetChannels(TInt aChannels)
31 case 1: return TMdaAudioDataSettings::EChannelsMono;
32 case 2: return TMdaAudioDataSettings::EChannelsStereo;
37 TInt CStreamPlayer::ClosestSupportedRate(TInt aRate)
42 while(GetSampleRate(rate) == KErrNotFound)
49 CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) :
50 iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume)
54 CStreamPlayer::~CStreamPlayer()
59 User::After(100000); //wait buffer to be flushed
60 ASSERT(iPtr.Length() == 0);
65 void CStreamPlayer::ConstructL()
67 iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax);
73 TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType)
79 iRate = GetSampleRate(aRate);
80 if(iRate == KErrNotFound)
81 return KErrNotSupported;
83 iChannels = GetChannels(aChannels);
84 if(iChannels == KErrNotFound)
85 return KErrNotSupported;
93 TInt CStreamPlayer::MaxVolume() const
98 void CStreamPlayer::SetVolume(TInt aNew)
101 const TInt maxi = MaxVolume();
109 iState |= EVolumeChange;
112 TInt CStreamPlayer::Volume() const
117 void CStreamPlayer::Open()
119 TMdaAudioDataSettings audioSettings;
120 audioSettings.Query();
121 audioSettings.iCaps = TMdaAudioDataSettings::ERealTime |
122 TMdaAudioDataSettings::ESampleRateFixed;
123 audioSettings.iSampleRate = iRate;
124 audioSettings.iChannels = iChannels;
125 audioSettings.iFlags = TMdaAudioDataSettings::ENoNetworkRouting;
126 audioSettings.iVolume = 0;
129 iStream->Open(&audioSettings);
132 void CStreamPlayer::Stop()
134 if(iState & (EStarted | EInited))
141 void CStreamPlayer::Start()
143 if(iPtr.Length() == 0)
150 else if(iState & EStopped)
157 void CStreamPlayer::Close()
164 void CStreamPlayer::Request()
168 iPtr.Set(KNullDesC8);
170 if(iState & EVolumeChange)
172 const TReal newVol = iVolume;
173 const TReal newMax = MaxVolume();
174 const TInt maxVol = iStream->MaxVolume();
175 const TReal max = static_cast<TReal>(maxVol);
176 const TReal newvolume = (newVol * max) / newMax;
177 const TInt vol = static_cast<TReal>(newvolume);
178 iStream->SetVolume(vol);
179 iState &= ~EVolumeChange;
182 if(iState & EStarted)
184 iPtr.Set(iProvider.Data());
186 if(iPtr.Length() == 0)
190 TRAPD(err, iStream->WriteL(iPtr));
193 iObs.Complete(MStreamObs::EWrite, err);
197 iProvider.Written(iPtr.Length());
203 void CStreamPlayer::SetCapsL()
205 iStream->SetDataTypeL(iType);
206 iStream->SetAudioPropertiesL(iRate, iChannels);
209 void CStreamPlayer::MaoscOpenComplete(TInt aError)
211 if(aError == KErrNone)
213 TRAPD(err, SetCapsL());
216 iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime);
222 if(iState & EStarted)
230 if(!(iState & EDied))
231 iObs.Complete(MStreamObs::EInit, aError);
234 void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/)
236 iPtr.Set(KNullDesC8);
237 if(aError == KErrNone)
244 else if(!(iState & EDied))
245 iObs.Complete(MStreamObs::EPlay, aError);
248 void CStreamPlayer::MaoscPlayComplete(TInt aError)
250 iPtr.Set(KNullDesC8);
252 if(!(iState & EDied))
253 iObs.Complete(MStreamObs::EClose, aError);
256 TBool CStreamPlayer::Playing() const
258 return (iState & EInited) && (iState & EStarted);
261 TBool CStreamPlayer::Closed() const
263 return !(iState & EInited) && !(iState & EDied);
267 void CStreamPlayer::Request()
270 TRequestStatus* s = &iStatus;
271 User::RequestComplete(s, KErrNone);