1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
4 const TInt
KMaxVolume(256);
6 LOCAL_C TInt
GetSampleRate(TInt 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
;
25 LOCAL_C TInt
GetChannels(TInt aChannels
)
29 case 1: return TMdaAudioDataSettings::EChannelsMono
;
30 case 2: return TMdaAudioDataSettings::EChannelsStereo
;
35 TInt
CStreamPlayer::ClosestSupportedRate(TInt aRate
)
40 while(GetSampleRate(rate
) == KErrNotFound
)
47 CStreamPlayer::CStreamPlayer(MStreamProvider
& aProvider
, MStreamObs
& aObs
) :
48 iProvider(aProvider
), iObs(aObs
), iVolume(KMaxVolume
)
52 CStreamPlayer::~CStreamPlayer()
57 User::After(100000); //wait buffer to be flushed
58 ASSERT(iPtr
.Length() == 0);
63 void CStreamPlayer::ConstructL()
65 iStream
= CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax
);
71 TInt
CStreamPlayer::OpenStream(TInt aRate
, TInt aChannels
, TUint32 aType
)
77 iRate
= GetSampleRate(aRate
);
78 if(iRate
== KErrNotFound
)
79 return KErrNotSupported
;
81 iChannels
= GetChannels(aChannels
);
82 if(iChannels
== KErrNotFound
)
83 return KErrNotSupported
;
91 TInt
CStreamPlayer::MaxVolume() const
96 void CStreamPlayer::SetVolume(TInt aNew
)
99 const TInt maxi
= MaxVolume();
107 iState
|= EVolumeChange
;
110 TInt
CStreamPlayer::Volume() const
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;
127 iStream
->Open(&audioSettings
);
130 void CStreamPlayer::Stop()
132 if(iState
& (EStarted
| EInited
))
139 void CStreamPlayer::Start()
141 if(iPtr
.Length() == 0)
148 else if(iState
& EStopped
)
155 void CStreamPlayer::Close()
162 void CStreamPlayer::Request()
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)
188 TRAPD(err
, iStream
->WriteL(iPtr
));
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());
210 iStream
->SetPriority(EPriorityNormal
, EMdaPriorityPreferenceTime
);
216 if(iState
& EStarted
)
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
)
238 else if(!(iState
& EDied
))
239 iObs
.Complete(MStreamObs::EPlay
, aError
);
242 void CStreamPlayer::MaoscPlayComplete(TInt aError
)
244 iPtr
.Set(KNullDesC8
);
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
);