Skip to content

Commit

Permalink
Merge r154970 - [GStreamer] Video player sets system volume to 100%
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
calvaris authored and carlosgcampos committed Sep 8, 2013
1 parent e8aec83 commit 8e078f7
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 2 deletions.
35 changes: 35 additions & 0 deletions Source/WebCore/ChangeLog
@@ -1,3 +1,38 @@
2013-09-03 Xabier Rodriguez Calvar <calvaris@igalia.com>

[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 <calvaris@igalia.com>

Volume slider value should be 0 when audio is muted
Expand Down
10 changes: 9 additions & 1 deletion Source/WebCore/html/HTMLMediaElement.cpp
Expand Up @@ -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<double>::max())
, m_clockTimeAtLastUpdateEvent(0)
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -5073,6 +5076,11 @@ void HTMLMediaElement::mediaPlayerPlay()
play();
}

bool HTMLMediaElement::mediaPlayerPlatformVolumeConfigurationRequired() const
{
return !m_volumeInitialized;
}

bool HTMLMediaElement::mediaPlayerIsPaused() const
{
return paused();
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/html/HTMLMediaElement.h
Expand Up @@ -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;
Expand Down Expand Up @@ -638,6 +639,7 @@ class HTMLMediaElement : public HTMLElement, private MediaPlayerClient, public M
RefPtr<MediaError> m_error;

double m_volume;
bool m_volumeInitialized;
double m_lastSeekTime;

unsigned m_previousProgress;
Expand Down
2 changes: 2 additions & 0 deletions Source/WebCore/platform/graphics/MediaPlayer.h
Expand Up @@ -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; }
Expand Down Expand Up @@ -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);
Expand Down
Expand Up @@ -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();
}

Expand Down Expand Up @@ -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<double>(volume));
}

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8e078f7

Please sign in to comment.