[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