-rw-r--r-- | core/multimedia/opieplayer/loopcontrol.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp index 310d512..6f86b4a 100644 --- a/core/multimedia/opieplayer/loopcontrol.cpp +++ b/core/multimedia/opieplayer/loopcontrol.cpp | |||
@@ -255,223 +255,227 @@ void LoopControl::startAudio() { | |||
255 | 255 | ||
256 | } else { | 256 | } else { |
257 | 257 | ||
258 | moreAudio = FALSE; | 258 | moreAudio = FALSE; |
259 | 259 | ||
260 | } | 260 | } |
261 | 261 | ||
262 | } | 262 | } |
263 | 263 | ||
264 | audioMutex->unlock(); | 264 | audioMutex->unlock(); |
265 | } | 265 | } |
266 | 266 | ||
267 | 267 | ||
268 | void LoopControl::killTimers() { | 268 | void LoopControl::killTimers() { |
269 | 269 | ||
270 | audioMutex->lock(); | 270 | audioMutex->lock(); |
271 | 271 | ||
272 | if ( hasVideoChannel ) | 272 | if ( hasVideoChannel ) |
273 | killTimer( videoId ); | 273 | killTimer( videoId ); |
274 | killTimer( sliderId ); | 274 | killTimer( sliderId ); |
275 | threadOkToGo = FALSE; | 275 | threadOkToGo = FALSE; |
276 | 276 | ||
277 | audioMutex->unlock(); | 277 | audioMutex->unlock(); |
278 | } | 278 | } |
279 | 279 | ||
280 | 280 | ||
281 | void LoopControl::startTimers() { | 281 | void LoopControl::startTimers() { |
282 | 282 | ||
283 | audioMutex->lock(); | 283 | audioMutex->lock(); |
284 | 284 | ||
285 | moreVideo = FALSE; | 285 | moreVideo = FALSE; |
286 | moreAudio = FALSE; | 286 | moreAudio = FALSE; |
287 | 287 | ||
288 | if ( hasVideoChannel ) { | 288 | if ( hasVideoChannel ) { |
289 | moreVideo = TRUE; | 289 | moreVideo = TRUE; |
290 | int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value | 290 | int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value |
291 | videoId = startTimer( mSecsBetweenFrames ); | 291 | videoId = startTimer( mSecsBetweenFrames ); |
292 | } | 292 | } |
293 | 293 | ||
294 | if ( hasAudioChannel ) { | 294 | if ( hasAudioChannel ) { |
295 | moreAudio = TRUE; | 295 | moreAudio = TRUE; |
296 | threadOkToGo = TRUE; | 296 | threadOkToGo = TRUE; |
297 | } | 297 | } |
298 | 298 | ||
299 | sliderId = startTimer( 300 ); // update slider every 1/3 second | 299 | sliderId = startTimer( 300 ); // update slider every 1/3 second |
300 | 300 | ||
301 | audioMutex->unlock(); | 301 | audioMutex->unlock(); |
302 | } | 302 | } |
303 | 303 | ||
304 | 304 | ||
305 | void LoopControl::setPaused( bool pause ) { | 305 | void LoopControl::setPaused( bool pause ) { |
306 | 306 | ||
307 | if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) | 307 | if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() ) |
308 | return; | 308 | return; |
309 | 309 | ||
310 | if ( pause ) { | 310 | if ( pause ) { |
311 | killTimers(); | 311 | killTimers(); |
312 | } else { | 312 | } else { |
313 | // Force an update of the position | 313 | // Force an update of the position |
314 | mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); | 314 | mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); |
315 | mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); | 315 | mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); |
316 | // Just like we never stopped | 316 | // Just like we never stopped |
317 | startTimers(); | 317 | startTimers(); |
318 | } | 318 | } |
319 | } | 319 | } |
320 | 320 | ||
321 | 321 | ||
322 | void LoopControl::stop( bool willPlayAgainShortly ) { | 322 | void LoopControl::stop( bool willPlayAgainShortly ) { |
323 | 323 | ||
324 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) | 324 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) |
325 | if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { | 325 | if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) { |
326 | disabledSuspendScreenSaver = FALSE; | 326 | disabledSuspendScreenSaver = FALSE; |
327 | // Re-enable the suspend mode | 327 | // Re-enable the suspend mode |
328 | QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; | 328 | QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; |
329 | } | 329 | } |
330 | #endif | 330 | #endif |
331 | 331 | ||
332 | if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { | 332 | if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) { |
333 | 333 | ||
334 | killTimers(); | 334 | killTimers(); |
335 | 335 | ||
336 | audioMutex->lock(); | 336 | audioMutex->lock(); |
337 | 337 | ||
338 | mediaPlayerState->curDecoder()->close(); | 338 | mediaPlayerState->curDecoder()->close(); |
339 | 339 | ||
340 | if ( audioDevice ) { | 340 | if ( audioDevice ) { |
341 | delete audioDevice; | 341 | delete audioDevice; |
342 | delete audioBuffer; | 342 | delete audioBuffer; |
343 | audioDevice = 0; | 343 | audioDevice = 0; |
344 | audioBuffer = 0; | 344 | audioBuffer = 0; |
345 | } | 345 | } |
346 | 346 | ||
347 | audioMutex->unlock(); | 347 | audioMutex->unlock(); |
348 | 348 | ||
349 | } | 349 | } |
350 | } | 350 | } |
351 | 351 | ||
352 | 352 | ||
353 | bool LoopControl::init( const QString& filename ) { | 353 | bool LoopControl::init( const QString& filename ) { |
354 | stop(); | 354 | stop(); |
355 | 355 | ||
356 | audioMutex->lock(); | 356 | audioMutex->lock(); |
357 | 357 | ||
358 | fileName = filename; | 358 | fileName = filename; |
359 | stream = 0; // only play stream 0 for now | 359 | stream = 0; // only play stream 0 for now |
360 | current_frame = total_video_frames = total_audio_samples = 0; | 360 | current_frame = total_video_frames = total_audio_samples = 0; |
361 | 361 | ||
362 | qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); | 362 | qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() ); |
363 | 363 | ||
364 | // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin | 364 | // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin |
365 | if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { | 365 | if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) { |
366 | if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) { | 366 | if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) { |
367 | total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); | 367 | total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 ); |
368 | mediaPlayerState->libMpeg3Decoder()->close(); | 368 | mediaPlayerState->libMpeg3Decoder()->close(); |
369 | } | 369 | } |
370 | } | 370 | } |
371 | 371 | ||
372 | if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { | 372 | if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) { |
373 | audioMutex->unlock(); | 373 | audioMutex->unlock(); |
374 | return FALSE; | 374 | return FALSE; |
375 | } | 375 | } |
376 | 376 | ||
377 | hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; | 377 | hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0; |
378 | hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; | 378 | hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0; |
379 | 379 | ||
380 | if ( hasAudioChannel ) { | 380 | if ( hasAudioChannel ) { |
381 | int astream = 0; | 381 | int astream = 0; |
382 | 382 | ||
383 | channels = mediaPlayerState->curDecoder()->audioChannels( astream ); | 383 | if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") ) |
384 | qDebug( "LC- channels = %d", channels ); | 384 | channels = 2; //dont akx me why, but it needs this hack |
385 | else | ||
386 | channels = mediaPlayerState->curDecoder()->audioChannels( astream ); | ||
387 | |||
388 | qDebug( "LC- channels = %d", channels ); | ||
385 | 389 | ||
386 | if ( !total_audio_samples ) | 390 | if ( !total_audio_samples ) |
387 | total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); | 391 | total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream ); |
388 | 392 | ||
389 | total_audio_samples += 1000; | 393 | total_audio_samples += 1000; |
390 | 394 | ||
391 | mediaPlayerState->setLength( total_audio_samples ); | 395 | mediaPlayerState->setLength( total_audio_samples ); |
392 | 396 | ||
393 | freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); | 397 | freq = mediaPlayerState->curDecoder()->audioFrequency( astream ); |
394 | qDebug( "LC- frequency = %d", freq ); | 398 | qDebug( "LC- frequency = %d", freq ); |
395 | 399 | ||
396 | audioSampleCounter = 0; | 400 | audioSampleCounter = 0; |
397 | int bits_per_sample; | 401 | int bits_per_sample; |
398 | if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { | 402 | if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) { |
399 | bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); | 403 | bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime(); |
400 | qDebug("using stupid hack"); | 404 | qDebug("using stupid hack"); |
401 | } else { | 405 | } else { |
402 | bits_per_sample=0; | 406 | bits_per_sample=0; |
403 | } | 407 | } |
404 | 408 | ||
405 | audioDevice = new AudioDevice( freq, channels, bits_per_sample); | 409 | audioDevice = new AudioDevice( freq, channels, bits_per_sample); |
406 | audioBuffer = new char[ audioDevice->bufferSize() ]; | 410 | audioBuffer = new char[ audioDevice->bufferSize() ]; |
407 | channels = audioDevice->channels(); | 411 | channels = audioDevice->channels(); |
408 | 412 | ||
409 | //### must check which frequency is actually used. | 413 | //### must check which frequency is actually used. |
410 | static const int size = 1; | 414 | static const int size = 1; |
411 | short int buf[size]; | 415 | short int buf[size]; |
412 | long samplesRead = 0; | 416 | long samplesRead = 0; |
413 | mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); | 417 | mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream ); |
414 | } | 418 | } |
415 | 419 | ||
416 | if ( hasVideoChannel ) { | 420 | if ( hasVideoChannel ) { |
417 | total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); | 421 | total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream ); |
418 | 422 | ||
419 | mediaPlayerState->setLength( total_video_frames ); | 423 | mediaPlayerState->setLength( total_video_frames ); |
420 | 424 | ||
421 | framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); | 425 | framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream ); |
422 | DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); | 426 | DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames )); |
423 | 427 | ||
424 | if ( framerate <= 1.0 ) { | 428 | if ( framerate <= 1.0 ) { |
425 | DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); | 429 | DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" )); |
426 | framerate = 25; | 430 | framerate = 25; |
427 | } | 431 | } |
428 | 432 | ||
429 | if ( total_video_frames == 1 ) { | 433 | if ( total_video_frames == 1 ) { |
430 | DecodeLoopDebug(( "Cannot seek to frame" )); | 434 | DecodeLoopDebug(( "Cannot seek to frame" )); |
431 | } | 435 | } |
432 | 436 | ||
433 | } | 437 | } |
434 | 438 | ||
435 | current_frame = 0; | 439 | current_frame = 0; |
436 | prev_frame = -1; | 440 | prev_frame = -1; |
437 | 441 | ||
438 | connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); | 442 | connect( mediaPlayerState, SIGNAL( positionChanged( long ) ), this, SLOT( setPosition( long ) ) ); |
439 | connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); | 443 | connect( mediaPlayerState, SIGNAL( pausedToggled( bool ) ), this, SLOT( setPaused( bool ) ) ); |
440 | 444 | ||
441 | audioMutex->unlock(); | 445 | audioMutex->unlock(); |
442 | 446 | ||
443 | return TRUE; | 447 | return TRUE; |
444 | } | 448 | } |
445 | 449 | ||
446 | 450 | ||
447 | void LoopControl::play() { | 451 | void LoopControl::play() { |
448 | qDebug("LC- play"); | 452 | qDebug("LC- play"); |
449 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) | 453 | #if defined(Q_WS_QWS) && !defined(QT_NO_COP) |
450 | if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { | 454 | if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) { |
451 | disabledSuspendScreenSaver = TRUE; | 455 | disabledSuspendScreenSaver = TRUE; |
452 | previousSuspendMode = hasVideoChannel; | 456 | previousSuspendMode = hasVideoChannel; |
453 | // Stop the screen from blanking and power saving state | 457 | // Stop the screen from blanking and power saving state |
454 | QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) | 458 | QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) |
455 | << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); | 459 | << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend ); |
456 | } | 460 | } |
457 | #endif | 461 | #endif |
458 | 462 | ||
459 | playtime.start(); | 463 | playtime.start(); |
460 | startTimers(); | 464 | startTimers(); |
461 | } | 465 | } |
462 | 466 | ||
463 | 467 | ||
464 | void LoopControl::setMute( bool on ) { | 468 | void LoopControl::setMute( bool on ) { |
465 | if ( on != isMuted ) { | 469 | if ( on != isMuted ) { |
466 | isMuted = on; | 470 | isMuted = on; |
467 | if ( !on ) { | 471 | if ( !on ) { |
468 | // Force an update of the position | 472 | // Force an update of the position |
469 | mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); | 473 | mediaPlayerState->setPosition( mediaPlayerState->position() + 1 ); |
470 | mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); | 474 | mediaPlayerState->setPosition( mediaPlayerState->position() - 1 ); |
471 | // Resume playing audio | 475 | // Resume playing audio |
472 | moreAudio = TRUE; | 476 | moreAudio = TRUE; |
473 | } | 477 | } |
474 | } | 478 | } |
475 | } | 479 | } |
476 | 480 | ||
477 | 481 | ||