[pulseaudio-discuss] [PATCH 14/21] port-node: Introduce pa_port_node

David Henningsson david.henningsson at canonical.com
Wed Jun 19 21:22:10 PDT 2013

On 06/19/2013 08:11 PM, Tanu Kaskinen wrote:
> On Wed, 2013-06-19 at 19:50 +0200, David Henningsson wrote:
>> On 06/19/2013 05:40 PM, Tanu Kaskinen wrote:
>>> pa_port_node takes care of things that are common to all port nodes.
>>> The port device class is used in the node name for some extra
>>> user-friendliness. The goal is to avoid the long and cryptic names
>>> that are currently generated for sinks, sources and cards.
>> I'm not following. Why do we need extra pa_port_node and pa_sink_node
>> objects? Why don't we just have a pa_node pointer (or even embedded
>> struct, if that makes sense) in pa_device_port / pa_sink instead?
> pa_node will probably have some callbacks, at least for activating the
> node. I expect that e.g. pa_port_node would have a common implementation
> for activating ports. There may or may not be need for further
> specializing the activation code by adding an activation callback also
> to pa_port_node. This is largely speculation, however, because this
> hasn't been fully designed yet.

Hmm, I'm still not seeing why all types of specialization and callbacks 
can't just be handled by code taking just a node pointer, like:

/* In device-port.c */

void activate_node_cb(pa_node *n)
    pa_device_port *p = n->userdata;

    /* Do some specialized node related stuff here */


If necessary, this method can also call p's callbacks if you need to 
something differently for alsa and bt (although it would be more elegant 
if such code was inside activate_port() rather than activate_node_cb).

> If you think pa_port_node is bad, we
> could try going without it until we actually need it.

At this point the struct looks very superfluous to me.

>> If every sink, source and port have exactly one node, that seems to be
>> the logical object model. Or can sinks, sources and ports have more than
>> one node attached to them?
> I don't think it's likely that we would some day need one port or sink
> to have multiple nodes - we certainly don't need it today. It's entirely
> possible that a port or a sink could have zero nodes, however (or at
> least it's possible for sinks - e.g. bluetooth sinks don't have nodes,
> and neither do alsa sinks if ports are present).

Ok, then the logical object model to me seems to have a pa_node pointer 
in pa_device_port and pa_sink. That also simplifies code because you 
don't have to do anything in the alsa/jack/bluetooth backends - just 
initialize the node in e g pa_sink_new and/or pa_sink_put.

David Henningsson, Canonical Ltd.

More information about the pulseaudio-discuss mailing list