Implement routing groups and volume ramp up/down
[staging/agl-audio-plugin.git] / switch.c
index 5b77180..e3b5451 100644 (file)
--- a/switch.c
+++ b/switch.c
@@ -103,15 +103,14 @@ bool agl_switch_setup_link (struct userdata *u, agl_node *from, agl_node *to, bo
 
                                /* DEVICE DESTINATION */
                                case agl_device:
-                               /* IF THERE IS NO SOURCE : DEFAULT OUTPUT PREROUTE */
-                               /* if (!from)
-                                       return setup_device_output(u, to) != NULL;
-                               else { */
                                switch (from->implement) {
                                        /* STREAM TO DEVICE : OK */
                                        case agl_stream:
-                                               //if (!setup_default_stream2dev_link (u, from, to))
-                                               //      return false;
+                                               sink = agl_utils_get_alsa_sink (u, to->paname);
+                                               if (!sink) break;
+                                               source = agl_utils_get_null_source (u, from->nullsink);
+
+                                               from->loopnode = agl_loopnode_create (u, AGL_LOOPNODE_SINK, from->index, source->index, sink->index);
                                                break;
                                        /* DEVICE TO DEVICE : OK */
                                        case agl_device:
@@ -135,7 +134,7 @@ bool agl_switch_setup_link (struct userdata *u, agl_node *from, agl_node *to, bo
 
                /* ONLY "FROM" IS DEFINED */
                else {
-                       /* only works with a device, use default input prerouting - TODO */
+                       /* only works with a stream, use default input prerouting */
                        if (from->implement == agl_device) {
                                pa_log_debug ("default routing for a device input is not supported yet");
                                return false;
@@ -147,10 +146,9 @@ bool agl_switch_setup_link (struct userdata *u, agl_node *from, agl_node *to, bo
                                return false;
                        }
 
-                       sink = pa_utils_get_primary_alsa_sink (u);
-                       source = pa_utils_get_null_source (u, from->nullsink);
-
-                       from->loopnode = pa_loopnode_create (u, PA_LOOPNODE_SINK, from->index, source->index, sink->index);
+                       sink = agl_utils_get_primary_alsa_sink (u);
+                       source = agl_utils_get_null_source (u, from->nullsink);
+                       from->loopnode = agl_loopnode_create (u, AGL_LOOPNODE_SINK, from->index, source->index, sink->index);
                }
        }
 
@@ -165,38 +163,28 @@ bool agl_switch_teardown_link (struct userdata *u, agl_node *from, agl_node *to)
 
        pa_assert (u);
        pa_assert_se (core = u->core);
-       pa_assert (from || from->direction == agl_input);
-       pa_assert (to || to->direction == agl_output);
 
-       switch (from->implement) {
-               case agl_stream:
-               switch (to->implement) {
-                       /* STREAM TO STREAM : NOT IMPLEMENTED */
-                       case agl_stream:
-                               pa_log_debug ("routing to streams is not implemented yet");
-                               break;
-                       /* STREAM TO DEVICE : NOT OK */
-                       case agl_device:
-                               //if (!teardown_explicit_stream2dev_link (u, from, to))
-                               //      return false;
-                               break;
-                       default:
-                               pa_log ("can't teardown link: invalid sink node");
-                               return false;
-               }
-               break;
+       pa_assert (from || to);
 
-               case agl_device:
-                /* DEVICE TO STREAM OR DEVICE TO DEVICE : NOT HANDLED */ 
-                       pa_log_debug ("input device routing is not implemented yet");
-                       break;
+       /* "TO" IS DEFINED */
+       if (to) {
 
-               default:
-                       pa_log ("can't teardown link: invalid source node");
+       }
+       /* ONLY "FROM" IS DEFINED */
+       else {
+               /* only works with a stream */
+               if (from->implement == agl_device) {
+                       pa_log_debug ("default routing for a device input is not supported");
                        return false;
+               }
+               /* (the rest supposes "from->implement == agl_stream") */
+               if (from->loopnode)
+                       agl_loopnode_destroy (u, from->loopnode);
+               if (from->nullsink)
+                       agl_utils_destroy_null_sink (u, from->nullsink);
        }
 
-       pa_log_debug("link %s => %s is torn down", from->amname, to->amname);
+       //pa_log_debug("link %s => %s is torn down", from->amname, to->amname);
 
        return true;
 }