{
PROP_0,
PROP_MUTE,
- PROP_VOLUME
+ PROP_VOLUME,
+ PROP_VOLUME_FULL_RANGE
};
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
DEFAULT_PROP_MUTE,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
- /* The volume factor is a range from 0.0 to G_MAXDOUBLE.
- * The choice of G_MAXDOUBLE is somewhat arbitrary,
- * but it should be *very* inclusive, e.g. gain of +48 dB is very reasonable.
+ /**
+ * GstVolume:volume-full-range:
+ *
+ * The volume-full-range factor is a range from 0.0 to G_MAXDOUBLE so
+ * it is *very* inclusive, e.g. gain of +48 dB is very reasonable. This
+ * property allows setting higher value than the #GstVolume:volume property.
+ *
+ * Since: 1.24
*/
+ /* This property has been exposed as another property to keep the backward compatibility
+ * when using #GstDirectControlBinding with GstDirectControlBinding:absolute set to FALSE. */
+ g_object_class_install_property (gobject_class, PROP_VOLUME_FULL_RANGE,
+ g_param_spec_double ("volume-full-range", "Volume",
+ "volume factor with a full range of values, 1.0=100%", 0.0,
+ G_MAXDOUBLE, DEFAULT_PROP_VOLUME,
+ G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_property (gobject_class, PROP_VOLUME,
g_param_spec_double ("volume", "Volume", "volume factor, 1.0=100%",
- 0.0, G_MAXDOUBLE, DEFAULT_PROP_VOLUME,
+ 0.0, 10.0, DEFAULT_PROP_VOLUME,
G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
gst_element_class_set_static_metadata (element_class, "Volume",
self->volume = g_value_get_double (value);
GST_OBJECT_UNLOCK (self);
break;
+ case PROP_VOLUME_FULL_RANGE:
+ GST_OBJECT_LOCK (self);
+ self->volume = g_value_get_double (value);
+ GST_OBJECT_UNLOCK (self);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
GST_OBJECT_UNLOCK (self);
break;
case PROP_VOLUME:
+ GST_OBJECT_LOCK (self);
+ if (self->volume > 10.0) {
+ GST_WARNING_OBJECT (object,
+ "Volume is greater than its max value 10.0, reporting as 10.0");
+ g_value_set_double (value, 10.0);
+ } else {
+ g_value_set_double (value, self->volume);
+ }
+ GST_OBJECT_UNLOCK (self);
+ break;
+ case PROP_VOLUME_FULL_RANGE:
GST_OBJECT_LOCK (self);
g_value_set_double (value, self->volume);
GST_OBJECT_UNLOCK (self);
volume = setup_volume ();
// Maximal volume that is supported by the fixed point multiplication.
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
volume = setup_volume ();
// No longer using fixed point multiplication.
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
volume = setup_volume ();
// No longer using fixed point multiplication.
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
write_unaligned_u24 (in + 9, in_32[3]);
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
write_unaligned_u24 (in + 9, in_32[3]);
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
write_unaligned_u24 (in + 9, in_32[3]);
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 4095.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 4095.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
write_unaligned_u24 (in + 9, in_32[3]);
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 4096.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 4096.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
write_unaligned_u24 (in + 9, in_32[3]);
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 15.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 15.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", 16.0, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", 16.0, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");
GstMapInfo map;
volume = setup_volume ();
- g_object_set (G_OBJECT (volume), "volume", G_MAXDOUBLE, NULL);
+ g_object_set (G_OBJECT (volume), "volume-full-range", G_MAXDOUBLE, NULL);
fail_unless (gst_element_set_state (volume, GST_STATE_PLAYING) ==
GST_STATE_CHANGE_SUCCESS, "could not set to playing");