[pulseaudio-discuss] sink/source automatic switching policy between different devices

Colin Guthrie gmane at colin.guthr.ie
Wed Oct 15 02:32:21 PDT 2008

Zhang, Xing Z wrote:
> Hi All:
>         I am thinking about how to implement sink/source automatic switching policy in PA. For mobile device, it may have several output devices such as speaker, wired headset, Bluetooth headset and so on.
>         People may want to audio stream automatically re-direct to new device they plug in. For example, while I play a MP3 with embedded speaker I want to the music automatically output through Bluetooth headset once I plug it in.
>         After a rough looking into the source, I think the mechanism used by module-hal-detect.so, module-bluetooth-discover.so and "move-sink-input" could help me to achieve the goal. That means a new module may be written.
>         But, the problem is different users may want different policies. For instance, somebody may want to speaker automatically muted when wired headset plugged in, while others may want speaker go on playing. So a new module is hard to provide dynamic policy for different people because once it complied all things are hard coding. A feasible way is the module reads in a configure file to decide to provide what policy. I am afraid the configure file may make things complicated so I consult you is there an easier way? Many thanks in advance :)

In recent releases the stream routing logic is performed by 
module-stream-restore and there is a way to inject "rules" into this 
module which can act on "properties" attached to the streams.

e.g. a VoIP class may attach a property to tell pulse that is is of 
class "voip" and a rule could be written that says when a device stream 
of class voip is played and a device of type headset is discovered, move 
the stream across.

I'm not sure if it handles the "moving after the stream has started" 
case yet, but certainly this is the right approach and the stream 
properties give the necessary meta-data to work with.

This properties system was only introduced in pulse 0.9.11 which is why 
Erik could not do this in the past and used a series of scripts.

The docs for stream-restore are a little light just now but the 
interface can be found here:

Pulse itself offers all the necessary hooks to know when a new device is 
added and you should certainly stay away from module-hal-detect and 
*-discover modules (there are also zeroconf-discover and, now, 
raop-discover too!) as these is not a mandatory modules and sinks/source 
could be added manually too. The hooks in pulse for when a new 
sink/source is added/disappears is sufficient to do this kind of routing.

I know this is a bit of a piecemeal reply as I don't fully know the ins 
and outs of using the stream restore system. I just know it's the right 
horse to back in the race rather than trying to do stuff at a lower level.

Hopefully Lennart can give a more complete answer on stream-restore :)



Colin Guthrie

Day Job:
   Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
   Mandriva Linux Contributor [http://www.mandriva.com/]
   PulseAudio Hacker [http://www.pulseaudio.org/]
   Trac Hacker [http://trac.edgewall.org/]

More information about the pulseaudio-discuss mailing list