In an earlier mail[1] I proposed that the next routing patch set would implement the following things: 1) pa_core_create_edge()/pa_core_delete_edge() 2) pa_node_activate() 3) Protocol extension & client API for setting the requested routing for new streams 4) --route option for pacat 5) Infrastructure support for passing the requested routing of new nodes to routing modules 6) Policy in module-experimental-router I started working on that list, and after working for a while, I was in a situation where items 3, 4 and 5 were implemented, and it felt like a good place to stop and send out the work done so far. So, this patch set implements the --routing option for pacat. The option takes a list of node names, and the server will then do routing of the pacat stream based on that list (if the list contains multiple nodes, that sort of routing isn't supported yet, though). To make that possible, there is a pile of infrastructure work first: * We now pass the requested connections of a new node to routing modules. This is not yet utilized by any routing modules, but... * ...a fallback initial routing implementation was added to node.c that uses the same interface as the routing modules, and uses the same requested connection information that is passed to routing modules. * Fallback routing (using the default sink/source) logic for sink inputs and source outputs was removed from sink-input.c and source-output.c, since node.c takes care of that now. * I added a device pointer to pa_device_port, which makes it easier to navigate from a port to a sink or source. (Useful in the fallback routing code.) * In order to ensure that a single device pointer in pa_device_port is sufficient, it's now impossible to create card profiles that contain multiple devices that share the same port. * Nodes now have an "active" property that is used by the fallback routing code to refuse streams that try to connect to an inactive port. * Instead of setting the sink or source or the "direct_on_input" thing during stream initialization, everything that is related to routing is now done with a node-based interface. * The protocol and the client API were extended so that pacat could set the initial routing for the stream that it creates. Patches 16, 17 and 18 are totally unrelated to pacat's --routing option. I wrote them at a point where I didn't yet know that pacat's --routing option is really the next thing that I should implement. The patches add an interface for routing modules to intercept port change requests. Reviewers can skip those patches if they wish. [1] http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/18925/focus=19083 Tanu Kaskinen (30): node: Add monitor and monitor_of fields to pa_node sink, source: Add get_node() convenience functions Pass the requested connections to pa_node_put() Allow pa_node_put() to fail node: Pass the requested connections to PA_CORE_HOOK_NODE_SET_INITIAL_ROUTING macosx: Fix a memory leak card: Use pa_card_free() in pa_card_new() on failure card: Prevent invalid profiles device-port: Add pa_device_port.device node: Implement fallback routing of new streams sink-input, source-output: Remove fallback routing code alsa: Fix return value check sink, source: Better error reporting for port change failures node: Add pa_node.active node: Simplify set_initial_routing_fallback() sink, source: Pass the port object instead of the port name to pa_sink/source_set_port() sink, source: Add PA_CORE_HOOK_DEVICE_SET_PORT skoa-router: Rescue streams on port changes PROTOCOL: Don't forbid bidirectional nodes stream: Add a comment sink-input, source-output: Remove pa_sink_input/source_output_new_data_is_passthrough() sink-input, source-output: Remove format negotiation using new data source-output: Add pa_source_output_set_direct_on_input() node: Support sink input as an initial route for source outputs sink-input, source-output: Use node-based initial routing configuration Add node-based stream initial routing support to the native protocol stream: Add pa_stream_set_initial_routing() dynarray: Add pa_dynarray_get_raw_array() pacat: Add --routing core-format, sink-input, source-output: Add some more logging PROTOCOL | 13 +- man/pacat.1.xml.in | 26 +++ src/Makefile.am | 1 + src/map-file | 1 + src/modules/alsa/alsa-ucm.c | 6 +- src/modules/alsa/module-alsa-card.c | 21 +- src/modules/bluetooth/module-bluetooth-device.c | 21 +- src/modules/dbus/iface-device-port.c | 6 + src/modules/dbus/iface-device-port.h | 1 + src/modules/dbus/iface-device.c | 4 +- src/modules/echo-cancel/module-echo-cancel.c | 4 +- src/modules/macosx/module-coreaudio-device.c | 9 +- src/modules/module-combine-sink.c | 2 +- src/modules/module-device-manager.c | 16 +- src/modules/module-experimental-router.c | 40 +++- src/modules/module-intended-roles.c | 19 +- src/modules/module-ladspa-sink.c | 2 +- src/modules/module-loopback.c | 4 +- src/modules/module-remap-sink.c | 2 +- src/modules/module-remap-source.c | 2 +- src/modules/module-sine.c | 2 +- src/modules/module-skoa-router.c | 59 ++++++ src/modules/module-stream-restore.c | 18 +- src/modules/module-switch-on-port-available.c | 8 +- src/modules/module-virtual-sink.c | 2 +- src/modules/module-virtual-source.c | 2 +- src/modules/module-virtual-surround-sink.c | 2 +- src/modules/rtp/module-rtp-recv.c | 2 +- src/modules/rtp/module-rtp-send.c | 2 +- src/pulse/internal.h | 2 + src/pulse/stream.c | 51 ++++- src/pulse/stream.h | 30 ++- src/pulsecore/card.c | 126 +++++++++--- src/pulsecore/card.h | 4 +- src/pulsecore/cli-command.c | 16 +- src/pulsecore/core-format.c | 2 + src/pulsecore/core.h | 71 ++++++- src/pulsecore/device-port.c | 32 ++- src/pulsecore/device-port.h | 6 + src/pulsecore/dynarray.c | 6 + src/pulsecore/dynarray.h | 1 + src/pulsecore/edge.h | 27 +++ src/pulsecore/node.c | 263 +++++++++++++++++++++++- src/pulsecore/node.h | 22 +- src/pulsecore/play-memblockq.c | 2 +- src/pulsecore/protocol-esound.c | 4 +- src/pulsecore/protocol-http.c | 2 +- src/pulsecore/protocol-native.c | 169 +++++++++++++-- src/pulsecore/protocol-simple.c | 4 +- src/pulsecore/sink-input.c | 153 ++++---------- src/pulsecore/sink-input.h | 13 +- src/pulsecore/sink.c | 81 ++++++-- src/pulsecore/sink.h | 15 +- src/pulsecore/sound-file-stream.c | 2 +- src/pulsecore/source-output.c | 193 ++++++----------- src/pulsecore/source-output.h | 20 +- src/pulsecore/source.c | 85 ++++++-- src/pulsecore/source.h | 7 +- src/utils/pacat.c | 46 +++++ 59 files changed, 1308 insertions(+), 444 deletions(-) create mode 100644 src/pulsecore/edge.h -- 1.8.3.1