diff -up webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.cpp.volume webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.cpp --- webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.cpp.volume 2014-02-27 09:26:25.967068707 +0100 +++ webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.cpp 2014-02-27 09:27:56.074225330 +0100 @@ -245,6 +245,7 @@ HTMLMediaElement::HTMLMediaElement(const , m_readyState(HAVE_NOTHING) , m_readyStateMaximum(HAVE_NOTHING) , m_volume(1.0f) + , m_volumeInitialized(false) , m_lastSeekTime(0) , m_previousProgressTime(numeric_limits::max()) , m_lastTimeUpdateEventWallTime(0) @@ -2665,6 +2666,7 @@ void HTMLMediaElement::setVolume(float v if (m_volume != vol) { m_volume = vol; + m_volumeInitialized = true; updateVolume(); scheduleEvent(eventNames().volumechangeEvent); } @@ -3758,7 +3760,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()) @@ -4792,6 +4795,11 @@ void HTMLMediaElement::mediaPlayerPlay() play(); } +bool HTMLMediaElement::mediaPlayerPlatformVolumeConfigurationRequired() const +{ + return !m_volumeInitialized; +} + bool HTMLMediaElement::mediaPlayerIsPaused() const { return paused(); diff -up webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.h.volume webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.h --- webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.h.volume 2014-02-27 09:26:51.671398653 +0100 +++ webkitgtk-2.0.4/Source/WebCore/html/HTMLMediaElement.h 2014-02-27 09:29:44.623618657 +0100 @@ -474,6 +474,7 @@ private: 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; @@ -606,6 +607,7 @@ private: RefPtr m_error; float m_volume; + bool m_volumeInitialized; float m_lastSeekTime; unsigned m_previousProgress; diff -up webkitgtk-2.0.4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp.volume webkitgtk-2.0.4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp --- webkitgtk-2.0.4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp.volume 2014-02-27 09:27:38.559000504 +0100 +++ webkitgtk-2.0.4/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp 2014-02-27 09:27:56.075225348 +0100 @@ -72,6 +72,7 @@ static int greatestCommonDivisor(int a, 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(); } @@ -208,6 +209,7 @@ void MediaPlayerPrivateGStreamerBase::se 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)); } @@ -479,7 +481,16 @@ void MediaPlayerPrivateGStreamerBase::se 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); diff -up webkitgtk-2.0.4/Source/WebCore/platform/graphics/MediaPlayer.h.volume webkitgtk-2.0.4/Source/WebCore/platform/graphics/MediaPlayer.h --- webkitgtk-2.0.4/Source/WebCore/platform/graphics/MediaPlayer.h.volume 2014-02-27 09:27:17.663732299 +0100 +++ webkitgtk-2.0.4/Source/WebCore/platform/graphics/MediaPlayer.h 2014-02-27 09:30:47.663427811 +0100 @@ -209,6 +209,7 @@ public: 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; } @@ -329,6 +330,7 @@ public: float volume() const; void setVolume(float); + bool platformVolumeConfigurationRequired() const { return m_mediaPlayerClient->mediaPlayerPlatformVolumeConfigurationRequired(); } bool muted() const; void setMuted(bool);