[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/multimedia/amarok/src/engine/xine
From: Mark Kretschmann <markey () web ! de>
Date: 2006-09-19 15:42:27
Message-ID: 1158680547.861454.25224.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 586431 by markey:
This patch by Markus Kaufhold <M.Kaufhold@gmx.de> solves the following problem:
"Pause during crossfade using xine causes the next song to continue playing."
Also it provides a number of safety code improvements.
BUG: 122514
M +31 -6 xine-engine.cpp
M +3 -0 xine-engine.h
--- trunk/extragear/multimedia/amarok/src/engine/xine/xine-engine.cpp #586430:586431
@@ -35,7 +35,6 @@
#include <qapplication.h>
#include <qdir.h>
-#include <qtimer.h>
extern "C"
{
@@ -93,6 +92,7 @@
// Wait until the fader thread is done
if( s_fader ) {
m_stopFader = true;
+ s_fader->resume(); // safety call if the engine is in the pause state
s_fader->wait();
delete s_fader;
}
@@ -349,6 +349,9 @@
void
XineEngine::stop()
{
+ if( s_fader && s_fader->running() )
+ s_fader->resume(); // safety call if the engine is in the pause state
+
if ( !m_stream )
return;
if( !m_fadeOutRunning || state() == Engine::Paused )
@@ -367,14 +370,20 @@
void
XineEngine::pause()
{
- if( xine_get_param( m_stream, XINE_PARAM_SPEED ) )
+ if( xine_get_param( m_stream, XINE_PARAM_SPEED ) != XINE_SPEED_PAUSE )
{
+ if( s_fader && s_fader->running() )
+ s_fader->pause();
+
xine_set_param( m_stream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE );
xine_set_param( m_stream, XINE_PARAM_AUDIO_CLOSE_DEVICE, 1);
emit stateChanged( Engine::Paused );
} else {
+ if( s_fader && s_fader->running() )
+ s_fader->resume();
+
xine_set_param( m_stream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL );
emit stateChanged( Engine::Playing );
}
@@ -388,7 +397,7 @@
switch( xine_get_status( m_stream ) )
{
- case XINE_STATUS_PLAY: return xine_get_param( m_stream, XINE_PARAM_SPEED ) ? Engine::Playing : \
Engine::Paused; + case XINE_STATUS_PLAY: return xine_get_param( m_stream, XINE_PARAM_SPEED ) != \
XINE_SPEED_PAUSE ? Engine::Playing : Engine::Paused; case XINE_STATUS_IDLE: return Engine::Empty;
case XINE_STATUS_STOP:
default: return m_url.isEmpty() ? Engine::Empty : Engine::Idle;
@@ -991,6 +1000,7 @@
, m_port( engine->m_audioPort )
, m_post( engine->m_post )
, m_fadeLength( fadeMs )
+ , m_paused( false )
{
if( engine->makeNewStream() )
{
@@ -1029,19 +1039,23 @@
uint stepsCount = m_fadeLength < 1000 ? m_fadeLength / 10 : 100;
uint stepSizeUs = (int)( 1000.0 * (float)m_fadeLength / (float)stepsCount );
- QTime t;
- t.start();
float mix = 0.0;
+ float elapsedUs = 0.0;
while ( mix < 1.0 )
{
// sleep a constant amount of time
QThread::usleep( stepSizeUs );
+ if ( m_paused )
+ continue;
+
+ elapsedUs += stepSizeUs;
+
// get volume (amarok main * equalizer preamp)
float vol = Engine::Base::makeVolumeLogarithmic( m_engine->m_volume ) * m_engine->m_preamp;
// compute the mix factor as the percentage of time spent since fade begun
- float mix = (float)t.elapsed() / (float)m_fadeLength;
+ float mix = (elapsedUs / 1000.0) / (float)m_fadeLength;
if ( mix > 1.0 )
{
if ( m_increase )
@@ -1117,7 +1131,18 @@
deleteLater();
}
+void
+Fader::pause()
+{
+ m_paused = true;
+}
+void
+Fader::resume()
+{
+ m_paused = false;
+}
+
bool XineEngine::metaDataForUrl(const KURL &url, Engine::SimpleMetaBundle &b)
{
bool result = false;
--- trunk/extragear/multimedia/amarok/src/engine/xine/xine-engine.h #586430:586431
@@ -105,12 +105,15 @@
xine_audio_port_t *m_port;
xine_post_t *m_post;
uint m_fadeLength;
+ bool m_paused;
virtual void run();
public:
Fader( XineEngine *, uint fadeLengthMs );
~Fader();
+ void pause();
+ void resume();
};
class OutFader : public QObject, public QThread
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic