static void gst_play_sink_handle_message (GstBin * bin, GstMessage * message);
+static void notify_volume_cb (GObject * object, GParamSpec * pspec,
+ GstPlaySink * playsink);
+static void notify_mute_cb (GObject * object, GParamSpec * pspec,
+ GstPlaySink * playsink);
+
/* static guint gst_play_sink_signals[LAST_SIGNAL] = { 0 }; */
G_DEFINE_TYPE (GstPlaySink, gst_play_sink, GST_TYPE_BIN);
}
static void
+disconnect_chain (GstPlayAudioChain * chain, GstPlaySink * playsink)
+{
+ if (chain) {
+ if (chain->volume)
+ g_signal_handlers_disconnect_by_func (chain->volume, notify_volume_cb,
+ playsink);
+ if (chain->mute)
+ g_signal_handlers_disconnect_by_func (chain->mute, notify_mute_cb,
+ playsink);
+ }
+}
+
+static void
free_chain (GstPlayChain * chain)
{
if (chain) {
if (!raw) {
GST_LOG_OBJECT (playsink, "non-raw format, can't do soft volume control");
- if (chain->volume)
- g_signal_handlers_disconnect_by_func (chain->volume, notify_volume_cb,
- playsink);
- if (chain->mute)
- g_signal_handlers_disconnect_by_func (chain->mute, notify_mute_cb,
- playsink);
-
+ disconnect_chain (chain, playsink);
chain->volume = NULL;
chain->mute = NULL;
} else {
}
add_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
activate_chain (GST_PLAY_CHAIN (playsink->audiochain), FALSE);
+ disconnect_chain (playsink->audiochain, playsink);
playsink->audiochain->volume = NULL;
playsink->audiochain->mute = NULL;
free_chain ((GstPlayChain *) playsink->audiochain);
playsink->audio_tee_asrc = NULL;
}
if (playsink->audiochain->sink_volume) {
+ disconnect_chain (playsink->audiochain, playsink);
playsink->audiochain->volume = NULL;
playsink->audiochain->mute = NULL;
}
if (playsink->audiochain && playsink->audiochain->sink_volume) {
/* remove our links to the mute and volume elements when they were
* provided by a sink */
+ disconnect_chain (playsink->audiochain, playsink);
playsink->audiochain->volume = NULL;
playsink->audiochain->mute = NULL;
}