COMMIT_MESSAGE

 1new API in MediaPlayer for mute control and mute control in MediaPlayerPrivateGStreamer
 2

WebCore/ChangeLog

 12009-12-20 Philippe Normand <pnormand@igalia.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 [GTK] set playbin mute property depending on volume value
 6 https://bugs.webkit.org/show_bug.cgi?id=31586
 7
 8 Mute control in MediaPlayerPrivateGStreamer
 9
 10 * platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp:
 11 (WebCore::mediaPlayerPrivateVolumeChangedCallback):
 12 (WebCore::notifyVolumeIdleCallback):
 13 (WebCore::mediaPlayerPrivateMuteChangedCallback):
 14 (WebCore::notifyMuteIdleCallback):
 15 (WebCore::MediaPlayerPrivate::MediaPlayerPrivate):
 16 (WebCore::MediaPlayerPrivate::~MediaPlayerPrivate):
 17 (WebCore::MediaPlayerPrivate::setVolume):
 18 (WebCore::MediaPlayerPrivate::volumeChangedCallback):
 19 (WebCore::MediaPlayerPrivate::volumeChanged):
 20 (WebCore::MediaPlayerPrivate::supportsMuting):
 21 (WebCore::MediaPlayerPrivate::setMuted):
 22 (WebCore::MediaPlayerPrivate::muteChangedCallback):
 23 (WebCore::MediaPlayerPrivate::muteChanged):
 24 (WebCore::MediaPlayerPrivate::createGSTPlayBin):
 25 * platform/graphics/gtk/MediaPlayerPrivateGStreamer.h:
 26
 272009-12-20 Philippe Normand <pnormand@igalia.com>
 28
 29 Reviewed by NOBODY (OOPS!).
 30
 31 [GTK] set playbin mute property depending on volume value
 32 https://bugs.webkit.org/show_bug.cgi?id=31586
 33
 34 New API in MediaPlayer for mute control. Player implementations
 35 supporting mute control (by not setting volume to 0) should
 36 implement supportsMuting() and setMuted().
 37
 38 * html/HTMLMediaElement.cpp:
 39 (WebCore::HTMLMediaElement::setMuted):
 40 (WebCore::HTMLMediaElement::mediaPlayerVolumeChanged):
 41 (WebCore::HTMLMediaElement::mediaPlayerMuteChanged):
 42 * html/HTMLMediaElement.h:
 43 * platform/graphics/MediaPlayer.cpp:
 44 (WebCore::NullMediaPlayerPrivate::supportsMuting):
 45 (WebCore::NullMediaPlayerPrivate::setMuted):
 46 (WebCore::MediaPlayer::MediaPlayer):
 47 (WebCore::MediaPlayer::muted):
 48 (WebCore::MediaPlayer::supportsMuting):
 49 (WebCore::MediaPlayer::setMuted):
 50 (WebCore::MediaPlayer::volumeChanged):
 51 (WebCore::MediaPlayer::muteChanged):
 52 * platform/graphics/MediaPlayer.h:
 53 (WebCore::MediaPlayerClient::mediaPlayerMuteChanged):
 54 * platform/graphics/MediaPlayerPrivate.h:
 55 (WebCore::MediaPlayerPrivateInterface::supportsMuting):
 56
1572009-12-20 Andrei Popescu <andreip@google.com>
258
359 Reviewed by Adam Barth.

WebCore/html/HTMLMediaElement.cpp

@@void HTMLMediaElement::setMuted(bool muted)
12041204{
12051205 if (m_muted != muted) {
12061206 m_muted = muted;
1207  updateVolume();
 1207 if (m_player && m_player->supportsMuting()) {
 1208 m_player->setMuted(m_muted);
 1209 if (renderer())
 1210 renderer()->updateFromElement();
 1211 } else
 1212 updateVolume();
12081213 scheduleEvent(eventNames().volumechangeEvent);
12091214 }
12101215}

@@void HTMLMediaElement::mediaPlayerTimeChanged(MediaPlayer*)
14101415void HTMLMediaElement::mediaPlayerVolumeChanged(MediaPlayer*)
14111416{
14121417 beginProcessingMediaPlayerCallback();
 1418 if (m_player)
 1419 m_volume = m_player->volume();
14131420 updateVolume();
14141421 endProcessingMediaPlayerCallback();
14151422}
14161423
 1424void HTMLMediaElement::mediaPlayerMuteChanged(MediaPlayer*)
 1425{
 1426 beginProcessingMediaPlayerCallback();
 1427 if (m_player)
 1428 m_muted = m_player->muted();
 1429 if (renderer())
 1430 renderer()->updateFromElement();
 1431 endProcessingMediaPlayerCallback();
 1432}
 1433
14171434void HTMLMediaElement::mediaPlayerDurationChanged(MediaPlayer*)
14181435{
14191436 beginProcessingMediaPlayerCallback();

WebCore/html/HTMLMediaElement.h

@@private: // MediaPlayerClient
193193 virtual void mediaPlayerReadyStateChanged(MediaPlayer*);
194194 virtual void mediaPlayerTimeChanged(MediaPlayer*);
195195 virtual void mediaPlayerVolumeChanged(MediaPlayer*);
 196 virtual void mediaPlayerMuteChanged(MediaPlayer*);
196197 virtual void mediaPlayerDurationChanged(MediaPlayer*);
197198 virtual void mediaPlayerRateChanged(MediaPlayer*);
198199 virtual void mediaPlayerSawUnsupportedTracks(MediaPlayer*);

WebCore/platform/graphics/MediaPlayer.cpp

@@public:
8989
9090 virtual void setVolume(float) { }
9191
 92 virtual bool supportsMuting() { return false; }
 93 virtual void setMuted(bool) { }
 94
9295 virtual bool hasClosedCaptions() const { return false; }
9396 virtual void setClosedCaptionsVisible(bool) { };
9497

@@MediaPlayer::MediaPlayer(MediaPlayerClient* client)
198201 , m_visible(false)
199202 , m_rate(1.0f)
200203 , m_volume(1.0f)
 204 , m_muted(false)
201205 , m_preservesPitch(true)
202206 , m_autobuffer(false)
203207#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)

@@void MediaPlayer::setVolume(float volume)
378382 m_private->setVolume(volume);
379383}
380384
 385bool MediaPlayer::muted() const
 386{
 387 return m_muted;
 388}
 389
 390bool MediaPlayer::supportsMuting()
 391{
 392 return m_private->supportsMuting();
 393}
 394
 395void MediaPlayer::setMuted(bool muted)
 396{
 397 m_muted = muted;
 398 m_private->setMuted(muted);
 399}
 400
381401bool MediaPlayer::hasClosedCaptions() const
382402{
383403 return m_private->hasClosedCaptions();

@@void MediaPlayer::readyStateChanged()
561581 m_mediaPlayerClient->mediaPlayerReadyStateChanged(this);
562582}
563583
564 void MediaPlayer::volumeChanged()
 584void MediaPlayer::volumeChanged(float newVolume)
565585{
 586 m_volume = newVolume;
566587 if (m_mediaPlayerClient)
567588 m_mediaPlayerClient->mediaPlayerVolumeChanged(this);
568589}
569590
 591void MediaPlayer::muteChanged(bool newMuted)
 592{
 593 m_muted = newMuted;
 594 if (m_mediaPlayerClient)
 595 m_mediaPlayerClient->mediaPlayerMuteChanged(this);
 596}
 597
570598void MediaPlayer::timeChanged()
571599{
572600 if (m_mediaPlayerClient)

WebCore/platform/graphics/MediaPlayer.h

@@public:
8181 // the ready state has changed
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*) { }
8686
 87 // the mute state has changed
 88 virtual void mediaPlayerMuteChanged(MediaPlayer*) { }
 89
8790 // time has jumped, eg. not as a result of normal playback
8891 virtual void mediaPlayerTimeChanged(MediaPlayer*) { }
8992

@@public:
181184 float volume() const;
182185 void setVolume(float);
183186
 187 bool supportsMuting();
 188 bool muted() const;
 189 void setMuted(bool);
 190
184191 bool hasClosedCaptions() const;
185192 void setClosedCaptionsVisible(bool closedCaptionsVisible);
186193

@@public:
203210
204211 void networkStateChanged();
205212 void readyStateChanged();
206  void volumeChanged();
 213 void volumeChanged(float);
 214 void muteChanged(bool);
207215 void timeChanged();
208216 void sizeChanged();
209217 void rateChanged();

@@private:
243251 bool m_visible;
244252 float m_rate;
245253 float m_volume;
 254 bool m_muted;
246255 bool m_preservesPitch;
247256 bool m_autobuffer;
248257#if ENABLE(PLUGIN_PROXY_FOR_VIDEO)

WebCore/platform/graphics/MediaPlayerPrivate.h

@@public:
7676
7777 virtual void setVolume(float) = 0;
7878
 79 virtual bool supportsMuting() { return false; }
 80 virtual void setMuted(bool) = 0;
 81
7982 virtual bool hasClosedCaptions() const { return false; }
8083 virtual void setClosedCaptionsVisible(bool) { }
8184

WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.cpp

@@gboolean mediaPlayerPrivateMessageCallback(GstBus* bus, GstMessage* message, gpo
105105
106106void mediaPlayerPrivateVolumeChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
107107{
 108 // This is called when playbin receives the notify::volume signal.
108109 MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
109110 mp->volumeChanged();
110111}
111112
112 gboolean notifyVolumeIdleCallback(MediaPlayer* mp)
 113gboolean notifyVolumeIdleCallback(gpointer data)
113114{
114  mp->volumeChanged();
 115 MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
 116 mp->volumeChangedCallback();
 117 return FALSE;
 118}
 119
 120void mediaPlayerPrivateMuteChangedCallback(GObject *element, GParamSpec *pspec, gpointer data)
 121{
 122 // This is called when playbin receives the notify::mute signal.
 123 MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
 124 mp->muteChanged();
 125}
 126
 127gboolean notifyMuteIdleCallback(gpointer data)
 128{
 129 MediaPlayerPrivate* mp = reinterpret_cast<MediaPlayerPrivate*>(data);
 130 mp->muteChangedCallback();
115131 return FALSE;
116132}
117133

@@MediaPlayerPrivate::MediaPlayerPrivate(MediaPlayer* player)
211227 , m_seeking(false)
212228 , m_errorOccured(false)
213229 , m_volumeIdleId(-1)
 230 , m_muteIdleId(-1)
214231{
215232 doGstInit();
216233}

@@MediaPlayerPrivate::~MediaPlayerPrivate()
222239 m_volumeIdleId = -1;
223240 }
224241
 242 if (m_muteIdleId) {
 243 g_source_remove(m_muteIdleId);
 244 m_muteIdleId = -1;
 245 }
 246
225247 if (m_buffer)
226248 gst_buffer_unref(m_buffer);
227249 m_buffer = 0;

@@void MediaPlayerPrivate::setVolume(float volume)
429451 if (!m_playBin)
430452 return;
431453
432  g_object_set(G_OBJECT(m_playBin), "volume", static_cast<double>(volume), NULL);
 454 g_object_set(m_playBin, "volume", static_cast<double>(volume), NULL);
 455}
 456
 457void MediaPlayerPrivate::volumeChangedCallback()
 458{
 459 double volume;
 460 g_object_get(m_playBin, "volume", &volume, NULL);
 461 m_player->volumeChanged(static_cast<float>(volume));
433462}
434463
435464void MediaPlayerPrivate::volumeChanged()

@@void MediaPlayerPrivate::volumeChanged()
438467 g_source_remove(m_volumeIdleId);
439468 m_volumeIdleId = -1;
440469 }
441  m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, m_player);
 470 m_volumeIdleId = g_idle_add((GSourceFunc) notifyVolumeIdleCallback, this);
442471}
443472
444 
445473void MediaPlayerPrivate::setRate(float rate)
446474{
447475 GstState state;

@@void MediaPlayerPrivate::durationChanged()
711739 m_player->durationChanged();
712740}
713741
 742bool MediaPlayerPrivate::supportsMuting()
 743{
 744 return true;
 745}
 746
 747void MediaPlayerPrivate::setMuted(bool muted)
 748{
 749 if (!m_playBin)
 750 return;
 751
 752 g_object_set(m_playBin, "mute", muted, NULL);
 753}
 754
 755void MediaPlayerPrivate::muteChangedCallback()
 756{
 757 gboolean muted;
 758 g_object_get(m_playBin, "mute", &muted, NULL);
 759 m_player->muteChanged(static_cast<bool>(muted));
 760}
 761
 762void MediaPlayerPrivate::muteChanged()
 763{
 764 if (m_muteIdleId) {
 765 g_source_remove(m_muteIdleId);
 766 m_muteIdleId = -1;
 767 }
 768
 769 m_muteIdleId = g_idle_add((GSourceFunc) notifyMuteIdleCallback, this);
 770}
 771
714772void MediaPlayerPrivate::loadingFailed(MediaPlayer::NetworkState error)
715773{
716774 m_errorOccured = true;

@@void MediaPlayerPrivate::createGSTPlayBin(String url)
925983 g_signal_connect(bus, "message", G_CALLBACK(mediaPlayerPrivateMessageCallback), this);
926984 gst_object_unref(bus);
927985
928  g_object_set(G_OBJECT(m_playBin), "uri", url.utf8().data(),
929  NULL);
 986 g_object_set(G_OBJECT(m_playBin), "uri", url.utf8().data(), NULL);
930987
931988 g_signal_connect(G_OBJECT(m_playBin), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this);
 989 g_signal_connect(m_playBin, "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);
932990
933991 m_videoSink = webkit_video_sink_new();
934992

WebCore/platform/graphics/gtk/MediaPlayerPrivateGStreamer.h

@@class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
7474 void setEndTime(float);
7575
7676 void setRate(float);
 77
7778 void setVolume(float);
7879 void volumeChanged();
 80 void volumeChangedCallback();
 81
 82 bool supportsMuting();
 83 void setMuted(bool);
 84 void muteChanged();
 85 void muteChangedCallback();
7986
8087 int dataRate() const;
8188

@@class MediaPlayerPrivate : public MediaPlayerPrivateInterface {
142149 bool m_seeking;
143150 bool m_errorOccured;
144151 guint m_volumeIdleId;
 152 guint m_muteIdleId;
145153 };
146154}
147155