summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/loopcontrol.cpp
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/loopcontrol.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp384
1 files changed, 193 insertions, 191 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 3171c4b..70e4a78 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -1,22 +1,22 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
-**
-** This file is part of Qtopia Environment.
-**
-** This file may be distributed and/or modified under the terms of the
-** GNU General Public License version 2 as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL included in the
-** packaging of this file.
-**
-** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
-** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
-**
-** See http://www.trolltech.com/gpl/ for GPL licensing information.
-**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
-**********************************************************************/
+ ** Copyright (C) 2000 Trolltech AS. All rights reserved.
+ **
+ ** This file is part of Qtopia Environment.
+ **
+ ** This file may be distributed and/or modified under the terms of the
+ ** GNU General Public License version 2 as published by the Free Software
+ ** Foundation and appearing in the file LICENSE.GPL included in the
+ ** packaging of this file.
+ **
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** See http://www.trolltech.com/gpl/ for GPL licensing information.
+ **
+ ** Contact info@trolltech.com if any conditions of this licensing are
+ ** not clear to you.
+ **
+ **********************************************************************/
// L.J.Potter added changes Fri 02-15-2002
#include <qpe/qpeapplication.h>
@@ -59,22 +59,22 @@ bool threadOkToGo = FALSE;
class Mutex {
public:
Mutex() {
- pthread_mutexattr_t attr;
- pthread_mutexattr_init( &attr );
- pthread_mutex_init( &mutex, &attr );
- pthread_mutexattr_destroy( &attr );
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init( &attr );
+ pthread_mutex_init( &mutex, &attr );
+ pthread_mutexattr_destroy( &attr );
}
~Mutex() {
- pthread_mutex_destroy( &mutex );
+ pthread_mutex_destroy( &mutex );
}
void lock() {
- pthread_mutex_lock( &mutex );
+ pthread_mutex_lock( &mutex );
}
void unlock() {
- pthread_mutex_unlock( &mutex );
+ pthread_mutex_unlock( &mutex );
}
private:
pthread_mutex_t mutex;
@@ -84,10 +84,10 @@ private:
void *startAudioThread( void *ptr ) {
LoopControl *mpegView = (LoopControl *)ptr;
while ( TRUE ) {
- if ( threadOkToGo && mpegView->moreAudio )
- mpegView->startAudio();
- else
- usleep( 10000 ); // Semi-buzy-wait till we are playing again
+ if ( threadOkToGo && mpegView->moreAudio )
+ mpegView->startAudio();
+ else
+ usleep( 10000 ); // Semi-buzy-wait till we are playing again
}
return 0;
}
@@ -97,7 +97,7 @@ Mutex *audioMutex;
LoopControl::LoopControl( QObject *parent, const char *name )
- : QObject( parent, name ) {
+ : QObject( parent, name ) {
isMuted = FALSE;
connect( qApp, SIGNAL( volumeChanged(bool) ), this, SLOT( setMute(bool) ) );
//qDebug("starting loopcontrol");
@@ -106,15 +106,15 @@ LoopControl::LoopControl( QObject *parent, const char *name )
pthread_attr_init(&audio_attr);
#define USE_REALTIME_AUDIO_THREAD
#ifdef USE_REALTIME_AUDIO_THREAD
- // Attempt to set it to real-time round robin
+ // Attempt to set it to real-time round robin
if ( pthread_attr_setschedpolicy( &audio_attr, SCHED_RR ) == 0 ) {
- sched_param params;
- params.sched_priority = 50;
- pthread_attr_setschedparam(&audio_attr,&params);
+ sched_param params;
+ params.sched_priority = 50;
+ pthread_attr_setschedparam(&audio_attr,&params);
} else {
- qDebug( "Error setting up a realtime thread, reverting to using a normal thread." );
- pthread_attr_destroy(&audio_attr);
- pthread_attr_init(&audio_attr);
+ qDebug( "Error setting up a realtime thread, reverting to using a normal thread." );
+ pthread_attr_destroy(&audio_attr);
+ pthread_attr_init(&audio_attr);
}
#endif
//qDebug("create audio thread");
@@ -134,14 +134,14 @@ static int currentSample = 0;
void LoopControl::timerEvent( QTimerEvent *te ) {
if ( te->timerId() == videoId )
- startVideo();
+ startVideo();
if ( te->timerId() == sliderId ) {
- if ( hasAudioChannel && !hasVideoChannel && moreAudio ) {
- mediaPlayerState->updatePosition( audioSampleCounter );
- } else if ( hasVideoChannel && moreVideo ) {
- mediaPlayerState->updatePosition( current_frame );
- }
+ if ( hasAudioChannel && !hasVideoChannel && moreAudio ) {
+ mediaPlayerState->updatePosition( audioSampleCounter );
+ } else if ( hasVideoChannel && moreVideo ) {
+ mediaPlayerState->updatePosition( current_frame );
+ }
}
if ( !moreVideo && !moreAudio ) {
@@ -153,28 +153,28 @@ void LoopControl::timerEvent( QTimerEvent *te ) {
void LoopControl::setPosition( long pos ) {
audioMutex->lock();
-
+// qDebug("Loop control %d", pos);
if ( hasVideoChannel && hasAudioChannel ) {
- playtime.restart();
- playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
- current_frame = pos + 1;
- mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
- prev_frame = current_frame - 1;
- currentSample = (int)( (double)current_frame * freq / framerate );
- mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
- audioSampleCounter = currentSample - 1;
+ playtime.restart();
+ playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
+ current_frame = pos + 1;
+ mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
+ prev_frame = current_frame - 1;
+ currentSample = (int)( (double)current_frame * freq / framerate );
+ mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
+ audioSampleCounter = currentSample - 1;
} else if ( hasVideoChannel ) {
- playtime.restart();
- playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
- current_frame = pos + 1;
- mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
- prev_frame = current_frame - 1;
+ playtime.restart();
+ playtime = playtime.addMSecs( long((double)-pos * 1000.0 / framerate) );
+ current_frame = pos + 1;
+ mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
+ prev_frame = current_frame - 1;
} else if ( hasAudioChannel ) {
- playtime.restart();
- playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) );
- currentSample = pos + 1;
- mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
- audioSampleCounter = currentSample - 1;
+ playtime.restart();
+ playtime = playtime.addMSecs( long((double)-pos * 1000.0 / freq) );
+ currentSample = pos + 1;
+ mediaPlayerState->curDecoder()->audioSetSample( currentSample, stream );
+ audioSampleCounter = currentSample - 1;
}
audioMutex->unlock();
@@ -187,32 +187,32 @@ void LoopControl::startVideo() {
if ( mediaPlayerState->curDecoder() ) {
- if ( hasAudioChannel && !isMuted ) {
+ if ( hasAudioChannel && !isMuted ) {
- current_frame = long( playtime.elapsed() * framerate / 1000 );
+ current_frame = long( playtime.elapsed() * framerate / 1000 );
- if ( prev_frame != -1 && current_frame <= prev_frame )
- return;
+ if ( prev_frame != -1 && current_frame <= prev_frame )
+ return;
- } else {
- // Don't skip
- current_frame++;
- }
+ } else {
+ // Don't skip
+ current_frame++;
+ }
- if ( prev_frame == -1 || current_frame > prev_frame ) {
- if ( current_frame > prev_frame + 1 ) {
- mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
- }
- moreVideo = videoUI->playVideo();
- prev_frame = current_frame;
- }
+ if ( prev_frame == -1 || current_frame > prev_frame ) {
+ if ( current_frame > prev_frame + 1 ) {
+ mediaPlayerState->curDecoder()->videoSetFrame( current_frame, stream );
+ }
+ moreVideo = videoUI->playVideo();
+ prev_frame = current_frame;
+ }
- } else {
+ } else {
- moreVideo = FALSE;
- killTimer( videoId );
+ moreVideo = FALSE;
+ killTimer( videoId );
- }
+ }
}
}
@@ -220,44 +220,43 @@ void LoopControl::startVideo() {
void LoopControl::startAudio() {
-//qDebug("start audio");
audioMutex->lock();
if ( moreAudio ) {
- if ( !isMuted && mediaPlayerState->curDecoder() ) {
+ if ( !isMuted && mediaPlayerState->curDecoder() ) {
- currentSample = audioSampleCounter + 1;
+ currentSample = audioSampleCounter + 1;
- if ( currentSample != audioSampleCounter + 1 )
- qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
+ if ( currentSample != audioSampleCounter + 1 )
+ qDebug("out of sync with decoder %i %i", currentSample, audioSampleCounter);
- long samplesRead = 0;
- bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
- long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
- long sampleWaitTime = currentSample - sampleWeShouldBeAt;
+ long samplesRead = 0;
+ bool readOk=mediaPlayerState->curDecoder()->audioReadSamples( (short*)audioBuffer, channels, 1024, samplesRead, stream );
+ long sampleWeShouldBeAt = long( playtime.elapsed() ) * freq / 1000;
+ long sampleWaitTime = currentSample - sampleWeShouldBeAt;
// this causes drop outs not sure why its even here
- if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
- usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
- }
- else if ( sampleWaitTime <= -5000 ) {
- qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
-// //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
- currentSample = sampleWeShouldBeAt;
- }
+// if ( ( sampleWaitTime > 2000 ) && ( sampleWaitTime < 20000 ) ) {
+// usleep( (long)((double)sampleWaitTime * 1000000.0 / freq) );
+// }
+// else if ( sampleWaitTime <= -5000 ) {
+// qDebug("need to catch up by: %li (%i,%li)", -sampleWaitTime, currentSample, sampleWeShouldBeAt );
+// // //mediaPlayerState->curDecoder()->audioSetSample( sampleWeShouldBeAt, stream );
+// currentSample = sampleWeShouldBeAt;
+// }
- audioDevice->write( audioBuffer, samplesRead * 2 * channels );
+ audioDevice->write( audioBuffer, samplesRead * 2 * channels );
- if( mediaPlayerState->isStreaming == FALSE)
- audioSampleCounter = currentSample + samplesRead - 1;
+ if( mediaPlayerState->isStreaming == FALSE)
+ audioSampleCounter = currentSample + samplesRead - 1;
- moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
+ moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
- } else {
+ } else {
- moreAudio = FALSE;
+ moreAudio = FALSE;
- }
+ }
}
@@ -270,7 +269,7 @@ void LoopControl::killTimers() {
audioMutex->lock();
if ( hasVideoChannel )
- killTimer( videoId );
+ killTimer( videoId );
killTimer( sliderId );
threadOkToGo = FALSE;
@@ -286,14 +285,14 @@ void LoopControl::startTimers() {
moreAudio = FALSE;
if ( hasVideoChannel ) {
- moreVideo = TRUE;
- int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
- videoId = startTimer( mSecsBetweenFrames );
+ moreVideo = TRUE;
+ int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
+ videoId = startTimer( mSecsBetweenFrames );
}
if ( hasAudioChannel ) {
- moreAudio = TRUE;
- threadOkToGo = TRUE;
+ moreAudio = TRUE;
+ threadOkToGo = TRUE;
}
sliderId = startTimer( 300 ); // update slider every 1/3 second
@@ -305,16 +304,16 @@ void LoopControl::startTimers() {
void LoopControl::setPaused( bool pause ) {
if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
- return;
+ return;
if ( pause ) {
- killTimers();
+ killTimers();
} else {
- // Force an update of the position
- mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
- mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
- // Just like we never stopped
- startTimers();
+ // Force an update of the position
+ mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
+ mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
+ // Just like we never stopped
+ startTimers();
}
}
@@ -323,36 +322,37 @@ void LoopControl::stop( bool willPlayAgainShortly ) {
#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
if ( !willPlayAgainShortly && disabledSuspendScreenSaver ) {
- disabledSuspendScreenSaver = FALSE;
- // Re-enable the suspend mode
- QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
+ disabledSuspendScreenSaver = FALSE;
+ // Re-enable the suspend mode
+ QCopEnvelope("QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
}
#endif
if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
- killTimers();
+ killTimers();
- audioMutex->lock();
+ audioMutex->lock();
- mediaPlayerState->curDecoder()->close();
+ mediaPlayerState->curDecoder()->close();
- if ( audioDevice ) {
- delete audioDevice;
- delete audioBuffer;
- audioDevice = 0;
- audioBuffer = 0;
- }
-
- audioMutex->unlock();
+ if ( audioDevice ) {
+ delete audioDevice;
+ delete audioBuffer;
+ audioDevice = 0;
+ audioBuffer = 0;
+ }
+ audioMutex->unlock();
}
+ audioSampleCounter=0;
+ current_frame=0;
+ total_audio_samples=0;
}
bool LoopControl::init( const QString& filename ) {
stop();
-
audioMutex->lock();
fileName = filename;
@@ -361,7 +361,7 @@ bool LoopControl::init( const QString& filename ) {
qDebug( "Using the %s decoder", mediaPlayerState->curDecoder()->pluginName() );
- // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin
+ // ### Hack to use libmpeg3plugin to get the number of audio samples if we are using the libmad plugin
if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename )) {
total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
@@ -370,69 +370,69 @@ bool LoopControl::init( const QString& filename ) {
}
if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
- audioMutex->unlock();
- return FALSE;
+ audioMutex->unlock();
+ return FALSE;
}
hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;
if ( hasAudioChannel ) {
- int astream = 0;
+ int astream = 0;
- if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
- channels = 2; //dont akx me why, but it needs this hack
- else
- channels = mediaPlayerState->curDecoder()->audioChannels( astream );
+ if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMpeg3Plugin") )
+ channels = 2; //dont akx me why, but it needs this hack
+ else
+ channels = mediaPlayerState->curDecoder()->audioChannels( astream );
- qDebug( "LC- channels = %d", channels );
+ qDebug( "LC- channels = %d", channels );
- if ( !total_audio_samples )
- total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
+ if ( !total_audio_samples )
+ total_audio_samples = mediaPlayerState->curDecoder()->audioSamples( astream );
- total_audio_samples += 1000;
+ total_audio_samples += 1000;
- mediaPlayerState->setLength( total_audio_samples );
+ mediaPlayerState->setLength( total_audio_samples );
- freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
- qDebug( "LC- frequency = %d", freq );
-
- audioSampleCounter = 0;
- int bits_per_sample;
- if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
- bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
- qDebug("using stupid hack");
- } else {
- bits_per_sample=0;
- }
-
- audioDevice = new AudioDevice( freq, channels, bits_per_sample);
- audioBuffer = new char[ audioDevice->bufferSize() ];
- channels = audioDevice->channels();
-
- //### must check which frequency is actually used.
- static const int size = 1;
- short int buf[size];
- long samplesRead = 0;
- mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
+ freq = mediaPlayerState->curDecoder()->audioFrequency( astream );
+ qDebug( "LC- frequency = %d", freq );
+
+ audioSampleCounter = 0;
+ int bits_per_sample;
+ if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibWavPlugin") ) {
+ bits_per_sample =(int) mediaPlayerState->curDecoder()->getTime();
+ qDebug("using stupid hack");
+ } else {
+ bits_per_sample=0;
+ }
+
+ audioDevice = new AudioDevice( freq, channels, bits_per_sample);
+ audioBuffer = new char[ audioDevice->bufferSize() ];
+ channels = audioDevice->channels();
+
+ //### must check which frequency is actually used.
+ static const int size = 1;
+ short int buf[size];
+ long samplesRead = 0;
+ mediaPlayerState->curDecoder()->audioReadSamples( buf, channels, size, samplesRead, stream );
}
if ( hasVideoChannel ) {
- total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
+ total_video_frames = mediaPlayerState->curDecoder()->videoFrames( stream );
- mediaPlayerState->setLength( total_video_frames );
+ mediaPlayerState->setLength( total_video_frames );
- framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
- DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
+ framerate = mediaPlayerState->curDecoder()->videoFrameRate( stream );
+ DecodeLoopDebug(( "Frame rate %g total %ld", framerate, total_video_frames ));
- if ( framerate <= 1.0 ) {
- DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
- framerate = 25;
- }
+ if ( framerate <= 1.0 ) {
+ DecodeLoopDebug(( "Crazy frame rate, resetting to sensible" ));
+ framerate = 25;
+ }
- if ( total_video_frames == 1 ) {
- DecodeLoopDebug(( "Cannot seek to frame" ));
- }
+ if ( total_video_frames == 1 ) {
+ DecodeLoopDebug(( "Cannot seek to frame" ));
+ }
}
@@ -450,13 +450,15 @@ bool LoopControl::init( const QString& filename ) {
void LoopControl::play() {
qDebug("LC- play");
+ mediaPlayerState->setPosition( 0); //uglyhack
+
#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
if ( !disabledSuspendScreenSaver || previousSuspendMode != hasVideoChannel ) {
- disabledSuspendScreenSaver = TRUE;
- previousSuspendMode = hasVideoChannel;
- // Stop the screen from blanking and power saving state
- QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
- << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
+ disabledSuspendScreenSaver = TRUE;
+ previousSuspendMode = hasVideoChannel;
+ // Stop the screen from blanking and power saving state
+ QCopEnvelope("QPE/System", "setScreenSaverMode(int)" )
+ << ( hasVideoChannel ? QPEApplication::Disable : QPEApplication::DisableSuspend );
}
#endif
@@ -467,14 +469,14 @@ void LoopControl::play() {
void LoopControl::setMute( bool on ) {
if ( on != isMuted ) {
- isMuted = on;
- if ( !on ) {
- // Force an update of the position
- mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
- mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
- // Resume playing audio
- moreAudio = TRUE;
- }
+ isMuted = on;
+ if ( !on ) {
+ // Force an update of the position
+ mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
+ mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
+ // Resume playing audio
+ moreAudio = TRUE;
+ }
}
}