WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
NEW
199559
[GStreamer] Ensure that “volume = foo; assert(volume == foo)” always succeeds
https://bugs.webkit.org/show_bug.cgi?id=199559
Summary
[GStreamer] Ensure that “volume = foo; assert(volume == foo)” always succeeds
Charlie Turner
Reported
2019-07-07 02:58:49 PDT
See
https://bugs.webkit.org/show_bug.cgi?id=199505
. It would be nice if for any media element E, E.volume = x does not undergo and transformations that cannot be reversed when reading the volume back. Currently in the pulseaudio backend, this is not the case due to the following PA code, // converting to PA integer volume code uint32_t pa_sw_volume_from_linear(double v) { if (v <= 0.0) return PA_VOLUME_MUTED; /* * We use a cubic mapping here, as suggested and discussed here: * *
http://www.robotplanet.dk/audio/audio_gui_design/
*
http://lists.linuxaudio.org/pipermail/linux-audio-dev/2009-May/thread.html#23151
* * We make sure that the conversion to linear and back yields the * same volume value! That's why we need the lround() below! */ // clamps between 0 and UINT32_MAX/2 return (uint32_t) PA_CLAMP_VOLUME((uint64_t) lround(cbrt(v) * PA_VOLUME_NORM)); } // converting back to double from PA integer volume code double pa_sw_volume_to_linear(uint32_t v) { double f; if (v <= PA_VOLUME_MUTED) return 0.0; if (v == PA_VOLUME_NORM) return 1.0; f = ((double) v / PA_VOLUME_NORM); return (f*f*f); } The lround there means it's lossy. I'm not sure how to fix that when the PA devs do not consider it a bug.
Attachments
Add attachment
proposed patch, testcase, etc.
Charlie Turner
Comment 1
2019-07-07 02:59:52 PDT
The upstream PA bug is at
https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/697
Xabier Rodríguez Calvar
Comment 2
2019-07-08 00:09:22 PDT
If PA devs don't fix this, which is unlikely, I think we should cache the volume we set somehow and use this unless we get a volume change signal from GStreamer, which would invalidate that cache.
Philippe Normand
Comment 3
2019-07-09 09:56:08 PDT
In MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange() why do we cast the value to float? m_player->volumeChanged() expects a double.
Philippe Normand
Comment 4
2019-07-09 09:58:17 PDT
Also, I wonder if we should override MediaPlayerPrivate::setVolumeDouble(double) instead of MediaPlayer::setVolume(float).
Charlie Turner
Comment 5
2019-07-10 08:42:41 PDT
(In reply to Philippe Normand from
comment #3
)
> In MediaPlayerPrivateGStreamerBase::notifyPlayerOfVolumeChange() why do we > cast the value to float? m_player->volumeChanged() expects a double.
It's old code, perhaps the MediaPlayer class changed since it was written. Regardless, it doesn't matter since the error from PA has already crept in before we start casting. Same goes for the setVolumeDouble, PA behavior still introduces this issue.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug