API: operate on cubic volume scale

Instead converting volume inside GJS, simplify things by making API operate on cubic volume scale.
This commit is contained in:
Rafał Dzięgiel
2021-02-24 08:42:27 +01:00
parent 6130ffa6c0
commit 86d365872a
5 changed files with 33 additions and 45 deletions

View File

@@ -36,6 +36,7 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/video/video.h> #include <gst/video/video.h>
#include <gst/video/colorbalance.h> #include <gst/video/colorbalance.h>
#include <gst/audio/streamvolume.h>
#include <gst/tag/tag.h> #include <gst/tag/tag.h>
#include <gst/pbutils/descriptions.h> #include <gst/pbutils/descriptions.h>
@@ -331,7 +332,7 @@ gst_clapper_class_init (GstClapperClass * klass)
param_specs[PROP_VOLUME] = param_specs[PROP_VOLUME] =
g_param_spec_double ("volume", "Volume", "Volume", g_param_spec_double ("volume", "Volume", "Volume",
0, 3.375, DEFAULT_VOLUME, G_PARAM_READWRITE | 0, 1.5, DEFAULT_VOLUME, G_PARAM_READWRITE |
G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS); G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
param_specs[PROP_MUTE] = param_specs[PROP_MUTE] =
@@ -656,10 +657,22 @@ gst_clapper_set_property (GObject * object, guint prop_id,
gst_clapper_set_suburi_internal, self, NULL); gst_clapper_set_suburi_internal, self, NULL);
break; break;
} }
case PROP_VOLUME: case PROP_VOLUME: {
GST_DEBUG_OBJECT (self, "Set volume=%lf", g_value_get_double (value)); GValue volume_linear = G_VALUE_INIT;
g_object_set_property (G_OBJECT (self->playbin), "volume", value); gdouble volume = g_value_get_double (value);
GST_DEBUG_OBJECT (self, "Set volume=%lf", volume);
volume = gst_stream_volume_convert_volume (
GST_STREAM_VOLUME_FORMAT_CUBIC, GST_STREAM_VOLUME_FORMAT_LINEAR, volume);
GST_DEBUG_OBJECT (self, "Converted linear volume=%lf", volume);
g_value_init (&volume_linear, G_TYPE_DOUBLE);
g_value_set_double (&volume_linear, volume);
g_object_set_property (G_OBJECT (self->playbin), "volume", &volume_linear);
g_value_unset (&volume_linear);
break; break;
}
case PROP_RATE: case PROP_RATE:
g_mutex_lock (&self->lock); g_mutex_lock (&self->lock);
self->rate = g_value_get_double (value); self->rate = g_value_get_double (value);
@@ -757,11 +770,17 @@ gst_clapper_get_property (GObject * object, guint prop_id,
g_value_take_object (value, subtitle_info); g_value_take_object (value, subtitle_info);
break; break;
} }
case PROP_VOLUME: case PROP_VOLUME: {
gdouble volume;
g_object_get_property (G_OBJECT (self->playbin), "volume", value); g_object_get_property (G_OBJECT (self->playbin), "volume", value);
GST_TRACE_OBJECT (self, "Returning volume=%lf", volume = g_value_get_double (value);
g_value_get_double (value)); volume = gst_stream_volume_convert_volume (
GST_STREAM_VOLUME_FORMAT_LINEAR, GST_STREAM_VOLUME_FORMAT_CUBIC, volume);
g_value_set_double (value, volume);
GST_TRACE_OBJECT (self, "Returning volume=%lf", volume);
break; break;
}
case PROP_RATE: case PROP_RATE:
g_mutex_lock (&self->lock); g_mutex_lock (&self->lock);
g_value_set_double (value, self->rate); g_value_set_double (value, self->rate);

5
src/controls.js vendored
View File

@@ -489,7 +489,7 @@ class ClapperControls extends Gtk.Box
const initialVolume = (settings.get_string('volume-initial') === 'custom') const initialVolume = (settings.get_string('volume-initial') === 'custom')
? settings.get_int('volume-value') / 100 ? settings.get_int('volume-value') / 100
: Misc.getCubicValue(settings.get_double('volume-last')); : settings.get_double('volume-last');
this.volumeScale.set_value(initialVolume); this.volumeScale.set_value(initialVolume);
} }
@@ -567,10 +567,9 @@ class ClapperControls extends Gtk.Box
_onVolumeScaleValueChanged(scale) _onVolumeScaleValueChanged(scale)
{ {
const volume = scale.get_value(); const volume = scale.get_value();
const linearVolume = Misc.getLinearValue(volume);
const { player } = this.get_ancestor(Gtk.Grid); const { player } = this.get_ancestor(Gtk.Grid);
player.set_volume(linearVolume); player.set_volume(volume);
/* FIXME: All of below should be placed in 'volume-changed' /* FIXME: All of below should be placed in 'volume-changed'
* event once we move to message bus API */ * event once we move to message bus API */

View File

@@ -95,21 +95,3 @@ function getFormattedTime(time, showHours)
const parsed = (hours) ? `${hours}:` : ''; const parsed = (hours) ? `${hours}:` : '';
return parsed + `${minutes}:${seconds}`; return parsed + `${minutes}:${seconds}`;
} }
function getCubicValue(linearVal)
{
return GstAudio.StreamVolume.convert_volume(
GstAudio.StreamVolumeFormat.LINEAR,
GstAudio.StreamVolumeFormat.CUBIC,
linearVal
);
}
function getLinearValue(cubicVal)
{
return GstAudio.StreamVolume.convert_volume(
GstAudio.StreamVolumeFormat.CUBIC,
GstAudio.StreamVolumeFormat.LINEAR,
cubicVal
);
}

View File

@@ -24,8 +24,6 @@ class ClapperPlayer extends PlayerBase
this.keyPressCount = 0; this.keyPressCount = 0;
this._maxVolume = Misc.getLinearValue(Misc.maxVolume);
const keyController = new Gtk.EventControllerKey(); const keyController = new Gtk.EventControllerKey();
keyController.connect('key-pressed', this._onWidgetKeyPressed.bind(this)); keyController.connect('key-pressed', this._onWidgetKeyPressed.bind(this));
keyController.connect('key-released', this._onWidgetKeyReleased.bind(this)); keyController.connect('key-released', this._onWidgetKeyReleased.bind(this));
@@ -180,17 +178,6 @@ class ClapperPlayer extends PlayerBase
this.seek_seconds(seconds); this.seek_seconds(seconds);
} }
set_volume(volume)
{
if(volume < 0)
volume = 0;
else if(volume > this._maxVolume)
volume = this._maxVolume;
super.set_volume(volume);
debug(`set player volume: ${volume}`);
}
adjust_position(isIncrease) adjust_position(isIncrease)
{ {
this.seek_done = false; this.seek_done = false;
@@ -316,7 +303,9 @@ class ClapperPlayer extends PlayerBase
} }
settings.set_string('resume-database', JSON.stringify([resumeInfo])); settings.set_string('resume-database', JSON.stringify([resumeInfo]));
} }
settings.set_double('volume-last', this.volume); const volume = this.volume;
debug(`saving last volume: ${volume}`);
settings.set_double('volume-last', volume);
clapperWidget.controls._onCloseRequest(); clapperWidget.controls._onCloseRequest();
} }

View File

@@ -530,7 +530,7 @@ class ClapperWidget extends Gtk.Grid
_onPlayerVolumeChanged(player) _onPlayerVolumeChanged(player)
{ {
const volume = player.get_volume(); const volume = player.volume;
/* FIXME: This check should not be needed, GstPlayer should not /* FIXME: This check should not be needed, GstPlayer should not
* emit 'volume-changed' with the same values, but it does. */ * emit 'volume-changed' with the same values, but it does. */
@@ -540,8 +540,7 @@ class ClapperWidget extends Gtk.Grid
/* Once above is fixed in GstPlayer, remove this var too */ /* Once above is fixed in GstPlayer, remove this var too */
this.controls.currentVolume = volume; this.controls.currentVolume = volume;
const cubicVolume = Misc.getCubicValue(volume); this.controls._updateVolumeButtonIcon(volume);
this.controls._updateVolumeButtonIcon(cubicVolume);
} }
_onStateNotify(toplevel) _onStateNotify(toplevel)