diff options
Diffstat (limited to 'apps/plugins/sdl/src/audio/symbian/streamplayer.cpp')
-rw-r--r-- | apps/plugins/sdl/src/audio/symbian/streamplayer.cpp | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/apps/plugins/sdl/src/audio/symbian/streamplayer.cpp b/apps/plugins/sdl/src/audio/symbian/streamplayer.cpp new file mode 100644 index 0000000000..dd733a1d17 --- /dev/null +++ b/apps/plugins/sdl/src/audio/symbian/streamplayer.cpp | |||
@@ -0,0 +1,279 @@ | |||
1 | #include "streamplayer.h" | ||
2 | #include<mda/common/audio.h> | ||
3 | |||
4 | |||
5 | |||
6 | const TInt KMaxVolume(256); | ||
7 | |||
8 | LOCAL_C TInt GetSampleRate(TInt aRate) | ||
9 | { | ||
10 | switch(aRate) | ||
11 | { | ||
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; | ||
23 | } | ||
24 | return KErrNotFound; | ||
25 | } | ||
26 | |||
27 | LOCAL_C TInt GetChannels(TInt aChannels) | ||
28 | { | ||
29 | switch(aChannels) | ||
30 | { | ||
31 | case 1: return TMdaAudioDataSettings::EChannelsMono; | ||
32 | case 2: return TMdaAudioDataSettings::EChannelsStereo; | ||
33 | } | ||
34 | return KErrNotFound; | ||
35 | } | ||
36 | |||
37 | TInt CStreamPlayer::ClosestSupportedRate(TInt aRate) | ||
38 | { | ||
39 | if(aRate > 96000) | ||
40 | return 96000; | ||
41 | TInt rate = aRate; | ||
42 | while(GetSampleRate(rate) == KErrNotFound) | ||
43 | { | ||
44 | ++rate; | ||
45 | } | ||
46 | return rate; | ||
47 | } | ||
48 | |||
49 | CStreamPlayer::CStreamPlayer(MStreamProvider& aProvider, MStreamObs& aObs) : | ||
50 | iProvider(aProvider), iObs(aObs), iVolume(KMaxVolume) | ||
51 | { | ||
52 | } | ||
53 | |||
54 | CStreamPlayer::~CStreamPlayer() | ||
55 | { | ||
56 | iState |= EDied; | ||
57 | if(iState & EInited) | ||
58 | Close(); | ||
59 | User::After(100000); //wait buffer to be flushed | ||
60 | ASSERT(iPtr.Length() == 0); | ||
61 | delete iStream; | ||
62 | } | ||
63 | |||
64 | |||
65 | void CStreamPlayer::ConstructL() | ||
66 | { | ||
67 | iStream = CMdaAudioOutputStream::NewL(*this, EMdaPriorityMax); | ||
68 | iSilence.SetMax(); | ||
69 | iSilence.FillZ(); | ||
70 | } | ||
71 | |||
72 | |||
73 | TInt CStreamPlayer::OpenStream(TInt aRate, TInt aChannels, TUint32 aType) | ||
74 | { | ||
75 | Close(); | ||
76 | |||
77 | iType = aType; | ||
78 | |||
79 | iRate = GetSampleRate(aRate); | ||
80 | if(iRate == KErrNotFound) | ||
81 | return KErrNotSupported; | ||
82 | |||
83 | iChannels = GetChannels(aChannels); | ||
84 | if(iChannels == KErrNotFound) | ||
85 | return KErrNotSupported; | ||
86 | |||
87 | Open(); | ||
88 | |||
89 | return KErrNone; | ||
90 | } | ||
91 | |||
92 | |||
93 | TInt CStreamPlayer::MaxVolume() const | ||
94 | { | ||
95 | return KMaxVolume; | ||
96 | } | ||
97 | |||
98 | void CStreamPlayer::SetVolume(TInt aNew) | ||
99 | { | ||
100 | |||
101 | const TInt maxi = MaxVolume(); | ||
102 | if(aNew > maxi) | ||
103 | return; | ||
104 | if(aNew < 0) | ||
105 | return; | ||
106 | |||
107 | iVolume = aNew; | ||
108 | |||
109 | iState |= EVolumeChange; | ||
110 | } | ||
111 | |||
112 | TInt CStreamPlayer::Volume() const | ||
113 | { | ||
114 | return iVolume; | ||
115 | } | ||
116 | |||
117 | void CStreamPlayer::Open() | ||
118 | { | ||
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; | ||
127 | |||
128 | iState &= ~EStopped; | ||
129 | iStream->Open(&audioSettings); | ||
130 | } | ||
131 | |||
132 | void CStreamPlayer::Stop() | ||
133 | { | ||
134 | if(iState & (EStarted | EInited)) | ||
135 | { | ||
136 | Close(); | ||
137 | iState |= EStopped; | ||
138 | } | ||
139 | } | ||
140 | |||
141 | void CStreamPlayer::Start() | ||
142 | { | ||
143 | if(iPtr.Length() == 0) | ||
144 | { | ||
145 | iState |= EStarted; | ||
146 | if(iState & EInited) | ||
147 | { | ||
148 | Request(); | ||
149 | } | ||
150 | else if(iState & EStopped) | ||
151 | { | ||
152 | Open(); | ||
153 | } | ||
154 | } | ||
155 | } | ||
156 | |||
157 | void CStreamPlayer::Close() | ||
158 | { | ||
159 | iState &= ~EInited; | ||
160 | iStream->Stop(); | ||
161 | iState &= ~EStarted; | ||
162 | } | ||
163 | |||
164 | void CStreamPlayer::Request() | ||
165 | { | ||
166 | if(iState & EInited) | ||
167 | { | ||
168 | iPtr.Set(KNullDesC8); | ||
169 | |||
170 | if(iState & EVolumeChange) | ||
171 | { | ||
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; | ||
180 | } | ||
181 | |||
182 | if(iState & EStarted) | ||
183 | { | ||
184 | iPtr.Set(iProvider.Data()); | ||
185 | } | ||
186 | if(iPtr.Length() == 0) | ||
187 | { | ||
188 | iPtr.Set(iSilence); | ||
189 | } | ||
190 | TRAPD(err, iStream->WriteL(iPtr)); | ||
191 | if(err != KErrNone) | ||
192 | { | ||
193 | iObs.Complete(MStreamObs::EWrite, err); | ||
194 | } | ||
195 | /* else | ||
196 | { | ||
197 | iProvider.Written(iPtr.Length()); | ||
198 | }*/ | ||
199 | } | ||
200 | } | ||
201 | |||
202 | |||
203 | void CStreamPlayer::SetCapsL() | ||
204 | { | ||
205 | iStream->SetDataTypeL(iType); | ||
206 | iStream->SetAudioPropertiesL(iRate, iChannels); | ||
207 | } | ||
208 | |||
209 | void CStreamPlayer::MaoscOpenComplete(TInt aError) | ||
210 | { | ||
211 | if(aError == KErrNone) | ||
212 | { | ||
213 | TRAPD(err, SetCapsL()); | ||
214 | if(err == KErrNone) | ||
215 | { | ||
216 | iStream->SetPriority(EPriorityNormal, EMdaPriorityPreferenceTime); | ||
217 | iState |= EInited; | ||
218 | |||
219 | |||
220 | SetVolume(Volume()); | ||
221 | |||
222 | if(iState & EStarted) | ||
223 | { | ||
224 | Request(); | ||
225 | } | ||
226 | |||
227 | } | ||
228 | aError = err; | ||
229 | } | ||
230 | if(!(iState & EDied)) | ||
231 | iObs.Complete(MStreamObs::EInit, aError); | ||
232 | } | ||
233 | |||
234 | void CStreamPlayer::MaoscBufferCopied(TInt aError, const TDesC8& /*aBuffer*/) | ||
235 | { | ||
236 | iPtr.Set(KNullDesC8); | ||
237 | if(aError == KErrNone) | ||
238 | { | ||
239 | if(iState & EInited) | ||
240 | Request(); | ||
241 | else | ||
242 | iStream->Stop(); | ||
243 | } | ||
244 | else if(!(iState & EDied)) | ||
245 | iObs.Complete(MStreamObs::EPlay, aError); | ||
246 | } | ||
247 | |||
248 | void CStreamPlayer::MaoscPlayComplete(TInt aError) | ||
249 | { | ||
250 | iPtr.Set(KNullDesC8); | ||
251 | iState &= ~EStarted; | ||
252 | if(!(iState & EDied)) | ||
253 | iObs.Complete(MStreamObs::EClose, aError); | ||
254 | } | ||
255 | |||
256 | TBool CStreamPlayer::Playing() const | ||
257 | { | ||
258 | return (iState & EInited) && (iState & EStarted); | ||
259 | } | ||
260 | |||
261 | TBool CStreamPlayer::Closed() const | ||
262 | { | ||
263 | return !(iState & EInited) && !(iState & EDied); | ||
264 | } | ||
265 | |||
266 | /* | ||
267 | void CStreamPlayer::Request() | ||
268 | { | ||
269 | SetActive(); | ||
270 | TRequestStatus* s = &iStatus; | ||
271 | User::RequestComplete(s, KErrNone); | ||
272 | } | ||
273 | // iTimer.After(0); | ||
274 | */ | ||
275 | |||
276 | |||
277 | |||
278 | |||
279 | |||