diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog index 0d5d2d8586fc..01997ea11d3d 100644 --- a/Source/WebCore/ChangeLog +++ b/Source/WebCore/ChangeLog @@ -1,3 +1,38 @@ +2013-09-03 Xabier Rodriguez Calvar + + [GStreamer] Video player sets system volume to 100% + https://bugs.webkit.org/show_bug.cgi?id=118974 + + Reviewed by Philippe Normand. + + In order to preserve the system volume we need to keep track of + the volume being initialized in the HTMLMediaElement and then just + setting the volume to the sink when initializing the pipeline if + that volume was changed before. + + * html/HTMLMediaElement.cpp: + (WebCore::HTMLMediaElement::HTMLMediaElement): Initialized + attribute to false. + (WebCore::HTMLMediaElement::setVolume): Set the attribute to true + when volume is changed. + (WebCore::HTMLMediaElement::updateVolume): Set the volume only if + volume was initialized. + (WebCore::HTMLMediaElement::mediaPlayerPlatformVolumeConfigurationRequired): + Platform volume configuration is required only if volume was not + initialized before. + * html/HTMLMediaElement.h: Added attribute and interface method. + * platform/graphics/MediaPlayer.h: + (WebCore::MediaPlayerClient::mediaPlayerPlatformVolumeConfigurationRequired): + Declared and added default implementation for the interface method. + (WebCore::MediaPlayer::platformVolumeConfigurationRequired): + Asked the client, meaning the HTMLMediaElement if the platform + volume configuration is required. + * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp: + (WebCore::mediaPlayerPrivateVolumeChangedCallback): Added log. + (WebCore::MediaPlayerPrivateGStreamerBase::setVolume): Added log. + (WebCore::MediaPlayerPrivateGStreamerBase::setStreamVolumeElement): + Set the volume only if not platform volume is required and added log. + 2013-09-01 Xabier Rodriguez Calvar Volume slider value should be 0 when audio is muted diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp index c8c2bffd9d76..215459f62345 100644 --- a/Source/WebCore/html/HTMLMediaElement.cpp +++ b/Source/WebCore/html/HTMLMediaElement.cpp @@ -264,6 +264,7 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* docum , m_readyState(HAVE_NOTHING) , m_readyStateMaximum(HAVE_NOTHING) , m_volume(1.0f) + , m_volumeInitialized(false) , m_lastSeekTime(0) , m_previousProgressTime(numeric_limits::max()) , m_clockTimeAtLastUpdateEvent(0) @@ -2703,6 +2704,7 @@ void HTMLMediaElement::setVolume(double vol, ExceptionCode& ec) if (m_volume != vol) { m_volume = vol; + m_volumeInitialized = true; updateVolume(); scheduleEvent(eventNames().volumechangeEvent); } @@ -3973,7 +3975,8 @@ void HTMLMediaElement::updateVolume() } m_player->setMuted(shouldMute); - m_player->setVolume(m_volume * volumeMultiplier); + if (m_volumeInitialized) + m_player->setVolume(m_volume * volumeMultiplier); } if (hasMediaControls()) @@ -5073,6 +5076,11 @@ void HTMLMediaElement::mediaPlayerPlay() play(); } +bool HTMLMediaElement::mediaPlayerPlatformVolumeConfigurationRequired() const +{ + return !m_volumeInitialized; +} + bool HTMLMediaElement::mediaPlayerIsPaused() const { return paused(); diff --git a/Source/WebCore/html/HTMLMediaElement.h b/Source/WebCore/html/HTMLMediaElement.h index 0d20d4e8e49f..0617e4e83535 100644 --- a/Source/WebCore/html/HTMLMediaElement.h +++ b/Source/WebCore/html/HTMLMediaElement.h @@ -507,6 +507,7 @@ class HTMLMediaElement : public HTMLElement, private MediaPlayerClient, public M virtual void mediaPlayerSetSize(const IntSize&) OVERRIDE; virtual void mediaPlayerPause() OVERRIDE; virtual void mediaPlayerPlay() OVERRIDE; + virtual bool mediaPlayerPlatformVolumeConfigurationRequired() const OVERRIDE; virtual bool mediaPlayerIsPaused() const OVERRIDE; virtual bool mediaPlayerIsLooping() const OVERRIDE; virtual HostWindow* mediaPlayerHostWindow() OVERRIDE; @@ -638,6 +639,7 @@ class HTMLMediaElement : public HTMLElement, private MediaPlayerClient, public M RefPtr m_error; double m_volume; + bool m_volumeInitialized; double m_lastSeekTime; unsigned m_previousProgress; diff --git a/Source/WebCore/platform/graphics/MediaPlayer.h b/Source/WebCore/platform/graphics/MediaPlayer.h index b24ab4af1711..869bd5f7a48c 100644 --- a/Source/WebCore/platform/graphics/MediaPlayer.h +++ b/Source/WebCore/platform/graphics/MediaPlayer.h @@ -214,6 +214,7 @@ class MediaPlayerClient { virtual void mediaPlayerSetSize(const IntSize&) { } virtual void mediaPlayerPause() { } virtual void mediaPlayerPlay() { } + virtual bool mediaPlayerPlatformVolumeConfigurationRequired() const { return false; } virtual bool mediaPlayerIsPaused() const { return true; } virtual bool mediaPlayerIsLooping() const { return false; } virtual HostWindow* mediaPlayerHostWindow() { return 0; } @@ -328,6 +329,7 @@ class MediaPlayer { double volume() const; void setVolume(double); + bool platformVolumeConfigurationRequired() const { return m_mediaPlayerClient->mediaPlayerPlatformVolumeConfigurationRequired(); } bool muted() const; void setMuted(bool); diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp index d9d4ba6e3099..00e95f2f78b2 100644 --- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp +++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp @@ -76,6 +76,7 @@ static int greatestCommonDivisor(int a, int b) static void mediaPlayerPrivateVolumeChangedCallback(GObject*, GParamSpec*, MediaPlayerPrivateGStreamerBase* player) { // This is called when m_volumeElement receives the notify::volume signal. + LOG_MEDIA_MESSAGE("Volume changed to: %f", player->volume()); player->volumeChanged(); } @@ -234,6 +235,7 @@ void MediaPlayerPrivateGStreamerBase::setVolume(float volume) if (!m_volumeElement) return; + LOG_MEDIA_MESSAGE("Setting volume: %f", volume); gst_stream_volume_set_volume(m_volumeElement.get(), GST_STREAM_VOLUME_FORMAT_CUBIC, static_cast(volume)); } @@ -618,7 +620,16 @@ void MediaPlayerPrivateGStreamerBase::setStreamVolumeElement(GstStreamVolume* vo ASSERT(!m_volumeElement); m_volumeElement = volume; - g_object_set(m_volumeElement.get(), "mute", m_player->muted(), "volume", m_player->volume(), NULL); + // We don't set the initial volume because we trust the sink to keep it for us. See + // https://bugs.webkit.org/show_bug.cgi?id=118974 for more information. + if (!m_player->platformVolumeConfigurationRequired()) { + LOG_MEDIA_MESSAGE("Setting stream volume to %f", m_player->volume()); + g_object_set(m_volumeElement.get(), "volume", m_player->volume(), NULL); + } else + LOG_MEDIA_MESSAGE("Not setting stream volume, trusting system one"); + + LOG_MEDIA_MESSAGE("Setting stream muted %d", m_player->muted()); + g_object_set(m_volumeElement.get(), "mute", m_player->muted(), NULL); m_volumeSignalHandler = g_signal_connect(m_volumeElement.get(), "notify::volume", G_CALLBACK(mediaPlayerPrivateVolumeChangedCallback), this); m_muteSignalHandler = g_signal_connect(m_volumeElement.get(), "notify::mute", G_CALLBACK(mediaPlayerPrivateMuteChangedCallback), this);