[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