1 #include "streamplayer.h"
2 #include <mda/common/audio.h>
5 static int GetSampleRate(int aRate
)
9 case 8000: return TMdaAudioDataSettings::ESampleRate8000Hz
;
10 case 11025: return TMdaAudioDataSettings::ESampleRate11025Hz
;
11 case 12000: return TMdaAudioDataSettings::ESampleRate12000Hz
;
12 case 16000: return TMdaAudioDataSettings::ESampleRate16000Hz
;
13 case 22050: return TMdaAudioDataSettings::ESampleRate22050Hz
;
14 case 24000: return TMdaAudioDataSettings::ESampleRate24000Hz
;
15 case 32000: return TMdaAudioDataSettings::ESampleRate32000Hz
;
16 case 44100: return TMdaAudioDataSettings::ESampleRate44100Hz
;
17 case 48000: return TMdaAudioDataSettings::ESampleRate48000Hz
;
18 case 64000: return TMdaAudioDataSettings::ESampleRate64000Hz
;
19 case 96000: return TMdaAudioDataSettings::ESampleRate96000Hz
;
25 static int GetChannels(int aChannels
)
29 case 1: return TMdaAudioDataSettings::EChannelsMono
;
30 case 2: return TMdaAudioDataSettings::EChannelsStereo
;
36 int CStreamPlayer::ClosestSupportedRate(int aRate
)
42 while(GetSampleRate(rate
) == KErrNotFound
)
49 CStreamPlayer::CStreamPlayer(MStreamProvider
& aProvider
, MStreamObs
& aObs
)
50 : iProvider(aProvider
)
54 iStream
= CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax
);
57 CStreamPlayer::~CStreamPlayer()
65 int CStreamPlayer::OpenStream(int aRate
, int aChannels
, TUint32 aType
)
71 iRate
= GetSampleRate(aRate
);
72 if(iRate
== KErrNotFound
)
73 return KErrNotSupported
;
75 iChannels
= GetChannels(aChannels
);
76 if(iChannels
== KErrNotFound
)
77 return KErrNotSupported
;
84 void CStreamPlayer::SetVolume(int aNew
)
86 if(aNew
< 0 || aNew
> KMaxVolume
)
90 iState
|= EVolumeChange
;
93 void CStreamPlayer::Open()
95 TMdaAudioDataSettings audioSettings
;
96 audioSettings
.Query();
97 audioSettings
.iSampleRate
= iRate
;
98 audioSettings
.iChannels
= iChannels
;
99 audioSettings
.iVolume
= 0;
102 iStream
->Open(&audioSettings
);
105 void CStreamPlayer::Stop()
107 if(iState
& (EStarted
| EInited
))
114 void CStreamPlayer::Start()
121 else if(iState
& EStopped
)
127 void CStreamPlayer::Close()
134 void CStreamPlayer::Request()
136 if(iState
& EVolumeChange
)
138 iStream
->SetVolume((iVolume
* iStream
->MaxVolume()) / KMaxVolume
);
139 iState
&= ~EVolumeChange
;
142 if(iState
& EStarted
)
144 iPtr
.Set(iProvider
.Data());
146 if(iPtr
.Length() != 0)
148 TRAPD(err
, iStream
->WriteL(iPtr
));
151 iObs
.Complete(MStreamObs::EWrite
, err
);
156 void CStreamPlayer::MaoscOpenComplete(int aError
)
158 if(aError
== KErrNone
)
160 iStream
->SetDataTypeL(iType
);
161 iStream
->SetAudioPropertiesL(iRate
, iChannels
);
162 iStream
->SetPriority(EPriorityNormal
, EMdaPriorityPreferenceTime
);
168 if(iState
& EStarted
)
173 if(!(iState
& EDied
))
174 iObs
.Complete(MStreamObs::EInit
, aError
);
177 void CStreamPlayer::MaoscBufferCopied(int aError
, const TDesC8
& /*aBuffer*/)
179 if(aError
== KErrNone
)
186 else if(!(iState
& EDied
))
187 iObs
.Complete(MStreamObs::EPlay
, aError
);
190 void CStreamPlayer::MaoscPlayComplete(int aError
)
193 if(!(iState
& EDied
))
194 iObs
.Complete(MStreamObs::EClose
, aError
);