Changeset 73014 in webkit


Ignore:
Timestamp:
Dec 1, 2010 3:41:04 AM (13 years ago)
Author:
Philippe Normand
Message:

2010-12-01 Philippe Normand <pnormand@igalia.com>

Reviewed by Martin Robinson.

Volume control not correctly initialized
https://bugs.webkit.org/show_bug.cgi?id=36299

Replaced the mute/volume Timers with g_timeouts which are (for
now, at least) more reliable than Timers for one-shot-fire-now
actions.

Test: media/video-volume.html

  • platform/graphics/MediaPlayer.cpp: (WebCore::MediaPlayer::~MediaPlayer): Reset the raw pointers to 0 when destructing the player.
  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::mediaPlayerPrivateVolumeChangeTimeoutCallback): (WebCore::mediaPlayerPrivateMuteChangeTimeoutCallback): (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange): (WebCore::MediaPlayerPrivateGStreamer::volumeChanged): (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfMute): (WebCore::MediaPlayerPrivateGStreamer::muteChanged): (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): Set playbin2 volume/mute base on MediaPlayer related values.
  • platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
Location:
trunk/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r73012 r73014  
     12010-12-01  Philippe Normand  <pnormand@igalia.com>
     2
     3        Reviewed by Martin Robinson.
     4
     5        Volume control not correctly initialized
     6        https://bugs.webkit.org/show_bug.cgi?id=36299
     7
     8        Replaced the mute/volume Timers with g_timeouts which are (for
     9        now, at least) more reliable than Timers for one-shot-fire-now
     10        actions.
     11
     12        Test: media/video-volume.html
     13
     14        * platform/graphics/MediaPlayer.cpp:
     15        (WebCore::MediaPlayer::~MediaPlayer): Reset the raw pointers to 0
     16        when destructing the player.
     17        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
     18        (WebCore::mediaPlayerPrivateVolumeChangeTimeoutCallback):
     19        (WebCore::mediaPlayerPrivateMuteChangeTimeoutCallback):
     20        (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer):
     21        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange):
     22        (WebCore::MediaPlayerPrivateGStreamer::volumeChanged):
     23        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfMute):
     24        (WebCore::MediaPlayerPrivateGStreamer::muteChanged):
     25        (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): Set
     26        playbin2 volume/mute base on MediaPlayer related values.
     27        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
     28
    1292010-12-01  Patrick Gansterer  <paroga@webkit.org>
    230
  • trunk/WebCore/platform/graphics/MediaPlayer.cpp

    r72184 r73014  
    269269MediaPlayer::~MediaPlayer()
    270270{
     271    m_mediaPlayerClient = 0;
    271272}
    272273
  • trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp

    r72793 r73014  
    178178}
    179179
     180gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
     181{
     182    // This is the callback of the timeout source created in ::volumeChanged.
     183    player->notifyPlayerOfVolumeChange();
     184    return FALSE;
     185}
     186
    180187void mediaPlayerPrivateMuteChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
    181188{
     
    183190    MediaPlayerPrivateGStreamer* mp = reinterpret_cast<MediaPlayerPrivateGStreamer*>(data);
    184191    mp->muteChanged();
     192}
     193
     194gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer* player)
     195{
     196    // This is the callback of the timeout source created in ::muteChanged.
     197    player->notifyPlayerOfMute();
     198    return FALSE;
    185199}
    186200
     
    328342        gst_element_set_state(m_playBin, GST_STATE_NULL);
    329343        gst_object_unref(GST_OBJECT(m_playBin));
    330     }
    331 
     344        m_playBin = 0;
     345    }
     346
     347    m_player = 0;
     348
     349    if (m_muteTimerHandler)
     350        g_source_remove(m_muteTimerHandler);
     351    m_muteTimerHandler = 0;
     352
     353    if (m_volumeTimerHandler)
     354        g_source_remove(m_volumeTimerHandler);
     355    m_volumeTimerHandler = 0;
    332356}
    333357
     
    585609}
    586610
    587 void MediaPlayerPrivateGStreamer::volumeChangedTimerFired(Timer<MediaPlayerPrivateGStreamer>*)
    588 {
     611void MediaPlayerPrivateGStreamer::notifyPlayerOfVolumeChange()
     612{
     613    m_volumeTimerHandler = 0;
     614
     615    if (!m_player || !m_playBin)
     616        return;
    589617    double volume;
    590618    g_object_get(m_playBin, "volume", &volume, NULL);
     
    594622void MediaPlayerPrivateGStreamer::volumeChanged()
    595623{
    596     Timer<MediaPlayerPrivateGStreamer> volumeChangedTimer(this, &MediaPlayerPrivateGStreamer::volumeChangedTimerFired);
    597     volumeChangedTimer.startOneShot(0);
     624    if (m_volumeTimerHandler)
     625        g_source_remove(m_volumeTimerHandler);
     626    m_volumeTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateVolumeChangeTimeoutCallback), this);
    598627}
    599628
     
    11591188}
    11601189
    1161 void MediaPlayerPrivateGStreamer::muteChangedTimerFired(Timer<MediaPlayerPrivateGStreamer>*)
    1162 {
     1190void MediaPlayerPrivateGStreamer::notifyPlayerOfMute()
     1191{
     1192    m_muteTimerHandler = 0;
     1193
     1194    if (!m_player || !m_playBin)
     1195        return;
     1196
    11631197    gboolean muted;
    11641198    g_object_get(m_playBin, "mute", &muted, NULL);
     
    11681202void MediaPlayerPrivateGStreamer::muteChanged()
    11691203{
    1170     Timer<MediaPlayerPrivateGStreamer> muteChangedTimer(this, &MediaPlayerPrivateGStreamer::muteChangedTimerFired);
    1171     muteChangedTimer.startOneShot(0);
     1204    if (m_muteTimerHandler)
     1205        g_source_remove(m_muteTimerHandler);
     1206    m_muteTimerHandler = g_timeout_add(0, reinterpret_cast<GSourceFunc>(mediaPlayerPrivateMuteChangeTimeoutCallback), this);
    11721207}
    11731208
     
    14021437    gst_object_unref(bus);
    14031438
     1439    g_object_set(m_playBin, "mute", m_player->muted(), "volume", m_player->volume(), NULL);
     1440
    14041441    g_signal_connect(m_playBin, "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
    14051442    g_signal_connect(m_playBin, "notify::source", G_CALLBACK(mediaPlayerPrivateSourceChangedCallback), this);
  • trunk/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h

    r68632 r73014  
    4444class IntRect;
    4545class GStreamerGWorld;
     46class MediaPlayerPrivateGStreamer;
    4647
    4748gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpointer data);
     
    4950void mediaPlayerPrivateMuteChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
    5051void mediaPlayerPrivateSourceChangedCallback(GObject* element, GParamSpec* pspec, gpointer data);
     52gboolean mediaPlayerPrivateVolumeChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
     53gboolean mediaPlayerPrivateMuteChangeTimeoutCallback(MediaPlayerPrivateGStreamer*);
    5154
    5255class MediaPlayerPrivateGStreamer : public MediaPlayerPrivateInterface {
     
    8285            void setVolume(float);
    8386            void volumeChanged();
    84             void volumeChangedTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
     87            void notifyPlayerOfVolumeChange();
    8588
    8689            bool supportsMuting() const;
    8790            void setMuted(bool);
    8891            void muteChanged();
    89             void muteChangedTimerFired(Timer<MediaPlayerPrivateGStreamer>*);
     92            void notifyPlayerOfMute();
    9093
    9194            void setPreload(MediaPlayer::Preload);
     
    177180            bool m_mediaDurationKnown;
    178181            RefPtr<GStreamerGWorld> m_gstGWorld;
     182            guint m_volumeTimerHandler;
     183            guint m_muteTimerHandler;
    179184    };
    180185}
Note: See TracChangeset for help on using the changeset viewer.