From kde-commits Fri Jan 25 15:45:54 2008 From: Jens Bache-Wiig Date: Fri, 25 Jan 2008 15:45:54 +0000 To: kde-commits Subject: kdereview/phonon/gstreamer Message-Id: <1201275954.970734.15456.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=120127596314467 SVN commit 766322 by jbache: Integrate some fixes from Tiago, made testTickSignal pass. M +4 -4 audiooutput.cpp M +1 -1 audiooutput.h M +1 -1 medianode.h M +24 -15 mediaobject.cpp M +1 -0 mediaobject.h M +8 -0 videowidget.cpp --- trunk/kdereview/phonon/gstreamer/audiooutput.cpp #766321:766322 @@ -31,7 +31,7 @@ AudioOutput::AudioOutput(Backend *backend, QObject *parent) : QObject(parent) , MediaNode(backend, AudioSink) - , m_volume(1.0) + , m_volumeLevel(1.0) , m_device(0) // ### get from backend , m_volumeElement(0) , m_audioBin(0) @@ -93,7 +93,7 @@ qreal AudioOutput::volume() const { - return m_volume; + return m_volumeLevel; } int AudioOutput::outputDevice() const @@ -108,10 +108,10 @@ else if (newVolume < 0.0) newVolume = 0.0; - if (newVolume == m_volume) + if (newVolume == m_volumeLevel) return; - m_volume = newVolume; + m_volumeLevel = newVolume; if (m_volumeElement) { g_object_set(G_OBJECT(m_volumeElement), "volume", newVolume, NULL); --- trunk/kdereview/phonon/gstreamer/audiooutput.h #766321:766322 @@ -62,7 +62,7 @@ private: - qreal m_volume; + qreal m_volumeLevel; int m_device; GstElement *m_volumeElement; --- trunk/kdereview/phonon/gstreamer/medianode.h #766321:766322 @@ -44,7 +44,7 @@ VideoSource = 0x4, VideoSink = 0x8 }; - Q_DECLARE_FLAGS(NodeDescription, NodeDescriptionEnum); + Q_DECLARE_FLAGS(NodeDescription, NodeDescriptionEnum) MediaNode(Backend *backend, NodeDescription description); --- trunk/kdereview/phonon/gstreamer/mediaobject.cpp #766321:766322 @@ -34,8 +34,6 @@ #define ABOUT_TO_FINNISH_TIME 2000 -#include // for usleep - QT_BEGIN_NAMESPACE namespace Phonon @@ -69,6 +67,7 @@ , m_pipeline(0) , m_audioGraph(0) , m_videoGraph(0) + , m_previousTickTime(-1) { qRegisterMetaType("GstCaps"); @@ -432,10 +431,13 @@ case Phonon::PausedState: m_backend->logMessage("phonon state request: paused", Backend::Info, this); - if (GST_STATE(m_pipeline) == GST_STATE_PAUSED) { + if ((GST_STATE(m_pipeline) == GST_STATE_PAUSED) && (GST_STATE_PENDING(m_pipeline) == GST_STATE_PAUSED)) { changeState(Phonon::PausedState); } else if (gst_element_set_state(m_pipeline, GST_STATE_PAUSED) != GST_STATE_CHANGE_FAILURE) { m_pendingState = Phonon::PausedState; + // If pipeline was already paused, and pending state was canceled: + if (GST_STATE(m_pipeline) == GST_STATE_PAUSED) + changeState(Phonon::PausedState); } else { m_backend->logMessage("phonon state request failed", Backend::Info, this); } @@ -443,10 +445,14 @@ case Phonon::StoppedState: m_backend->logMessage("phonon state request: Stopped", Backend::Info, this); - if (GST_STATE(m_pipeline) == GST_STATE_READY) { + if ((GST_STATE(m_pipeline) == GST_STATE_READY) && (GST_STATE_PENDING(m_pipeline) == GST_STATE_READY)) { changeState(Phonon::StoppedState); } else if (gst_element_set_state(m_pipeline, GST_STATE_READY) != GST_STATE_CHANGE_FAILURE) { m_pendingState = Phonon::StoppedState; + // If pipeline was already stopped, and pending state was canceled: + if (GST_STATE(m_pipeline) == GST_STATE_READY) { + changeState(Phonon::StoppedState); + } } else { m_backend->logMessage("phonon state request failed", Backend::Info, this); } @@ -454,10 +460,13 @@ case Phonon::PlayingState: m_backend->logMessage("phonon state request: Playing", Backend::Info, this); - if (GST_STATE(m_pipeline) == GST_STATE_PLAYING) { + if ((GST_STATE(m_pipeline) == GST_STATE_PLAYING) && (GST_STATE_PENDING(m_pipeline) == GST_STATE_PLAYING)) { changeState(Phonon::PlayingState); } else if (gst_element_set_state(m_pipeline, GST_STATE_PLAYING) != GST_STATE_CHANGE_FAILURE) { m_pendingState = Phonon::PlayingState; + // If pipeline was already playing, and pending state was canceled: + if (GST_STATE(m_pipeline) == GST_STATE_PLAYING) + changeState(Phonon::PlayingState); } else { m_backend->logMessage("phonon state request failed", Backend::Info, this); } @@ -647,8 +656,6 @@ if (errorType() == FatalError) return; - stop(); - // We have to reset the state completely here, otherwise // remnants of the old pipeline can result in strangenes // such as failing duration queries etc @@ -656,8 +663,8 @@ setError(tr("Unable to flush pipeline")); } emit currentSourceChanged(m_source); + m_previousTickTime = -1; - // Go into to loading state changeState(Phonon::LoadingState); m_loading = true; @@ -823,8 +830,10 @@ qint64 currentTime = getPipelinePos(); qint64 totalTime = m_totalTime; - if (m_tickInterval > 0) + if (m_tickInterval > 0 && currentTime != m_previousTickTime) { emit tick(currentTime); + m_previousTickTime = currentTime; + } if (currentTime >= totalTime - m_prefinishMark) { if (m_prefinishMarkReachedNotEmitted) { @@ -969,8 +978,9 @@ case GST_STATE_PLAYING : m_backend->logMessage("gstreamer: pipeline state set to playing", Backend::Info, this); m_tickTimer->start(); - changeState(Phonon::PlayingState); - emitTick(); + if (m_pendingState == Phonon::PlayingState) { + changeState(Phonon::PlayingState); + } break; case GST_STATE_NULL: @@ -980,8 +990,7 @@ case GST_STATE_PAUSED : m_backend->logMessage("gstreamer: pipeline state set to paused", Backend::Info, this); - m_tickTimer->stop(); - + m_tickTimer->start(); if (state() == Phonon::LoadingState) { // If we have video, wait for setVideoCaps // otherwise we are already done. @@ -990,9 +999,9 @@ } } else { - if (m_pendingState == Phonon::PausedState) + if (m_pendingState == Phonon::PausedState) { changeState(Phonon::PausedState); - emitTick(); + } } break; --- trunk/kdereview/phonon/gstreamer/mediaobject.h #766321:766322 @@ -229,6 +229,7 @@ bool m_seekable; Phonon::ErrorType m_error; QString m_errorString; + int m_previousTickTime; GstElement *m_pipeline; GstElement *m_audioGraph; --- trunk/kdereview/phonon/gstreamer/videowidget.cpp #766321:766322 @@ -24,6 +24,14 @@ #include "videowidget.h" #include "qrgb.h" +// support old OpenGL installations (1.2) +// assume that if TEXTURE0 isn't defined, none are +#ifndef GL_TEXTURE0 +# define GL_TEXTURE0 0x84C0 +# define GL_TEXTURE1 0x84C1 +# define GL_TEXTURE2 0x84C2 +#endif + QT_BEGIN_NAMESPACE static void frameRendered()