[pulseaudio-discuss] Virtual sink to pipe audio stream to STDIN of shell-command?

Alexander E. Patrakov patrakov at gmail.com
Sat Aug 1 18:11:11 PDT 2015


02.08.2015 01:17, Rene Bartsch wrote:
> Hi,
>
> with
>
> load-module module-pipe-sink format=s32le rate=96000 channels=8
> channel_map=front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
> sink_name=brutefir.FCA610  file=/tmp/brutefir.FCA610
> sink_properties='device.description="BruteFIR Behringer FCA610"'
>
> a virtual sink can be created which pipes audio streams to a FIFO. The
> drawback is that an external script has to start external processing of
> the audio stream.
>
> Is there any way to call a shell command from Pulseaudio and route a
> virtual sink to STDIN of that shell-command?

No. But as this question is really about brutefir, not any arbitrary 
program, here is an alternative way to start it. The drawback is that it 
will not work after logging out and logging in again.

Install JACK.

In /etc/environment, put one line:

JACK_START_SERVER=1

In /home/user/.jackdrc, put one line:

/home/user/.jack_session.sh

In /home/user/.jack_session.sh, put this script, make it executable:

#!/bin/sh
jackd -r -d alsa -d hw:PCUSB -s -r 44100 -p 256 &
( sleep 4 ; brutefir ) &

In /home/user/brutefir_config, put (in this example, a separate filter 
is applied to each channel for room-correction purposes):

sampling_rate: 44100;
#show_progress: false;
filter_length: 1024,64;
convolver_config: "/home/user/.brutefir_wisdom";

coeff "left" {
     filename: "/home/user/.filter-left.pcm";
     format: "FLOAT_LE";
};

coeff "right" {
     filename: "/home/user/.filter-right.pcm";
     format: "FLOAT_LE";
};

input "i_left", "i_right" {
     device: "jack" { ports: "pulseaudio:front-left", 
"pulseaudio:front-right"; };
     channels: 2;
     sample: "AUTO";
};

output "o_left", "o_right" {
     device: "jack" { ports: "alsa_pcm:playback_1", 
"alsa_pcm:playback_2"; };
     channels: 2;
     sample: "AUTO";
};

filter "f_left" {
     inputs: "i_left"/9;
     outputs: "o_left";
     process: 0;
     coeff: "left";
};

filter "f_right" {
     inputs: "i_right"/9;
     outputs: "o_right";
     process: 0;
     coeff: "right";
};

Finally, copy /etc/pulse/default.pa to 
/home/user/.config/pulse/default.pa, and add there:

load-module module-jack-sink connect=no client_name=pulseaudio

Also, let me guess: are you trying to emulate virtual 7.1 sound on 
headphones? Then, if your filter is shorter than 64 samples, then there 
is no need to mess with brutefir at all. Just make a multichannel wav 
file with the contributions of each input channel to the left output, 
and provide it to module-virtual-surround-sink. The limitation to 64 
samples can be easily patched out from module-virtual-surround-sink.

And finally: this is the third request to convolve PulseAudio output 
with something arbitrary. Someone has to sit down and write a native 
replacement for brutefir. Unfortunately, for me, this is not really 
possible, because of the dayjob which keeps me busy 200% of time.

-- 
Alexander E. Patrakov


More information about the pulseaudio-discuss mailing list