|
1 /* |
|
2 * Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: |
|
15 * SMIL Player media renderer for playing audio files |
|
16 * |
|
17 */ |
|
18 |
|
19 |
|
20 |
|
21 #include <mdaaudiosampleplayer.h> |
|
22 #include <AudioPreference.h> |
|
23 #include <smilpresentation.h> |
|
24 #include <mmf/common/mmcaf.h> |
|
25 |
|
26 #include "SmilAudioRenderer.h" |
|
27 |
|
28 #ifdef AUDIO_DEBUG |
|
29 #include "SmilMediaLogging.h" |
|
30 #endif |
|
31 |
|
32 // ---------------------------------------------------------------------------- |
|
33 // CSmilAudioRenderer::CSmilAudioRenderer |
|
34 // Constructor |
|
35 // ---------------------------------------------------------------------------- |
|
36 CSmilAudioRenderer::CSmilAudioRenderer( MSmilMedia* aMedia, |
|
37 DRMCommon& aDrmCommon, |
|
38 CDRMHelper& aDrmHelper ) : |
|
39 CSmilMediaRendererBase( EMsgMediaAudio, aMedia, aDrmCommon, aDrmHelper ), |
|
40 iIntrinsicDuration( TSmilTime::KUnresolved ), |
|
41 iState( ENotReady ), |
|
42 iError( KErrNone ), |
|
43 iRendererAtEnd( EFalse ) |
|
44 { |
|
45 } |
|
46 |
|
47 // ---------------------------------------------------------------------------- |
|
48 // CSmilAudioRenderer::ConstructL |
|
49 // ---------------------------------------------------------------------------- |
|
50 void CSmilAudioRenderer::ConstructL( RFile& aFileHandle ) |
|
51 { |
|
52 #ifdef AUDIO_DEBUG |
|
53 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: ConstructL" ); |
|
54 #endif |
|
55 |
|
56 BaseConstructL( aFileHandle ); |
|
57 User::LeaveIfError( CheckDRMRights() ); |
|
58 |
|
59 User::LeaveIfError( iMediaFile.Duplicate( aFileHandle ) ); |
|
60 |
|
61 iAudioPlayer = CMdaAudioPlayerUtility::NewL( *this, |
|
62 KAudioPrioritySmilPlayer, |
|
63 TMdaPriorityPreference( KAudioPrefSmilPlayer ) ); |
|
64 iState = EOpening; |
|
65 |
|
66 TMMFileHandleSource fileHandleSource( aFileHandle, KDefaultContentObject, ContentAccess::EPeek ); |
|
67 iAudioPlayer->OpenFileL( fileHandleSource ); |
|
68 |
|
69 //start active wait |
|
70 BeginActiveWait(); |
|
71 |
|
72 #ifdef AUDIO_DEBUG |
|
73 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iError=%d"), iError ); |
|
74 #endif |
|
75 |
|
76 User::LeaveIfError( iError ); |
|
77 |
|
78 MMMFDRMCustomCommand* customCommand = iAudioPlayer->GetDRMCustomCommand(); |
|
79 if ( customCommand ) |
|
80 { |
|
81 customCommand->DisableAutomaticIntent( ETrue ); |
|
82 } |
|
83 |
|
84 if ( iMedia && iMedia->Presentation() ) |
|
85 { |
|
86 // this is a persentage value, [0..100] |
|
87 TInt volume = iMedia->Presentation()->Volume(); |
|
88 |
|
89 #ifdef AUDIO_DEBUG |
|
90 SMILUILOGGER_WRITEF( _L("Audio: Presentation volume, volume=%d"), volume ); |
|
91 SMILUILOGGER_WRITEF( _L("Audio: iAudioPlayer->SetVolume(), volume=%d"), |
|
92 ( ( iAudioPlayer->MaxVolume() * volume ) / 100 ) ); |
|
93 #endif |
|
94 |
|
95 iAudioPlayer->SetVolume( ( iAudioPlayer->MaxVolume() * volume ) / 100 ); |
|
96 } |
|
97 |
|
98 #ifdef AUDIO_DEBUG |
|
99 SMILUILOGGER_LEAVEFN( "[SMILUI] Audio: ConstructL" ); |
|
100 #endif |
|
101 } |
|
102 |
|
103 |
|
104 // ---------------------------------------------------------------------------- |
|
105 // CSmilAudioRenderer::NewL |
|
106 // ---------------------------------------------------------------------------- |
|
107 CSmilAudioRenderer* CSmilAudioRenderer::NewL( RFile& aFileHandle, |
|
108 MSmilMedia* aMedia, |
|
109 DRMCommon& aDrmCommon, |
|
110 CDRMHelper& aDrmHelper ) |
|
111 { |
|
112 CSmilAudioRenderer* renderer = new(ELeave) CSmilAudioRenderer( aMedia, |
|
113 aDrmCommon, |
|
114 aDrmHelper ); |
|
115 CleanupStack::PushL( renderer ); |
|
116 renderer->ConstructL( aFileHandle ); |
|
117 CleanupStack::Pop( renderer ); |
|
118 return renderer; |
|
119 } |
|
120 |
|
121 // ---------------------------------------------------------------------------- |
|
122 // CSmilAudioRenderer::~CSmilAudioRenderer |
|
123 // ---------------------------------------------------------------------------- |
|
124 CSmilAudioRenderer::~CSmilAudioRenderer() |
|
125 { |
|
126 #ifdef AUDIO_DEBUG |
|
127 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: destructor" ); |
|
128 #endif |
|
129 if ( iAudioPlayer ) |
|
130 { |
|
131 iAudioPlayer->Close(); |
|
132 delete iAudioPlayer; |
|
133 } |
|
134 |
|
135 iMediaFile.Close(); |
|
136 iMedia = NULL; // For LINT |
|
137 } |
|
138 |
|
139 // ---------------------------------------------------------------------------- |
|
140 // CSmilAudioRenderer::IntrinsicDuration |
|
141 // ---------------------------------------------------------------------------- |
|
142 TSmilTime CSmilAudioRenderer::IntrinsicDuration() const |
|
143 { |
|
144 #ifdef AUDIO_DEBUG |
|
145 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: IntrinsicDuration()" ); |
|
146 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: IntrinsicDuration, dur=%d"), |
|
147 iIntrinsicDuration.Value() ); |
|
148 #endif |
|
149 return iIntrinsicDuration; |
|
150 } |
|
151 |
|
152 // ---------------------------------------------------------------------------- |
|
153 // CSmilAudioRenderer::PrepareMediaL |
|
154 // ---------------------------------------------------------------------------- |
|
155 void CSmilAudioRenderer::PrepareMediaL() |
|
156 { |
|
157 #ifdef AUDIO_DEBUG |
|
158 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: PrepareMediaL" ); |
|
159 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
160 #endif |
|
161 |
|
162 if ( iState == ENotReady ) |
|
163 { |
|
164 #ifdef AUDIO_DEBUG |
|
165 SMILUILOGGER_WRITEF( _L("SMILUI: Using late preparation") ); |
|
166 #endif |
|
167 |
|
168 iError = KErrNone; |
|
169 |
|
170 iAudioPlayer->OpenFileL( iMediaFile ); |
|
171 BeginActiveWait(); |
|
172 } |
|
173 |
|
174 #ifdef AUDIO_DEBUG |
|
175 SMILUILOGGER_WRITEF( _L("SMILUI: Audio, State = %d"), iState ); |
|
176 SMILUILOGGER_LEAVEFN( "Audio: PrepareMediaL" ); |
|
177 SMILUILOGGER_WRITEF( _L("")); |
|
178 #endif |
|
179 } |
|
180 |
|
181 // ---------------------------------------------------------------------------- |
|
182 // CSmilAudioRenderer::SeekMediaL |
|
183 // ---------------------------------------------------------------------------- |
|
184 void CSmilAudioRenderer::SeekMediaL( const TSmilTime& aTime ) |
|
185 { |
|
186 #ifdef AUDIO_DEBUG |
|
187 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: SeekMediaL" ); |
|
188 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: SeekMediaL, time=%d, iState=%d"), |
|
189 aTime.Value(), iState ); |
|
190 #endif |
|
191 iAudioPlayer->SetPosition( aTime.ToMicroSeconds() ); |
|
192 |
|
193 if( aTime == 0 && |
|
194 iRendererAtEnd && |
|
195 iState == EPlaying ) |
|
196 { |
|
197 #ifdef AUDIO_DEBUG |
|
198 SMILUILOGGER_WRITE( "[SMILUI] Audio: iAudioPlayer->Play() in SeekMediaL()" ); |
|
199 #endif |
|
200 iAudioPlayer->Play(); |
|
201 iRendererAtEnd = EFalse; |
|
202 } |
|
203 } |
|
204 |
|
205 // ---------------------------------------------------------------------------- |
|
206 // CSmilAudioRenderer::ShowMediaL |
|
207 // ---------------------------------------------------------------------------- |
|
208 void CSmilAudioRenderer::ShowMediaL() |
|
209 { |
|
210 #ifdef AUDIO_DEBUG |
|
211 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: ShowMedia" ); |
|
212 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
213 #endif |
|
214 if( iState == EOpen || |
|
215 iState == EHidden ) |
|
216 { |
|
217 #ifdef AUDIO_DEBUG |
|
218 SMILUILOGGER_WRITE( "[SMILUI] Audio: iAudioPlayer->Play() in ShowMedia" ); |
|
219 #endif |
|
220 ConsumeDRMRightsL(); |
|
221 if ( iMedia->Presentation()->State() == CSmilPresentation::EPlaying ) |
|
222 { |
|
223 iAudioPlayer->Play(); |
|
224 iState = EPlaying; |
|
225 } |
|
226 else |
|
227 { |
|
228 iState = EPaused; |
|
229 } |
|
230 } |
|
231 } |
|
232 |
|
233 // ---------------------------------------------------------------------------- |
|
234 // CSmilAudioRenderer::HideMedia |
|
235 // ---------------------------------------------------------------------------- |
|
236 void CSmilAudioRenderer::HideMedia() |
|
237 { |
|
238 #ifdef AUDIO_DEBUG |
|
239 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: HideMedia" ); |
|
240 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
241 #endif |
|
242 if( iState == EPlaying || |
|
243 iState == EPaused ) |
|
244 { |
|
245 #ifdef AUDIO_DEBUG |
|
246 SMILUILOGGER_WRITE( "[SMILUI] Audio: iAudioPlayer->Stop()" ); |
|
247 #endif |
|
248 iAudioPlayer->Stop(); |
|
249 iState = EHidden; |
|
250 } |
|
251 else |
|
252 { |
|
253 #ifdef AUDIO_DEBUG |
|
254 SMILUILOGGER_WRITE( "[SMILUI] Audio: Not EPlaying/EPaused -> No Stop()!" ); |
|
255 #endif |
|
256 } |
|
257 } |
|
258 |
|
259 // ---------------------------------------------------------------------------- |
|
260 // CSmilAudioRenderer::FreezeMedia |
|
261 // ---------------------------------------------------------------------------- |
|
262 void CSmilAudioRenderer::FreezeMedia() |
|
263 { |
|
264 #ifdef AUDIO_DEBUG |
|
265 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: FreezeMedia" ); |
|
266 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
267 #endif |
|
268 if ( iState == EPlaying ) |
|
269 { |
|
270 #ifdef AUDIO_DEBUG |
|
271 SMILUILOGGER_WRITE( "[SMILUI] Audio: iAudioPlayer->Pause()" ); |
|
272 #endif |
|
273 TInt err = iAudioPlayer->Pause(); |
|
274 if ( !err ) |
|
275 { |
|
276 iState = EPaused; |
|
277 } |
|
278 } |
|
279 #ifdef AUDIO_DEBUG |
|
280 SMILUILOGGER_LEAVEFN( "[SMILUI] Audio: FreezeMedia" ); |
|
281 #endif |
|
282 } |
|
283 |
|
284 // ---------------------------------------------------------------------------- |
|
285 // CSmilAudioRenderer::ResumeMedia |
|
286 // --------------------------------------------------------------------------- |
|
287 void CSmilAudioRenderer::ResumeMedia() |
|
288 { |
|
289 #ifdef AUDIO_DEBUG |
|
290 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: ResumeMedia" ); |
|
291 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
292 #endif |
|
293 if( iState == EPaused ) |
|
294 { |
|
295 #ifdef AUDIO_DEBUG |
|
296 SMILUILOGGER_WRITE( "[SMILUI] Audio: iAudioPlayer->Play() in ResumeMedia" ); |
|
297 #endif |
|
298 iAudioPlayer->Play(); |
|
299 iState = EPlaying; |
|
300 } |
|
301 #ifdef AUDIO_DEBUG |
|
302 SMILUILOGGER_LEAVEFN( "[SMILUI] Audio: ResumeMedia" ); |
|
303 #endif |
|
304 |
|
305 } |
|
306 |
|
307 // ---------------------------------------------------------------------------- |
|
308 // CSmilAudioRenderer::SetVolume |
|
309 // ---------------------------------------------------------------------------- |
|
310 void CSmilAudioRenderer::SetVolume( TInt aVolume ) |
|
311 { |
|
312 #ifdef AUDIO_DEBUG |
|
313 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: SetVolume, volume=%d"), aVolume ); |
|
314 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iAudioPlayer->SetVolume(), volume=%d"), |
|
315 ( ( iAudioPlayer->MaxVolume() * aVolume ) / 100 ) ); |
|
316 #endif |
|
317 // Presentation uses range [0..100] |
|
318 iAudioPlayer->SetVolume( ( iAudioPlayer->MaxVolume() * aVolume ) / 100 ); |
|
319 } |
|
320 |
|
321 // ---------------------------------------------------------------------------- |
|
322 // CSmilAudioRenderer::MapcInitComplete |
|
323 // ---------------------------------------------------------------------------- |
|
324 void CSmilAudioRenderer::MapcInitComplete( |
|
325 TInt aError, |
|
326 const TTimeIntervalMicroSeconds& aDuration ) |
|
327 { |
|
328 #ifdef AUDIO_DEBUG |
|
329 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: MapcInitComplete" ); |
|
330 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: error=%d"), aError ); |
|
331 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
332 #endif |
|
333 |
|
334 if ( aError ) |
|
335 { |
|
336 iError = aError; |
|
337 iState = ENotReady; |
|
338 } |
|
339 else |
|
340 { |
|
341 iState = EOpen; |
|
342 iIntrinsicDuration = TSmilTime::FromMicroSeconds( aDuration ); |
|
343 |
|
344 #ifdef AUDIO_DEBUG |
|
345 SMILUILOGGER_WRITE( "[SMILUI] Audio: iMedia->RendererDurationChangedL()" ); |
|
346 #endif |
|
347 TRAPD( error, iMedia->RendererDurationChangedL() ); |
|
348 if ( error != KErrNone ) |
|
349 { |
|
350 #ifdef AUDIO_DEBUG |
|
351 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: RendererDurationChangedL=%d"), error ); |
|
352 #endif |
|
353 iError = error; |
|
354 iState = ENotReady; |
|
355 } |
|
356 } |
|
357 |
|
358 EndActiveWait(); |
|
359 |
|
360 #ifdef AUDIO_DEBUG |
|
361 SMILUILOGGER_LEAVEFN( "[SMILUI] Audio: MapcInitComplete" ); |
|
362 #endif |
|
363 } |
|
364 |
|
365 // ---------------------------------------------------------------------------- |
|
366 // CSmilAudioRenderer::MapcPlayComplete |
|
367 // ---------------------------------------------------------------------------- |
|
368 void CSmilAudioRenderer::MapcPlayComplete( TInt aError ) |
|
369 { |
|
370 #ifdef AUDIO_DEBUG |
|
371 SMILUILOGGER_ENTERFN( "[SMILUI] Audio: MapcPlayComplete()" ); |
|
372 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: MapcPlayComplete, error=%d"), |
|
373 aError ); |
|
374 SMILUILOGGER_WRITEF( _L("[SMILUI] Audio: iState=%d"), iState ); |
|
375 #endif |
|
376 if ( aError != KErrNone ) |
|
377 { |
|
378 iError = aError; |
|
379 //if error goto end |
|
380 iRendererAtEnd = ETrue; |
|
381 TRAPD( error, iMedia->RendererAtEndL() ); |
|
382 if ( error != KErrNone ) |
|
383 { |
|
384 iError = error; |
|
385 } |
|
386 } |
|
387 else |
|
388 { |
|
389 |
|
390 #ifdef AUDIO_DEBUG |
|
391 SMILUILOGGER_WRITE( "[SMILUI] Audio: iMedia->RendererAtEndL()" ); |
|
392 #endif |
|
393 TRAPD( error, iMedia->RendererAtEndL() ); |
|
394 if( !error ) |
|
395 { |
|
396 iRendererAtEnd = ETrue; |
|
397 } |
|
398 } |
|
399 #ifdef AUDIO_DEBUG |
|
400 SMILUILOGGER_LEAVEFN( "[SMILUI] Audio: MapcPlayComplete" ); |
|
401 #endif |
|
402 } |
|
403 |
|
404 // End of File |