[pulseaudio-discuss] Moving sources and sinks

Nick Thompson rextanka at comcast.net
Fri May 2 10:20:33 PDT 2008


OK so I figured out the error of my ways, but I have to say this list  
is pretty unresponsive in helping the community so I have to ask  
myself "is pulse is a sensible choice for audio development today"?    
Particularly since there is little in the way of useful setup  
documentation for actually using the library on a programatic way, the  
error messages from the library and utilities are not particularly  
helpful and so on.

What I need to be able to do is route audio around.  I suspect write a  
module for pulse that will look at the alsa stream class and based on  
that use the input index to set the sick for that stream.  It would be  
nice to have a feature whereby I can rout all output sent to a  
particular sink, to another sink.  I guess what I'd like to do is be  
able to create virtual devices whose output can be changed on the  
fly.  So for example I could define an mp3 output that I can switch  
between headphone output and speaker output depending on a system  
setting.  Or between one speaker output and another.  If pulse has a  
means to do this already I'd appreciate someone pointing me in the  
direction that can help.

It seems ALSA will do most of this and the ALSA list seems to be a lot  
more active, so maybe I was mistaken in thinking that Pulse would  
really be a useful addition to our audio stack, particularly since on  
an embedded system it consume disproportionate resources for the  
benefit it provides.

Also where is the mixer implemented and how is it controlled.  Or is  
the mixer just a dumb "you have 3 streams coming in and I will make  
them one" type deal.  In other words is there bussing or output  
switching in the mixer.  If not, is this planned?

Anyway, in case this helps anyone else, the sources that are listed by  
list-sources are not really sources to pulse.  So trying to move them  
around will not work.  Here's something I wrote up on the subject:

To see the output devices we have created use the list-sinks command



 >>> list-sinks
2 sink(s) available.
   * index: 0
         name: <usbAudio>
         driver: <modules/module-alsa-sink.c>
         flags: LATENCY HARDWARE
         state: IDLE
         volume: <0: 100% 1: 100%>
         mute: <0>
         latency: <97959 usec>
         monitor source: <0>
         sample spec: <s16le 2ch 44100Hz>
         channel map: <front-left,front-right>
         used by: <0>
         linked by: <0>
         module: <0>
         description: <ALSA PCM on usbLexiconAlpha (USB Audio) via DMA>
     index: 1
         name: <hdaAudio>
         driver: <modules/module-alsa-sink.c>
         flags: LATENCY HARDWARE
         state: IDLE
         volume: <0: 100% 1: 100%>
         mute: <0>
         latency: <75827 usec>
         monitor source: <1>
         sample spec: <s16le 2ch 44100Hz>
         channel map: <front-left,front-right>
         used by: <0>
         linked by: <0>
         module: <1>
         description: <ALSA PCM on intelHDA (ALC883 Analog) via DMA>




Currently no sound is playing, so if you look to see the sink inputs,  
you'll see that none have currently been created:



 >>> list-sink-inputs
0 sink input(s) available.



Play a file in a different terminal window (or using your preferred  
method to make sound).  For this experiment I used paplay:



nick at nick-desktop:~$ paplay -v  Sony\ CD-ROM\ Test\ Disk\ Type\  
3.0/14\ Cantibile\ Op.\ 17.wav
Using sample spec 's16le 2ch 44100Hz'
Connection established.
Stream successfully created



I used the -v option to get verbose output from the command, which has  
no bearing on this experiment.

Now if you look at the sink inputs you can see that one has been  
created for the stream we are currently rendering.



 >>> list-sink-inputs
1 sink input(s) available.
     index: 9
         name: <Sony CD-ROM Test Disk Type 3.0/14 Cantibile Op. 17.wav>
         driver: <pulsecore/protocol-native.c>
         flags:
         state: RUNNING
         sink: <0> 'usbAudio'
         volume: <0: 100% 1: 100%>
         mute: <0>
         latency: <500000 usec>
         sample spec: <s16le 2ch 44100Hz>
         channel map: <front-left,front-right>
         resample method: auto
         module: <3>
         client: <7> 'paplay'




By inspection it can be seen that this stream is being rendered on the  
"usbAudio" device.  To switch this stream to the built-in audio source  
is a straightforward operation, use the move-sync-input command in  
pacmd.  We can see from the output above that the stream index is 9  
(note that the index is incremented for each time a new stream is  
created, so it has to be determined for each stream).



 >>> move-sink-input 9 hdaAudio



Now if the sink inputs are listed again you can see the output sink  
has changed, verifying this by listening, the output does indeed get  
switched.



 >>> list-sink-inputs
1 sink input(s) available.
     index: 9
         name: <Sony CD-ROM Test Disk Type 3.0/14 Cantibile Op. 17.wav>
         driver: <pulsecore/protocol-native.c>
         flags:
         state: RUNNING
         sink: <1> 'hdaAudio'
         volume: <0: 100% 1: 100%>
         mute: <0>
         latency: <500000 usec>
         sample spec: <s16le 2ch 44100Hz>
         channel map: <front-left,front-right>
         resample method: auto
         module: <3>
         client: <7> 'paplay'





The api routines for this are in the file /pulseaudio-0.9.8/src/pulse/ 
introspect.c

Look at these routines:



int     pa_stream_connect_playback (pa_stream *s,const char *dev,  
const pa_buffer_attr *attr, pa_stream_flags_t flags, pa_cvolume  
*volume, pa_stream *sync_stream)

      Connect the stream to a sink.

int     pa_stream_connect_record (pa_stream *s, const char *dev, const  
pa_buffer_attr *attr, pa_stream_flags_t flags)

      Connect the stream to a source.
int     pa_stream_disconnect (pa_stream *s)

      Disconnect a stream from a source/sink.






On May 1, 2008, at 11:14 AM, Nick Thompson wrote:

> Hi there,
>
> I have a system where I need to move sources to different sinks  
> according to a policy.  I thought I'd try this out using pacmd  
> before I  start trying to code this up with pulse, put pacmd does  
> not behave as expected (by me :).
>
> I tried the following command in pacmd:
>
> >>> move-sink-input 0 hdaAudio.monitor
> No sink input found with this index.
>
> When I list the sinks and sources I get the output listed below.
>
> Is anyone familiar with pacmd.  According to the help, this looks as  
> if it should work.
>
> Eventually I want to publish several virtual devices, route them to  
> a mixer (possibly via an SRC) and route the mixer output to a  
> specific ALSA sink.  I need two instances of mixers so that I can  
> mix some streams to one output device and some streams to another.   
> I need to be able to dynamically rout the entire output to another  
> ALSA sink depending on the policy set.  I'd also like to rout  
> sources to the different mixer instances as required.  If I can do  
> routing within a single mixer instance, so much the better.  Is  
> Pulse capable of this or do I need to find another route to  
> implement this.
>
> Thanks for any advice,
>
> Nick
>
> here is the output of list for sources and sinks:
>
> >>> list-sources
> 3 source(s) available.
>     index: 0
>         name: <usbAudio.monitor>
>         driver: <modules/module-alsa-sink.c>
>         flags:
>         state: IDLE
>         volume: <0: 100% 1: 100%>
>         mute: <0>
>         latency: <0 usec>
>         sample spec: <s16le 2ch 44100Hz>
>         channel map: <front-left,front-right>
>         used by: <0>
>         linked by: <0>
>         monitor_of: <0>
>         module: <0>
>         description: <Monitor Source of ALSA PCM on usbLexiconAlpha  
> (USB Audio) via DMA>
>     index: 1
>         name: <hdaAudio.monitor>
>         driver: <modules/module-alsa-sink.c>
>         flags:
>         state: IDLE
>         volume: <0: 100% 1: 100%>
>         mute: <0>
>         latency: <0 usec>
>         sample spec: <s16le 2ch 44100Hz>
>         channel map: <front-left,front-right>
>         used by: <0>
>         linked by: <0>
>         monitor_of: <1>
>         module: <1>
>         description: <Monitor Source of ALSA PCM on intelHDA (ALC883  
> Analog) via DMA>
>   * index: 2
>         name: <alsa_input.hw_0>
>         driver: <modules/module-alsa-source.c>
>         flags: HW_VOLUME_CTRL LATENCY HARDWARE
>         state: IDLE
>         volume: <0:   0% 1:   0%>
>         mute: <0>
>         latency: <23219 usec>
>         sample spec: <s16le 2ch 44100Hz>
>         channel map: <front-left,front-right>
>         used by: <0>
>         linked by: <0>
>         module: <2>
>         description: <ALSA PCM on hw:0 (ALC883 Analog) via DMA>
> >>>
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at mail.0pointer.de
> https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20080502/0d25651d/attachment.htm>


More information about the pulseaudio-discuss mailing list