Changeset 54136 in webkit


Ignore:
Timestamp:
Feb 1, 2010 8:22:39 AM (14 years ago)
Author:
Philippe Normand
Message:

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:
Location:
trunk
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r54134 r54136  
     12010-01-29  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Eric Carlson.
     4
     5        [GTK] set playbin mute property depending on volume value
     6        https://bugs.webkit.org/show_bug.cgi?id=31586
     7
     8        New API in MediaPlayer for mute control. 3 new methods are
     9        introduced:
     10
     11        - bool supportsMuting() const;
     12        - bool muted() const;
     13        - void setMuted(bool);
     14
     15        Platform MediaPlayer implementations can support it easily if the
     16        underlying sound daemon/API supports muting (eg. not only setting
     17        volume to 0) like PulseAudio for instance on Linux. At the moment
     18        the only player supporting this new API is the
     19        MediaPlayerPrivateGStreamer.
     20
     21        * html/HTMLMediaElement.cpp:
     22        (WebCore::HTMLMediaElement::setMuted):
     23        (WebCore::HTMLMediaElement::mediaPlayerVolumeChanged):
     24        (WebCore::HTMLMediaElement::mediaPlayerMuteChanged):
     25        * html/HTMLMediaElement.h:
     26        * platform/graphics/MediaPlayer.cpp:
     27        (WebCore::NullMediaPlayerPrivate::supportsMuting):
     28        (WebCore::NullMediaPlayerPrivate::setMuted):
     29        (WebCore::MediaPlayer::MediaPlayer):
     30        (WebCore::MediaPlayer::muted):
     31        (WebCore::MediaPlayer::supportsMuting):
     32        (WebCore::MediaPlayer::setMuted):
     33        (WebCore::MediaPlayer::volumeChanged):
     34        (WebCore::MediaPlayer::muteChanged):
     35        * platform/graphics/MediaPlayer.h:
     36        (WebCore::MediaPlayerClient::mediaPlayerMuteChanged):
     37        * platform/graphics/MediaPlayerPrivate.h:
     38        (WebCore::MediaPlayerPrivateInterface::supportsMuting):
     39        (WebCore::MediaPlayerPrivateInterface::setMuted):
     40        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
     41        (WebCore::mediaPlayerPrivateVolumeChangedCallback):
     42        (WebCore::notifyVolumeIdleCallback):
     43        (WebCore::mediaPlayerPrivateMuteChangedCallback):
     44        (WebCore::notifyMuteIdleCallback):
     45        (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
     46        (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
     47        (WebCore::MediaPlayerPrivate::volumeChangedCallback):
     48        (WebCore::MediaPlayerPrivate::volumeChanged):
     49        (WebCore::MediaPlayerPrivate::supportsMuting):
     50        (WebCore::MediaPlayerPrivate::setMuted):
     51        (WebCore::MediaPlayerPrivate::muteChangedCallback):
     52        (WebCore::MediaPlayerPrivate::muteChanged):
     53        (WebCore::MediaPlayerPrivate::createGSTPlayBin):
     54        * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
     55
    1562010-02-01  Henry Haverinen  <henry.haverinen@nokia.com>
    257
  • trunk/WebCore/html/HTMLMediaElement.cpp

    r53910 r54136  
    12361236    if (m_muted != muted) {
    12371237        m_muted = muted;
    1238         updateVolume();
     1238        // Avoid recursion when the player reports volume changes.
     1239        if (!processingMediaPlayerCallback()) {
     1240            if (m_player && m_player->supportsMuting()) {
     1241                m_player->setMuted(m_muted);
     1242                if (renderer())
     1243                    renderer()->updateFromElement();
     1244            } else
     1245                updateVolume();
     1246        }
    12391247        scheduleEvent(eventNames().volumechangeEvent);
    12401248    }
     
    14451453{
    14461454    beginProcessingMediaPlayerCallback();
     1455    if (m_player)
     1456        m_volume = m_player->volume();
    14471457    updateVolume();
     1458    endProcessingMediaPlayerCallback();
     1459}
     1460
     1461void HTMLMediaElement::mediaPlayerMuteChanged(MediaPlayer*)
     1462{
     1463    beginProcessingMediaPlayerCallback();
     1464    if (m_player)
     1465        setMuted(m_player->muted());
    14481466    endProcessingMediaPlayerCallback();
    14491467}
  • trunk/WebCore/html/HTMLMediaElement.h

    r53629 r54136  
    197197    virtual void mediaPlayerTimeChanged(MediaPlayer*);
    198198    virtual void mediaPlayerVolumeChanged(MediaPlayer*);
     199    virtual void mediaPlayerMuteChanged(MediaPlayer*);
    199200    virtual void mediaPlayerDurationChanged(MediaPlayer*);
    200201    virtual void mediaPlayerRateChanged(MediaPlayer*);
  • trunk/WebCore/platform/graphics/MediaPlayer.cpp

    r53910 r54136  
    8888    virtual void setVolume(float) { }
    8989
     90    virtual bool supportsMuting() const { return false; }
     91    virtual void setMuted(bool) { }
     92
    9093    virtual bool hasClosedCaptions() const { return false; }
    9194    virtual void setClosedCaptionsVisible(bool) { };
     
    194197    , m_rate(1.0f)
    195198    , m_volume(1.0f)
     199    , m_muted(false)
    196200    , m_preservesPitch(true)
    197201    , m_autobuffer(false)
     
    380384}
    381385
     386bool MediaPlayer::muted() const
     387{
     388    return m_muted;
     389}
     390
     391bool MediaPlayer::supportsMuting() const
     392{
     393    return m_private->supportsMuting();
     394}
     395
     396void MediaPlayer::setMuted(bool muted)
     397{
     398    m_muted = muted;
     399    m_private->setMuted(muted);
     400}
     401
    382402bool MediaPlayer::hasClosedCaptions() const
    383403{
     
    543563}
    544564
    545 void MediaPlayer::volumeChanged()
    546 {
     565void MediaPlayer::volumeChanged(float newVolume)
     566{
     567    m_volume = newVolume;
    547568    if (m_mediaPlayerClient)
    548569        m_mediaPlayerClient->mediaPlayerVolumeChanged(this);
    549570}
    550571
     572void MediaPlayer::muteChanged(bool newMuted)
     573{
     574    m_muted = newMuted;
     575    if (m_mediaPlayerClient)
     576        m_mediaPlayerClient->mediaPlayerMuteChanged(this);
     577}
     578
    551579void MediaPlayer::timeChanged()
    552580{
  • trunk/WebCore/platform/graphics/MediaPlayer.h

    r53625 r54136  
    8282    virtual void mediaPlayerReadyStateChanged(MediaPlayer*) { }
    8383
    84     // the volume or muted state has changed
     84    // the volume state has changed
    8585    virtual void mediaPlayerVolumeChanged(MediaPlayer*) { }
     86
     87    // the mute state has changed
     88    virtual void mediaPlayerMuteChanged(MediaPlayer*) { }
    8689
    8790    // time has jumped, eg. not as a result of normal playback
     
    178181    void setVolume(float);
    179182
     183    bool supportsMuting() const;
     184    bool muted() const;
     185    void setMuted(bool);
     186
    180187    bool hasClosedCaptions() const;
    181188    void setClosedCaptionsVisible(bool closedCaptionsVisible);
     
    198205    void networkStateChanged();
    199206    void readyStateChanged();
    200     void volumeChanged();
     207    void volumeChanged(float);
     208    void muteChanged(bool);
    201209    void timeChanged();
    202210    void sizeChanged();
     
    240248    float m_rate;
    241249    float m_volume;
     250    bool m_muted;
    242251    bool m_preservesPitch;
    243252    bool m_autobuffer;
  • trunk/WebCore/platform/graphics/MediaPlayerPrivate.h

    r53625 r54136  
    7575    virtual void setVolume(float) = 0;
    7676
     77    virtual bool supportsMuting() const { return false; }
     78    virtual void setMuted(bool) { }
     79
    7780    virtual bool hasClosedCaptions() const { return false; }   
    7881    virtual void setClosedCaptionsVisible(bool) { }
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp

    r54061 r54136  
    182182void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
    183183{
     184    // This is called when playbin receives the notify::volume signal.
    184185    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
    185186    mp->volumeChanged();
    186187}
    187188
    188 gboolean notifyVolumeIdleCallback(MediaPlayer* mp)
    189 {
    190     mp->volumeChanged();
     189gboolean notifyVolumeIdleCallback(gpointer data)
     190{
     191    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
     192    mp->volumeChangedCallback();
     193    return FALSE;
     194}
     195
     196void mediaPlayerPrivateMuteChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
     197{
     198    // This is called when playbin receives the notify::mute signal.
     199    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
     200    mp->muteChanged();
     201}
     202
     203gboolean notifyMuteIdleCallback(gpointer data)
     204{
     205    MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
     206    mp->muteChangedCallback();
    191207    return FALSE;
    192208}
     
    292308    , m_playbackRate(1)
    293309    , m_errorOccured(false)
    294     , m_volumeIdleId(-1)
     310    , m_volumeIdleId(0)
    295311    , m_mediaDuration(0.0)
     312    , m_muteIdleId(0)
    296313{
    297314    doGstInit();
     
    302319    if (m_volumeIdleId) {
    303320        g_source_remove(m_volumeIdleId);
    304         m_volumeIdleId = -1;
     321        m_volumeIdleId = 0;
     322    }
     323
     324    if (m_muteIdleId) {
     325        g_source_remove(m_muteIdleId);
     326        m_muteIdleId = 0;
    305327    }
    306328
     
    533555}
    534556
     557void MediaPlayerPrivate::volumeChangedCallback()
     558{
     559    double volume;
     560    g_object_get(m_playBin, "volume", &volume, NULL);
     561    m_player->volumeChanged(static_cast<float>(volume));
     562}
     563
    535564void MediaPlayerPrivate::volumeChanged()
    536565{
    537     if (m_volumeIdleId) {
     566    if (m_volumeIdleId)
    538567        g_source_remove(m_volumeIdleId);
    539         m_volumeIdleId = -1;
    540     }
    541     m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, m_player);
    542 }
    543 
     568    m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, this);
     569}
    544570
    545571void MediaPlayerPrivate::setRate(float rate)
     
    921947
    922948    m_player->durationChanged();
     949}
     950
     951bool MediaPlayerPrivate::supportsMuting() const
     952{
     953    return true;
     954}
     955
     956void MediaPlayerPrivate::setMuted(bool muted)
     957{
     958    if (!m_playBin)
     959        return;
     960
     961    g_object_set(m_playBin, "mute", muted, NULL);
     962}
     963
     964void MediaPlayerPrivate::muteChangedCallback()
     965{
     966    gboolean muted;
     967    g_object_get(m_playBin, "mute", &muted, NULL);
     968    m_player->muteChanged(static_cast<bool>(muted));
     969}
     970
     971void MediaPlayerPrivate::muteChanged()
     972{
     973    if (m_muteIdleId)
     974        g_source_remove(m_muteIdleId);
     975
     976    m_muteIdleId = g_idle_add((GSourceFunc) notifyMuteIdleCallback, this);
    923977}
    924978
     
    11411195    g_signal_connect(m_playBin, "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
    11421196    g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);
     1197    g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);
    11431198
    11441199    m_videoSink = webkit_video_sink_new();
  • trunk/WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h

    r53909 r54136  
    7777
    7878            void setRate(float);
     79
    7980            void setVolume(float);
    8081            void volumeChanged();
     82            void volumeChangedCallback();
     83
     84            bool supportsMuting() const;
     85            void setMuted(bool);
     86            void muteChanged();
     87            void muteChangedCallback();
    8188
    8289            MediaPlayer::NetworkState networkState() const;
     
    150157            guint m_volumeIdleId;
    151158            gfloat m_mediaDuration;
     159            guint m_muteIdleId;
    152160    };
    153161}
  • trunk/WebKit/chromium/ChangeLog

    r54119 r54136  
     12010-01-29  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Eric Carlson.
     4
     5        [GTK] set playbin mute property depending on volume value
     6        https://bugs.webkit.org/show_bug.cgi?id=31586
     7
     8        New API in MediaPlayer for mute control
     9
     10        * public/WebMediaPlayerClient.h:
     11        * src/WebMediaPlayerClientImpl.cpp:
     12        (WebKit::WebMediaPlayerClientImpl::volumeChanged):
     13        (WebKit::WebMediaPlayerClientImpl::muteChanged):
     14        * src/WebMediaPlayerClientImpl.h:
     15
    1162010-01-31  Kent Tamura  <tkent@chromium.org>
    217
  • trunk/WebKit/chromium/public/WebMediaPlayerClient.h

    r50690 r54136  
    4141    virtual void networkStateChanged() = 0;
    4242    virtual void readyStateChanged() = 0;
    43     virtual void volumeChanged() = 0;
     43    virtual void volumeChanged(float) = 0;
     44    virtual void muteChanged(bool) = 0;
    4445    virtual void timeChanged() = 0;
    4546    virtual void repaint() = 0;
  • trunk/WebKit/chromium/src/WebMediaPlayerClientImpl.cpp

    r50721 r54136  
    8686}
    8787
    88 void WebMediaPlayerClientImpl::volumeChanged()
    89 {
    90     ASSERT(m_mediaPlayer);
    91     m_mediaPlayer->volumeChanged();
     88void WebMediaPlayerClientImpl::volumeChanged(float newVolume)
     89{
     90    ASSERT(m_mediaPlayer);
     91    m_mediaPlayer->volumeChanged(newVolume);
     92}
     93
     94void WebMediaPlayerClientImpl::muteChanged(bool newMute)
     95{
     96    ASSERT(m_mediaPlayer);
     97    m_mediaPlayer->muteChanged(newMute);
    9298}
    9399
  • trunk/WebKit/chromium/src/WebMediaPlayerClientImpl.h

    r50721 r54136  
    5454    virtual void networkStateChanged();
    5555    virtual void readyStateChanged();
    56     virtual void volumeChanged();
     56    virtual void volumeChanged(float);
     57    virtual void muteChanged(bool);
    5758    virtual void timeChanged();
    5859    virtual void repaint();
Note: See TracChangeset for help on using the changeset viewer.