summaryrefslogtreecommitdiff
path: root/pinos/server/link.c
diff options
context:
space:
mode:
Diffstat (limited to 'pinos/server/link.c')
-rw-r--r--pinos/server/link.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/pinos/server/link.c b/pinos/server/link.c
index 0bcef848..7f58addc 100644
--- a/pinos/server/link.c
+++ b/pinos/server/link.c
@@ -39,6 +39,8 @@ struct _PinosLinkPrivate
gchar *object_path;
+ gulong input_id, output_id;
+ gboolean active;
PinosPort *output;
PinosPort *input;
GBytes *possible_formats;
@@ -203,10 +205,14 @@ on_activate (PinosPort *port, gpointer user_data)
PinosLink *link = user_data;
PinosLinkPrivate *priv = link->priv;
+ if (priv->active)
+ return TRUE;
+
if (priv->input == port)
pinos_port_activate (priv->output);
else
pinos_port_activate (priv->input);
+ priv->active = TRUE;
return TRUE;
}
@@ -217,10 +223,14 @@ on_deactivate (PinosPort *port, gpointer user_data)
PinosLink *link = user_data;
PinosLinkPrivate *priv = link->priv;
+ if (!priv->active)
+ return TRUE;
+
if (priv->input == port)
pinos_port_deactivate (priv->output);
else
pinos_port_deactivate (priv->input);
+ priv->active = FALSE;
return TRUE;
}
@@ -232,18 +242,20 @@ pinos_link_constructed (GObject * object)
PinosLinkPrivate *priv = link->priv;
GBytes *formats;
- pinos_port_add_send_buffer_cb (priv->output,
+ priv->output_id = pinos_port_add_send_buffer_cb (priv->output,
on_output_send,
link,
NULL);
- pinos_port_add_send_buffer_cb (priv->input,
+ priv->input_id = pinos_port_add_send_buffer_cb (priv->input,
on_input_send,
link,
NULL);
g_object_get (priv->input, "possible-formats", &formats, NULL);
g_object_set (priv->output, "possible-formats", formats, NULL);
+ g_object_get (priv->output, "format", &formats, NULL);
+ g_object_set (priv->input, "format", formats, NULL);
g_signal_connect (priv->input, "activate", (GCallback) on_activate, link);
g_signal_connect (priv->input, "deactivate", (GCallback) on_deactivate, link);
@@ -260,8 +272,19 @@ static void
pinos_link_dispose (GObject * object)
{
PinosLink *link = PINOS_LINK (object);
+ PinosLinkPrivate *priv = link->priv;
g_debug ("link %p: dispose", link);
+
+ pinos_port_remove_send_buffer_cb (priv->input, priv->input_id);
+ pinos_port_remove_send_buffer_cb (priv->output, priv->output_id);
+ if (priv->active) {
+ priv->active = FALSE;
+ pinos_port_deactivate (priv->input);
+ pinos_port_deactivate (priv->output);
+ }
+ g_clear_object (&priv->input);
+ g_clear_object (&priv->output);
link_unregister_object (link);
G_OBJECT_CLASS (pinos_link_parent_class)->dispose (object);