[PATCH 08/23] device-port: Generate monitor nodes for output ports

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



---
 src/pulsecore/device-port.c | 31 +++++++++++++++++++++++++++++++
 src/pulsecore/device-port.h |  1 +
 src/pulsecore/node.h        |  3 ++-
 3 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index 9801e35..cf62ec3 100644
--- a/src/pulsecore/device-port.c
+++ b/src/pulsecore/device-port.c
@@ -22,7 +22,10 @@
 ***/
 
 #include "device-port.h"
+
 #include <pulsecore/card.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/i18n.h>
 
 PA_DEFINE_PUBLIC_CLASS(pa_device_port, pa_object);
 
@@ -99,6 +102,9 @@ static void device_port_free(pa_object *o) {
     pa_assert(p);
     pa_assert(pa_device_port_refcnt(p) == 0);
 
+    if (p->monitor_node)
+        pa_node_free(p->monitor_node);
+
     if (p->node)
         pa_node_free(p->node);
 
@@ -149,6 +155,31 @@ pa_device_port *pa_device_port_new(pa_core *c, pa_device_port_new_data *data, si
     p->node->owner = p;
     pa_node_put(p->node);
 
+    if (p->direction == PA_DIRECTION_OUTPUT) {
+        char *description;
+        pa_node_new_data monitor_data;
+
+        description = pa_sprintf_malloc(_("Monitor of %s"), p->node->description);
+
+        pa_node_new_data_init(&monitor_data);
+        pa_node_new_data_set_description(&monitor_data, description);
+        pa_xfree(description);
+        pa_node_new_data_set_type(&monitor_data, PA_NODE_TYPE_PORT_MONITOR);
+        pa_node_new_data_set_direction(&monitor_data, PA_DIRECTION_INPUT);
+        pa_node_new_data_set_monitor_of(&monitor_data, p->node);
+
+        p->monitor_node = pa_node_new(p->core, &monitor_data);
+        pa_node_new_data_done(&monitor_data);
+
+        if (!p->monitor_node) {
+            pa_log("Failed to create a monitor node for port %s.", p->name);
+            goto fail;
+        }
+
+        p->monitor_node->owner = p;
+        pa_node_put(p->monitor_node);
+    }
+
     return p;
 
 fail:
diff --git a/src/pulsecore/device-port.h b/src/pulsecore/device-port.h
index 6b2a677..7e580c1 100644
--- a/src/pulsecore/device-port.h
+++ b/src/pulsecore/device-port.h
@@ -55,6 +55,7 @@ struct pa_device_port {
     int64_t latency_offset;
 
     pa_node *node;
+    pa_node *monitor_node;
 
     /* .. followed by some implementation specific data */
 };
diff --git a/src/pulsecore/node.h b/src/pulsecore/node.h
index 4168533..4504c79 100644
--- a/src/pulsecore/node.h
+++ b/src/pulsecore/node.h
@@ -30,7 +30,8 @@ typedef struct pa_node pa_node;
 
 /* The node type determines what the owner pointer of pa_node points to. */
 typedef enum {
-    PA_NODE_TYPE_PORT,          /* owner: pa_port */
+    PA_NODE_TYPE_PORT,          /* owner: pa_device_port */
+    PA_NODE_TYPE_PORT_MONITOR,  /* owner: pa_device_port */
     PA_NODE_TYPE_SINK,          /* owner: pa_sink */
     PA_NODE_TYPE_SOURCE,        /* owner: pa_source */
     PA_NODE_TYPE_SINK_INPUT,    /* owner: pa_sink_input */
-- 
1.8.3.1



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux