prev = chain->conv;
if (!have_volume && (playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME)) {
- GstPlaySinkAudioConvert *conv =
- GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
+ g_object_get (chain->conv, "volume-element", &chain->volume, NULL);
- if (conv->volume) {
- chain->volume = conv->volume;
+ if (chain->volume) {
have_volume = TRUE;
chain->notify_volume_id =
GstElement *elem;
GstPlayAudioChain *chain;
GstStateChangeReturn ret;
- GstPlaySinkAudioConvert *conv;
chain = playsink->audiochain;
- conv = GST_PLAY_SINK_AUDIO_CONVERT_CAST (chain->conv);
/* if we have a filter, and raw-ness changed, we have to force a rebuild */
if (chain->filter && chain->chain.raw != raw)
/* Disconnect signals */
disconnect_audio_chain (chain, playsink);
+ /* Drop any existing volume handler and check again */
+ if (chain->volume) {
+ gst_object_unref (chain->volume);
+ playsink->audiochain->volume = NULL;
+ }
/* check if the sink, or something within the sink, implements the
* streamvolume interface. If it does we don't need to add a volume element. */
playsink->mute_changed = FALSE;
g_object_set (chain->conv, "use-volume", FALSE, NULL);
- } else if (conv) {
+ } else if (chain->conv) {
/* no volume, we need to add a volume element when we can */
g_object_set (chain->conv, "use-volume",
! !(playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME), NULL);
GST_DEBUG_OBJECT (playsink, "the sink has no volume property");
- if (conv->volume && (playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME)) {
- chain->volume = conv->volume;
-
- chain->notify_volume_id =
- g_signal_connect (chain->volume, "notify::volume",
- G_CALLBACK (notify_volume_cb), playsink);
+ if (playsink->flags & GST_PLAY_FLAG_SOFT_VOLUME) {
+ g_object_get (chain->conv, "volume-element", &chain->volume, NULL);
+ if (chain->volume) {
+ chain->notify_volume_id =
+ g_signal_connect (chain->volume, "notify::volume",
+ G_CALLBACK (notify_volume_cb), playsink);
- chain->notify_mute_id = g_signal_connect (chain->volume, "notify::mute",
- G_CALLBACK (notify_mute_cb), playsink);
+ chain->notify_mute_id = g_signal_connect (chain->volume, "notify::mute",
+ G_CALLBACK (notify_mute_cb), playsink);
- /* configure with the latest volume and mute */
- g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume, NULL);
- g_object_set (G_OBJECT (chain->volume), "mute", playsink->mute, NULL);
+ /* configure with the latest volume and mute */
+ g_object_set (G_OBJECT (chain->volume), "volume", playsink->volume,
+ NULL);
+ g_object_set (G_OBJECT (chain->volume), "mute", playsink->mute, NULL);
+ }
}
-
- GST_DEBUG_OBJECT (playsink, "reusing existing volume element");
}
return TRUE;
}
GST_PLAY_SINK_UNLOCK (playsink);
/* fall through */
case GST_STATE_CHANGE_READY_TO_NULL:
+ GST_PLAY_SINK_LOCK (playsink);
if (playsink->audiochain && playsink->audiochain->sink_volume) {
/* remove our links to the volume elements when they were
* provided by a sink */
gst_object_unref (playsink->videochain->ts_offset);
playsink->videochain->ts_offset = NULL;
}
+ GST_PLAY_SINK_UNLOCK (playsink);
GST_OBJECT_LOCK (playsink);
if (playsink->overlay_element)
PROP_0,
PROP_USE_CONVERTERS,
PROP_USE_VOLUME,
+ PROP_VOLUME_ELEMENT,
};
static gboolean
case PROP_USE_VOLUME:
g_value_set_boolean (value, self->use_volume);
break;
+ case PROP_VOLUME_ELEMENT:
+ g_value_set_object (value, self->volume);
+ break;
default:
break;
}
"Whether to use a volume element", FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_VOLUME_ELEMENT,
+ g_param_spec_object ("volume-element", "Volume element",
+ "Retrieve the soft-volume element used when use-volume=TRUE",
+ GST_TYPE_ELEMENT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
gst_element_class_set_static_metadata (gstelement_class,
"Player Sink Audio Converter", "Audio/Bin/Converter",
"Convenience bin for audio conversion",