1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
4 static int GetSampleRate(int 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
;
24 static int GetChannels(int aChannels
)
28 case 1: return TMdaAudioDataSettings::EChannelsMono
;
29 case 2: return TMdaAudioDataSettings::EChannelsStereo
;
35 int CStreamPlayer::ClosestSupportedRate(int aRate
)
41 while(GetSampleRate(rate
) == KErrNotFound
)
48 CStreamPlayer::CStreamPlayer(MStreamProvider
& aProvider
, MStreamObs
& aObs
)
49 : iProvider(aProvider
), iObs(aObs
), iVolume(KMaxVolume
)
53 CStreamPlayer::~CStreamPlayer()
58 User::After(100000); //wait buffer to be flushed
59 ASSERT(iPtr
.Length() == 0);
63 void CStreamPlayer::ConstructL()
65 iStream
= CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax
);
70 int CStreamPlayer::OpenStream(int aRate
, int aChannels
, TUint32 aType
)
76 iRate
= GetSampleRate(aRate
);
77 if(iRate
== KErrNotFound
)
78 return KErrNotSupported
;
80 iChannels
= GetChannels(aChannels
);
81 if(iChannels
== KErrNotFound
)
82 return KErrNotSupported
;
89 void CStreamPlayer::SetVolume(int aNew
)
91 if(aNew
> MaxVolume())
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;
110 iStream
->Open(&audioSettings
);
113 void CStreamPlayer::Stop()
115 if(iState
& (EStarted
| EInited
))
122 void CStreamPlayer::Start()
124 if(iPtr
.Length() == 0)
131 else if(iState
& EStopped
)
138 void CStreamPlayer::Close()
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)
169 TRAPD(err
, iStream
->WriteL(iPtr
));
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());
190 iStream
->SetPriority(EPriorityNormal
, EMdaPriorityPreferenceTime
);
195 if(iState
& EStarted
)
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
)
216 else if(!(iState
& EDied
))
217 iObs
.Complete(MStreamObs::EPlay
, aError
);
220 void CStreamPlayer::MaoscPlayComplete(int aError
)
222 iPtr
.Set(KNullDesC8
);
224 if(!(iState
& EDied
))
225 iObs
.Complete(MStreamObs::EClose
, aError
);