Commit 787ca51b authored by philn@webkit.org's avatar philn@webkit.org

2010-01-29 Philippe Normand <pnormand@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@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: svn://svn.chromium.org/blink/trunk@54136 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 32a80329
2010-01-29 Philippe Normand <pnormand@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@nokia.com>
Reviewed by Simon Hausmann.
......
......@@ -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();
......
......@@ -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*);
......
......@@ -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)
......
......@@ -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)
......
......@@ -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) { }
......
......@@ -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();
......
......@@ -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;
};
}
......
2010-01-29 Philippe Normand <pnormand@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@chromium.org>
Reviewed by Jeremy Orlow.
......
......@@ -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;
......
......@@ -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()
......
......@@ -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();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment