[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9

philn at webkit.org philn at webkit.org
Thu Feb 4 21:35:23 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit 8934e937ea6844fa756bc818f332eb461c50dbde
Author: philn at webkit.org <philn at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Mon Feb 1 16:22:39 2010 +0000

    2010-01-29  Philippe Normand  <pnormand at igalia.com>
    
            Reviewed by Eric Carlson.
    
            [GTK] set playbin mute property depending on volume value
            https://bugs.webkit.org/show_bug.cgi?id=31586
    
            New API in MediaPlayer for mute control. 3 new methods are
            introduced:
    
            - bool supportsMuting() const;
            - bool muted() const;
            - void setMuted(bool);
    
            Platform MediaPlayer implementations can support it easily if the
            underlying sound daemon/API supports muting (eg. not only setting
            volume to 0) like PulseAudio for instance on Linux. At the moment
            the only player supporting this new API is the
            MediaPlayerPrivateGStreamer.
    
            * html/HTMLMediaElement.cpp:
            (WebCore::HTMLMediaElement::setMuted):
            (WebCore::HTMLMediaElement::mediaPlayerVolumeChanged):
            (WebCore::HTMLMediaElement::mediaPlayerMuteChanged):
            * html/HTMLMediaElement.h:
            * platform/graphics/MediaPlayer.cpp:
            (WebCore::NullMediaPlayerPrivate::supportsMuting):
            (WebCore::NullMediaPlayerPrivate::setMuted):
            (WebCore::MediaPlayer::MediaPlayer):
            (WebCore::MediaPlayer::muted):
            (WebCore::MediaPlayer::supportsMuting):
            (WebCore::MediaPlayer::setMuted):
            (WebCore::MediaPlayer::volumeChanged):
            (WebCore::MediaPlayer::muteChanged):
            * platform/graphics/MediaPlayer.h:
            (WebCore::MediaPlayerClient::mediaPlayerMuteChanged):
            * platform/graphics/MediaPlayerPrivate.h:
            (WebCore::MediaPlayerPrivateInterface::supportsMuting):
            (WebCore::MediaPlayerPrivateInterface::setMuted):
            * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
            (WebCore::mediaPlayerPrivateVolumeChangedCallback):
            (WebCore::notifyVolumeIdleCallback):
            (WebCore::mediaPlayerPrivateMuteChangedCallback):
            (WebCore::notifyMuteIdleCallback):
            (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
            (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
            (WebCore::MediaPlayerPrivate::volumeChangedCallback):
            (WebCore::MediaPlayerPrivate::volumeChanged):
            (WebCore::MediaPlayerPrivate::supportsMuting):
            (WebCore::MediaPlayerPrivate::setMuted):
            (WebCore::MediaPlayerPrivate::muteChangedCallback):
            (WebCore::MediaPlayerPrivate::muteChanged):
            (WebCore::MediaPlayerPrivate::createGSTPlayBin):
            * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
    
    2010-01-29  Philippe Normand  <pnormand at igalia.com>
    
            Reviewed by Eric Carlson.
    
            [GTK] set playbin mute property depending on volume value
            https://bugs.webkit.org/show_bug.cgi?id=31586
    
            New API in MediaPlayer for mute control
    
            * public/WebMediaPlayerClient.h:
            * src/WebMediaPlayerClientImpl.cpp:
            (WebKit::WebMediaPlayerClientImpl::volumeChanged):
            (WebKit::WebMediaPlayerClientImpl::muteChanged):
            * src/WebMediaPlayerClientImpl.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54136 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 1f93200..c1b27f3 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,58 @@
+2010-01-29  Philippe Normand  <pnormand at igalia.com>
+
+        Reviewed by Eric Carlson.
+
+        [GTK] set playbin mute property depending on volume value
+        https://bugs.webkit.org/show_bug.cgi?id=31586
+
+        New API in MediaPlayer for mute control. 3 new methods are
+        introduced:
+
+        - bool supportsMuting() const;
+        - bool muted() const;
+        - void setMuted(bool);
+
+        Platform MediaPlayer implementations can support it easily if the
+        underlying sound daemon/API supports muting (eg. not only setting
+        volume to 0) like PulseAudio for instance on Linux. At the moment
+        the only player supporting this new API is the
+        MediaPlayerPrivateGStreamer.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::setMuted):
+        (WebCore::HTMLMediaElement::mediaPlayerVolumeChanged):
+        (WebCore::HTMLMediaElement::mediaPlayerMuteChanged):
+        * html/HTMLMediaElement.h:
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::NullMediaPlayerPrivate::supportsMuting):
+        (WebCore::NullMediaPlayerPrivate::setMuted):
+        (WebCore::MediaPlayer::MediaPlayer):
+        (WebCore::MediaPlayer::muted):
+        (WebCore::MediaPlayer::supportsMuting):
+        (WebCore::MediaPlayer::setMuted):
+        (WebCore::MediaPlayer::volumeChanged):
+        (WebCore::MediaPlayer::muteChanged):
+        * platform/graphics/MediaPlayer.h:
+        (WebCore::MediaPlayerClient::mediaPlayerMuteChanged):
+        * platform/graphics/MediaPlayerPrivate.h:
+        (WebCore::MediaPlayerPrivateInterface::supportsMuting):
+        (WebCore::MediaPlayerPrivateInterface::setMuted):
+        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::mediaPlayerPrivateVolumeChangedCallback):
+        (WebCore::notifyVolumeIdleCallback):
+        (WebCore::mediaPlayerPrivateMuteChangedCallback):
+        (WebCore::notifyMuteIdleCallback):
+        (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
+        (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
+        (WebCore::MediaPlayerPrivate::volumeChangedCallback):
+        (WebCore::MediaPlayerPrivate::volumeChanged):
+        (WebCore::MediaPlayerPrivate::supportsMuting):
+        (WebCore::MediaPlayerPrivate::setMuted):
+        (WebCore::MediaPlayerPrivate::muteChangedCallback):
+        (WebCore::MediaPlayerPrivate::muteChanged):
+        (WebCore::MediaPlayerPrivate::createGSTPlayBin):
+        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
+
 2010-02-01  Henry Haverinen  <henry.haverinen at nokia.com>
 
         Reviewed by Simon Hausmann.
diff --git a/WebCore/html/HTMLMediaElement.cpp b/WebCore/html/HTMLMediaElement.cpp
index 5cd0157..fbd88d6 100644
--- a/WebCore/html/HTMLMediaElement.cpp
+++ b/WebCore/html/HTMLMediaElement.cpp
@@ -1235,7 +1235,15 @@ void HTMLMediaElement::setMuted(bool muted)
 {
     if (m_muted != muted) {
         m_muted = muted;
-        updateVolume();
+        // Avoid recursion when the player reports volume changes.
+        if (!processingMediaPlayerCallback()) {
+            if (m_player && m_player->supportsMuting()) {
+                m_player->setMuted(m_muted);
+                if (renderer())
+                    renderer()->updateFromElement();
+            } else
+                updateVolume();
+        }
         scheduleEvent(eventNames().volumechangeEvent);
     }
 }
@@ -1444,10 +1452,20 @@ void HTMLMediaElement::mediaPlayerTimeChanged(MediaPlayer*)
 void HTMLMediaElement::mediaPlayerVolumeChanged(MediaPlayer*)
 {
     beginProcessingMediaPlayerCallback();
+    if (m_player)
+        m_volume = m_player->volume();
     updateVolume();
     endProcessingMediaPlayerCallback();
 }
 
+void HTMLMediaElement::mediaPlayerMuteChanged(MediaPlayer*)
+{
+    beginProcessingMediaPlayerCallback();
+    if (m_player)
+        setMuted(m_player->muted());
+    endProcessingMediaPlayerCallback();
+}
+
 void HTMLMediaElement::mediaPlayerDurationChanged(MediaPlayer*)
 {
     beginProcessingMediaPlayerCallback();
diff --git a/WebCore/html/HTMLMediaElement.h b/WebCore/html/HTMLMediaElement.h
index 9ee2c25..68b7ce4 100644
--- a/WebCore/html/HTMLMediaElement.h
+++ b/WebCore/html/HTMLMediaElement.h
@@ -196,6 +196,7 @@ private: // MediaPlayerClient
     virtual void mediaPlayerReadyStateChanged(MediaPlayer*);
     virtual void mediaPlayerTimeChanged(MediaPlayer*);
     virtual void mediaPlayerVolumeChanged(MediaPlayer*);
+    virtual void mediaPlayerMuteChanged(MediaPlayer*);
     virtual void mediaPlayerDurationChanged(MediaPlayer*);
     virtual void mediaPlayerRateChanged(MediaPlayer*);
     virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*);
diff --git a/WebCore/platform/graphics/MediaPlayer.cpp b/WebCore/platform/graphics/MediaPlayer.cpp
index 994c7b6..355b127 100644
--- a/WebCore/platform/graphics/MediaPlayer.cpp
+++ b/WebCore/platform/graphics/MediaPlayer.cpp
@@ -87,6 +87,9 @@ public:
 
     virtual void setVolume(float) { }
 
+    virtual bool supportsMuting() const { return false; }
+    virtual void setMuted(bool) { }
+
     virtual bool hasClosedCaptions() const { return false; }
     virtual void setClosedCaptionsVisible(bool) { };
 
@@ -193,6 +196,7 @@ MediaPlayer::MediaPlayer(MediaPlayerClient* client)
     , m_visible(false)
     , m_rate(1.0f)
     , m_volume(1.0f)
+    , m_muted(false)
     , m_preservesPitch(true)
     , m_autobuffer(false)
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
@@ -379,6 +383,22 @@ void MediaPlayer::setVolume(float volume)
     m_private->setVolume(volume);   
 }
 
+bool MediaPlayer::muted() const
+{
+    return m_muted;
+}
+
+bool MediaPlayer::supportsMuting() const
+{
+    return m_private->supportsMuting();
+}
+
+void MediaPlayer::setMuted(bool muted)
+{
+    m_muted = muted;
+    m_private->setMuted(muted);
+}
+
 bool MediaPlayer::hasClosedCaptions() const
 {
     return m_private->hasClosedCaptions();
@@ -542,12 +562,20 @@ void MediaPlayer::readyStateChanged()
         m_mediaPlayerClient->mediaPlayerReadyStateChanged(this);
 }
 
-void MediaPlayer::volumeChanged()
+void MediaPlayer::volumeChanged(float newVolume)
 {
+    m_volume = newVolume;
     if (m_mediaPlayerClient)
         m_mediaPlayerClient->mediaPlayerVolumeChanged(this);
 }
 
+void MediaPlayer::muteChanged(bool newMuted)
+{
+    m_muted = newMuted;
+    if (m_mediaPlayerClient)
+        m_mediaPlayerClient->mediaPlayerMuteChanged(this);
+}
+
 void MediaPlayer::timeChanged()
 {
     if (m_mediaPlayerClient)
diff --git a/WebCore/platform/graphics/MediaPlayer.h b/WebCore/platform/graphics/MediaPlayer.h
index fa85cfd..40ed8ae 100644
--- a/WebCore/platform/graphics/MediaPlayer.h
+++ b/WebCore/platform/graphics/MediaPlayer.h
@@ -81,9 +81,12 @@ public:
     // the ready state has changed
     virtual void mediaPlayerReadyStateChanged(MediaPlayer*) { }
 
-    // the volume or muted state has changed
+    // the volume state has changed
     virtual void mediaPlayerVolumeChanged(MediaPlayer*) { }
 
+    // the mute state has changed
+    virtual void mediaPlayerMuteChanged(MediaPlayer*) { }
+
     // time has jumped, eg. not as a result of normal playback
     virtual void mediaPlayerTimeChanged(MediaPlayer*) { }
     
@@ -177,6 +180,10 @@ public:
     float volume() const;
     void setVolume(float);
 
+    bool supportsMuting() const;
+    bool muted() const;
+    void setMuted(bool);
+
     bool hasClosedCaptions() const;
     void setClosedCaptionsVisible(bool closedCaptionsVisible);
 
@@ -197,7 +204,8 @@ public:
 
     void networkStateChanged();
     void readyStateChanged();
-    void volumeChanged();
+    void volumeChanged(float);
+    void muteChanged(bool);
     void timeChanged();
     void sizeChanged();
     void rateChanged();
@@ -239,6 +247,7 @@ private:
     bool m_visible;
     float m_rate;
     float m_volume;
+    bool m_muted;
     bool m_preservesPitch;
     bool m_autobuffer;
 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO)
diff --git a/WebCore/platform/graphics/MediaPlayerPrivate.h b/WebCore/platform/graphics/MediaPlayerPrivate.h
index 6cf12ba..3b7c4d4 100644
--- a/WebCore/platform/graphics/MediaPlayerPrivate.h
+++ b/WebCore/platform/graphics/MediaPlayerPrivate.h
@@ -74,6 +74,9 @@ public:
 
     virtual void setVolume(float) = 0;
 
+    virtual bool supportsMuting() const { return false; }
+    virtual void setMuted(bool) { }
+
     virtual bool hasClosedCaptions() const { return false; }    
     virtual void setClosedCaptionsVisible(bool) { }
 
diff --git a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
index 41f90f0..d96c1e3 100644
--- a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
+++ b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp
@@ -181,13 +181,29 @@ void mediaPlayerPrivateSourceChangedCallback(GObject *object, GParamSpec *pspec,
 
 void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
 {
+    // This is called when playbin receives the notify::volume signal.
     MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
     mp->volumeChanged();
 }
 
-gboolean notifyVolumeIdleCallback(MediaPlayer* mp)
+gboolean notifyVolumeIdleCallback(gpointer data)
 {
-    mp->volumeChanged();
+    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
+    mp->volumeChangedCallback();
+    return FALSE;
+}
+
+void mediaPlayerPrivateMuteChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
+{
+    // This is called when playbin receives the notify::mute signal.
+    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
+    mp->muteChanged();
+}
+
+gboolean notifyMuteIdleCallback(gpointer data)
+{
+    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
+    mp->muteChangedCallback();
     return FALSE;
 }
 
@@ -291,8 +307,9 @@ MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player)
     , m_seeking(false)
     , m_playbackRate(1)
     , m_errorOccured(false)
-    , m_volumeIdleId(-1)
+    , m_volumeIdleId(0)
     , m_mediaDuration(0.0)
+    , m_muteIdleId(0)
 {
     doGstInit();
 }
@@ -301,7 +318,12 @@ MediaPlayerPrivate::~MediaPlayerPrivate()
 {
     if (m_volumeIdleId) {
         g_source_remove(m_volumeIdleId);
-        m_volumeIdleId = -1;
+        m_volumeIdleId = 0;
+    }
+
+    if (m_muteIdleId) {
+        g_source_remove(m_muteIdleId);
+        m_muteIdleId = 0;
     }
 
     if (m_buffer)
@@ -532,16 +554,20 @@ void MediaPlayerPrivate::setVolume(float volume)
     g_object_set(m_playBin, "volume", static_cast<double>(volume), NULL);
 }
 
+void MediaPlayerPrivate::volumeChangedCallback()
+{
+    double volume;
+    g_object_get(m_playBin, "volume", &volume, NULL);
+    m_player->volumeChanged(static_cast<float>(volume));
+}
+
 void MediaPlayerPrivate::volumeChanged()
 {
-    if (m_volumeIdleId) {
+    if (m_volumeIdleId)
         g_source_remove(m_volumeIdleId);
-        m_volumeIdleId = -1;
-    }
-    m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, m_player);
+    m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, this);
 }
 
-
 void MediaPlayerPrivate::setRate(float rate)
 {
     // Avoid useless playback rate update.
@@ -922,6 +948,34 @@ void MediaPlayerPrivate::durationChanged()
     m_player->durationChanged();
 }
 
+bool MediaPlayerPrivate::supportsMuting() const
+{
+    return true;
+}
+
+void MediaPlayerPrivate::setMuted(bool muted)
+{
+    if (!m_playBin)
+        return;
+
+    g_object_set(m_playBin, "mute", muted, NULL);
+}
+
+void MediaPlayerPrivate::muteChangedCallback()
+{
+    gboolean muted;
+    g_object_get(m_playBin, "mute", &muted, NULL);
+    m_player->muteChanged(static_cast<bool>(muted));
+}
+
+void MediaPlayerPrivate::muteChanged()
+{
+    if (m_muteIdleId)
+        g_source_remove(m_muteIdleId);
+
+    m_muteIdleId = g_idle_add((GSourceFunc) notifyMuteIdleCallback, this);
+}
+
 void MediaPlayerPrivate::loadingFailed(MediaPlayer::NetworkState error)
 {
     m_errorOccured = true;
@@ -1140,6 +1194,7 @@ void MediaPlayerPrivate::createGSTPlayBin(String url)
 
     g_signal_connect(m_playBin, "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
     g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);
+    g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);
 
     m_videoSink = webkit_video_sink_new();
 
diff --git a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h
index ec55b29..34257ca 100644
--- a/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h
+++ b/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h
@@ -76,8 +76,15 @@ class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
             void seek(float);
 
             void setRate(float);
+
             void setVolume(float);
             void volumeChanged();
+            void volumeChangedCallback();
+
+            bool supportsMuting() const;
+            void setMuted(bool);
+            void muteChanged();
+            void muteChangedCallback();
 
             MediaPlayer::NetworkState networkState() const;
             MediaPlayer::ReadyState readyState() const;
@@ -149,6 +156,7 @@ class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
             bool m_errorOccured;
             guint m_volumeIdleId;
             gfloat m_mediaDuration;
+            guint m_muteIdleId;
     };
 }
 
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 6a8e76a..05de9a3 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,18 @@
+2010-01-29  Philippe Normand  <pnormand at igalia.com>
+
+        Reviewed by Eric Carlson.
+
+        [GTK] set playbin mute property depending on volume value
+        https://bugs.webkit.org/show_bug.cgi?id=31586
+
+        New API in MediaPlayer for mute control
+
+        * public/WebMediaPlayerClient.h:
+        * src/WebMediaPlayerClientImpl.cpp:
+        (WebKit::WebMediaPlayerClientImpl::volumeChanged):
+        (WebKit::WebMediaPlayerClientImpl::muteChanged):
+        * src/WebMediaPlayerClientImpl.h:
+
 2010-01-31  Kent Tamura  <tkent at chromium.org>
 
         Reviewed by Jeremy Orlow.
diff --git a/WebKit/chromium/public/WebMediaPlayerClient.h b/WebKit/chromium/public/WebMediaPlayerClient.h
index 558fb4a..47ce64e 100644
--- a/WebKit/chromium/public/WebMediaPlayerClient.h
+++ b/WebKit/chromium/public/WebMediaPlayerClient.h
@@ -40,7 +40,8 @@ class WebMediaPlayerClient {
 public:
     virtual void networkStateChanged() = 0;
     virtual void readyStateChanged() = 0;
-    virtual void volumeChanged() = 0;
+    virtual void volumeChanged(float) = 0;
+    virtual void muteChanged(bool) = 0;
     virtual void timeChanged() = 0;
     virtual void repaint() = 0;
     virtual void durationChanged() = 0;
diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
index c2a3535..b1f1f03 100644
--- a/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
+++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp
@@ -85,10 +85,16 @@ void WebMediaPlayerClientImpl::readyStateChanged()
     m_mediaPlayer->readyStateChanged();
 }
 
-void WebMediaPlayerClientImpl::volumeChanged()
+void WebMediaPlayerClientImpl::volumeChanged(float newVolume)
 {
     ASSERT(m_mediaPlayer);
-    m_mediaPlayer->volumeChanged();
+    m_mediaPlayer->volumeChanged(newVolume);
+}
+
+void WebMediaPlayerClientImpl::muteChanged(bool newMute)
+{
+    ASSERT(m_mediaPlayer);
+    m_mediaPlayer->muteChanged(newMute);
 }
 
 void WebMediaPlayerClientImpl::timeChanged()
diff --git a/WebKit/chromium/src/WebMediaPlayerClientImpl.h b/WebKit/chromium/src/WebMediaPlayerClientImpl.h
index 7f087d0..4adbed2 100644
--- a/WebKit/chromium/src/WebMediaPlayerClientImpl.h
+++ b/WebKit/chromium/src/WebMediaPlayerClientImpl.h
@@ -53,7 +53,8 @@ public:
     // WebMediaPlayerClient methods:
     virtual void networkStateChanged();
     virtual void readyStateChanged();
-    virtual void volumeChanged();
+    virtual void volumeChanged(float);
+    virtual void muteChanged(bool);
     virtual void timeChanged();
     virtual void repaint();
     virtual void durationChanged();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list