[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/khtml/ecma
From:       Germain Garand <germain () ebooksfrance ! com>
Date:       2007-02-05 15:00:07
Message-ID: 1170687607.421694.26698.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 630494 by ggarand:

Great, my demo page for the Audio() object is now almost playable using the xine backend :)
It loops, it plays. Only thing it chokes on is a stop() synchronously followed by a play().



 M  +34 -16    kjs_audio.cpp  
 M  +6 -0      kjs_audio.h  


--- trunk/KDE/kdelibs/khtml/ecma/kjs_audio.cpp #630493:630494
@@ -230,7 +230,8 @@
 AudioQObject::AudioQObject(Audio* jObj)
   : m_jObj( jObj ),
     m_media(0), 
-    m_playCount(0)
+    m_playCount(0),
+    m_stopping(false)
 {
     // sound might be immediately available, so delay ref'ing until
     // listeners have had a chance to register.
@@ -273,36 +274,53 @@
     m_media->setStreamSeekable( true );
 
     connect(m_media, SIGNAL(needData()), this, SLOT(nextIteration()));
-    connect(m_media, SIGNAL(finished()), this, SLOT(reset()));
+    connect(m_media, SIGNAL(finished()), this, SLOT(finished()));
+    connect(m_media, SIGNAL(stateChanged(Phonon::State,Phonon::State)), 
+            this,    SLOT(slotStateChanged(Phonon::State,Phonon::State)));
+
+    m_media->setStreamSize( m_sound.size()-1 );
+    m_playCount = 1;
+    nextIteration();
 }
 
+void AudioQObject::finished()
+{
+    reset();
+    if (m_playCount > 0)
+        m_playCount--;
+    loop(m_playCount);
+}
+
 void AudioQObject::reset()
 {
     if (!m_media || m_media->state() == LoadingState) 
         return;
-    m_media->seek(0);
-    m_media->stop();
+    if (m_media->state() != StoppedState) {
+        // ### bah. it doesn't help.
+        //m_stopping = true;
+        m_media->stop();
+    }
+    //m_media->seek(0);
 }
 
-void AudioQObject::nextIteration()
+void AudioQObject::slotStateChanged(Phonon::State newstate, Phonon::State oldstate)
 {
-    if (!m_playCount) {
-        m_media->endOfData();
-        return;
+    qDebug("newstate %d oldstate %d m_stopping %d", newstate, oldstate, m_stopping); 
+    if (newstate == StoppedState && m_stopping) {
+        m_stopping = false;
+        loop(m_playCount);
     }
+}
 
-    if (m_playCount > 0)
-        m_playCount--;
-
+void AudioQObject::nextIteration()
+{
     m_media->writeData(m_sound);
+    m_media->endOfData();    
 }
 
 void AudioQObject::play()
 {
-    m_playCount = 1;
-    if (!m_media || m_media->state() == PlayingState)
-        return;
-    m_media->play();
+    loop(1);
 }
 
 void AudioQObject::stop()
@@ -314,7 +332,7 @@
 void AudioQObject::loop(int n)
 {
     m_playCount = n;
-    if (!m_media || m_media->state() == PlayingState)
+    if (!m_media || !m_playCount || m_stopping || m_media->state() == PlayingState)
         return;
     m_media->play();
 }
--- trunk/KDE/kdelibs/khtml/ecma/kjs_audio.h #630493:630494
@@ -24,6 +24,7 @@
 #include "ecma/kjs_binding.h"
 #include <kjs/object.h>
 #include <QPointer>
+#include <phonon/phononnamespace.h>
 
 #include "misc/loader.h"
 
@@ -105,6 +106,10 @@
   protected Q_SLOTS:
     void nextIteration();
     void refLoader();
+    void finished();
+    void slotStateChanged(Phonon::State newstate, Phonon::State oldstate);
+    
+  protected:
     void reset();
 
   private:
@@ -113,6 +118,7 @@
     Phonon::ByteStream*  m_media;
     QByteArray m_sound;
     int m_playCount;
+    bool m_stopping;
 
     static Phonon::AudioPath*   s_audioPath;
     static Phonon::AudioOutput* s_audioOutput;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic