[pulseaudio-discuss] [PATCH 9/9] device-port: Generate monitor nodes for output ports
Tanu Kaskinen
tanu.kaskinen at linux.intel.com
Thu Nov 7 18:00:14 CET 2013
Having a single monitor node for the monitor source that is associated
with multiple output ports doesn't really make sense, so I'm
generating separate nodes for each output port.
---
src/pulsecore/device-port.c | 31 +++++++++++++++++++++++++++++++
src/pulsecore/device-port.h | 1 +
src/pulsecore/node.h | 1 +
3 files changed, 33 insertions(+)
diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index 8435c1f..9f06b4b 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);
@@ -105,6 +108,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);
@@ -155,6 +161,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;
diff --git a/src/pulsecore/device-port.h b/src/pulsecore/device-port.h
index a66949e..abc7b0a 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..d5db901 100644
--- a/src/pulsecore/node.h
+++ b/src/pulsecore/node.h
@@ -31,6 +31,7 @@ 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_MONITOR, /* owner: pa_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
More information about the pulseaudio-discuss
mailing list