[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