summaryrefslogtreecommitdiff
authorllornkcor <llornkcor>2002-04-21 03:39:22 (UTC)
committer llornkcor <llornkcor>2002-04-21 03:39:22 (UTC)
commite22eee22120129209bf91c91bd3176f977c75493 (patch) (side-by-side diff)
treed11225387cde06f3c22019f7ea6837b4a2d1ffe7
parent6818807a46b80774de328b4c3001d4bc9d788666 (diff)
downloadopie-e22eee22120129209bf91c91bd3176f977c75493.zip
opie-e22eee22120129209bf91c91bd3176f977c75493.tar.gz
opie-e22eee22120129209bf91c91bd3176f977c75493.tar.bz2
REALLY fixed when playing stream..., stopped stream
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/loopcontrol.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/loopcontrol.cpp b/core/multimedia/opieplayer/loopcontrol.cpp
index 45c2d3e..15175d0 100644
--- a/core/multimedia/opieplayer/loopcontrol.cpp
+++ b/core/multimedia/opieplayer/loopcontrol.cpp
@@ -122,256 +122,258 @@ LoopControl::LoopControl( QObject *parent, const char *name )
}
LoopControl::~LoopControl() {
stop();
}
static long prev_frame = 0;
static int currentSample = 0;
void LoopControl::timerEvent( QTimerEvent *te ) {
if ( te->timerId() == videoId )
startVideo();
if ( te->timerId() == sliderId ) {
if ( hasAudioChannel && !hasVideoChannel && moreAudio ) {
mediaPlayerState->updatePosition( audioSampleCounter );
} else if ( hasVideoChannel && moreVideo ) {
mediaPlayerState->updatePosition( current_frame );
}
}
if ( !moreVideo && !moreAudio ) {
mediaPlayerState->setPlaying( FALSE );
mediaPlayerState->setNext();
}
}
void LoopControl::setPosition( long pos ) {
audioMutex->lock();
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;
} 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;
} 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;
}
audioMutex->unlock();
}
void LoopControl::startVideo() {
if ( moreVideo ) {
if ( mediaPlayerState->curDecoder() ) {
if ( hasAudioChannel && !isMuted ) {
current_frame = long( playtime.elapsed() * framerate / 1000 );
if ( prev_frame != -1 && current_frame <= prev_frame )
return;
} 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;
}
} else {
moreVideo = FALSE;
killTimer( videoId );
}
}
}
void LoopControl::startAudio() {
//qDebug("start audio");
audioMutex->lock();
if ( moreAudio ) {
if ( !isMuted && mediaPlayerState->curDecoder() ) {
currentSample = audioSampleCounter + 1;
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;
// 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;
// }
audioDevice->write( audioBuffer, samplesRead * 2 * channels );
+ if( mediaPlayerState->isStreaming == FALSE);
+
audioSampleCounter = currentSample + samplesRead - 1;
moreAudio = readOk && (audioSampleCounter <= total_audio_samples);
} else {
moreAudio = FALSE;
}
}
audioMutex->unlock();
}
void LoopControl::killTimers() {
audioMutex->lock();
if ( hasVideoChannel )
killTimer( videoId );
killTimer( sliderId );
threadOkToGo = FALSE;
audioMutex->unlock();
}
void LoopControl::startTimers() {
audioMutex->lock();
moreVideo = FALSE;
moreAudio = FALSE;
if ( hasVideoChannel ) {
moreVideo = TRUE;
int mSecsBetweenFrames = (int)(100 / framerate); // 10% of the real value
videoId = startTimer( mSecsBetweenFrames );
}
if ( hasAudioChannel ) {
moreAudio = TRUE;
threadOkToGo = TRUE;
}
sliderId = startTimer( 300 ); // update slider every 1/3 second
audioMutex->unlock();
}
void LoopControl::setPaused( bool pause ) {
if ( !mediaPlayerState->curDecoder() || !mediaPlayerState->curDecoder()->isOpen() )
return;
if ( pause ) {
killTimers();
} else {
// Force an update of the position
mediaPlayerState->setPosition( mediaPlayerState->position() + 1 );
mediaPlayerState->setPosition( mediaPlayerState->position() - 1 );
// Just like we never stopped
startTimers();
}
}
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;
}
#endif
if ( mediaPlayerState->curDecoder() && mediaPlayerState->curDecoder()->isOpen() ) {
killTimers();
audioMutex->lock();
mediaPlayerState->curDecoder()->close();
if ( audioDevice ) {
delete audioDevice;
delete audioBuffer;
audioDevice = 0;
audioBuffer = 0;
}
audioMutex->unlock();
}
}
bool LoopControl::init( const QString& filename ) {
stop();
audioMutex->lock();
fileName = filename;
stream = 0; // only play stream 0 for now
current_frame = total_video_frames = total_audio_samples = 0;
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
if ( mediaPlayerState->curDecoder()->pluginName() == QString("LibMadPlugin") ) {
if ( mediaPlayerState->libMpeg3Decoder() && mediaPlayerState->libMpeg3Decoder()->open( filename ) ) {
total_audio_samples = mediaPlayerState->libMpeg3Decoder()->audioSamples( 0 );
mediaPlayerState->libMpeg3Decoder()->close();
}
}
if ( !mediaPlayerState->curDecoder()|| !mediaPlayerState->curDecoder()->open( filename ) ) {
audioMutex->unlock();
return FALSE;
}
hasAudioChannel = mediaPlayerState->curDecoder()->audioStreams() > 0;
hasVideoChannel = mediaPlayerState->curDecoder()->videoStreams() > 0;