cadence/data/cadence-pulse2jack

282 lines
10 KiB
Bash
Executable File

#!/bin/bash
# Script to bridge/start pulseaudio into JACK mode
INSTALL_PREFIX="X-PREFIX-X"
# ----------------------------------------------
if [ ! -d ~/.pulse ]; then
mkdir -p ~/.pulse
fi
if [ ! -f ~/.pulse/client.conf ]; then
echo "autospawn = no" > ~/.pulse/client.conf
else
if (! cat ~/.pulse/client.conf | grep "autospawn = no" > /dev/null); then
sed -i '/autospawn =/d' ~/.pulse/client.conf
echo "autospawn = no" >> ~/.pulse/client.conf
fi
fi
if [ ! -f ~/.pulse/daemon.conf ]; then
echo "default-sample-format = float32le" > ~/.pulse/daemon.conf
echo "realtime-scheduling = yes" >> ~/.pulse/daemon.conf
echo "rlimit-rttime = -1" >> ~/.pulse/daemon.conf
echo "exit-idle-time = -1" >> ~/.pulse/daemon.conf
else
if (! cat ~/.pulse/daemon.conf | grep "default-sample-format = float32le" > /dev/null); then
sed -i '/default-sample-format = /d' ~/.pulse/daemon.conf
echo "default-sample-format = float32le" >> ~/.pulse/daemon.conf
fi
if (! cat ~/.pulse/daemon.conf | grep "realtime-scheduling = yes" > /dev/null); then
sed -i '/realtime-scheduling = /d' ~/.pulse/daemon.conf
echo "realtime-scheduling = yes" >> ~/.pulse/daemon.conf
fi
if (! cat ~/.pulse/daemon.conf | grep "rlimit-rttime = -1" > /dev/null); then
sed -i '/rlimit-rttime =/d' ~/.pulse/daemon.conf
echo "rlimit-rttime = -1" >> ~/.pulse/daemon.conf
fi
if (! cat ~/.pulse/daemon.conf | grep "exit-idle-time = -1" > /dev/null); then
sed -i '/exit-idle-time =/d' ~/.pulse/daemon.conf
echo "exit-idle-time = -1" >> ~/.pulse/daemon.conf
fi
fi
# ----------------------------------------------
wanted_capture_ports=0 # -1 means default
wanted_playback_ports=0 # -1 means default
arg_is_for=""
for arg in "$@";do
case "$arg" in
-h|--h|--help)
echo "usage: $0 [command]
-p Playback only with default number of channels
-p <NUMBER> Number of playback channels
-c Capture only with default number of channels
-c <NUMBER> Number of capture channels
-h, --help Show this help menu
--dummy Don't do anything, just create the needed files
NOTE:
When runned with no arguments, $(basename "$0") will
activate PulseAudio with both playback and record modes with default number of channels.
"
exit
;;
--dummy)
exit
;;
-c|--capture)
arg_is_for="capture"
wanted_capture_ports=-1 # -1 means default, if no (correct) argument is given.
;;
-p|--play|--playback)
arg_is_for="playback"
wanted_playback_ports=-1
;;
* )
case "$arg_is_for" in
"capture")
[ "$arg" -ge 0 ] 2>/dev/null && wanted_capture_ports="$arg"
;;
"playback")
[ "$arg" -ge 0 ] 2>/dev/null && wanted_playback_ports="$arg"
;;
esac
;;
esac
done
if [ $wanted_capture_ports == 0 ] && [ $wanted_playback_ports == 0 ];then
#no sense to want to start/bridge pulseaudio without ports, set as default
capture_ports=-1 # -1 means default
playback_ports=-1 # -1 means default
fi
str_capture="channels=$wanted_capture_ports" #used for pulseaudio commands
str_playback="channels=$wanted_playback_ports" ##
[ $wanted_capture_ports == -1 ] && str_capture="" # -1 means default, no command channels=n
[ $wanted_playback_ports == -1 ] && str_playback="" ##
# ----------------------------------------------
IsPulseAudioRunning()
{
PROCESS=`ps -u $USER | grep pulseaudio`
if [ "$PROCESS" == "" ]; then
false
else
true
fi
}
StartBridged()
{
#write pulseaudio config file in a tmp file
pa_file=$(mktemp --suffix .pa)
echo .fail > $pa_file
### Automatically restore the volume of streams and devices
echo load-module module-device-restore >> $pa_file
echo load-module module-stream-restore >> $pa_file
echo load-module module-card-restore >> $pa_file
### Load Jack modules
[ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file
[ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file
### Load unix protocol
echo load-module module-native-protocol-unix >> $pa_file
### Automatically restore the default sink/source when changed by the user
### during runtime
### NOTE: This should be loaded as early as possible so that subsequent modules
### that look up the default sink/source get the right value
echo load-module module-default-device-restore >> $pa_file
### Automatically move streams to the default sink if the sink they are
### connected to dies, similar for sources
echo load-module module-rescue-streams >> $pa_file
### Make sure we always have a sink around, even if it is a null sink.
echo load-module module-always-sink >> $pa_file
### Make Jack default
[ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file
[ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file
if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then
echo "Initiated PulseAudio successfully!"
else
echo "Failed to initialize PulseAudio!"
fi
}
killReStart()
{
pulseaudio -k && StartBridged
exit
}
JackNotRunning()
{
echo "JACK seems not running, start JACK before bridge PulseAudio"
exit 1
}
if (IsPulseAudioRunning); then
{
#count all Jack Audio Physical ports
all_jack_lsp=$(jack_lsp -p -t) || JackNotRunning
output_physical_lines=$(echo "$all_jack_lsp"|grep -n "output,physical,"|cut -d':' -f1)
input_physical_lines=$( echo "$all_jack_lsp"|grep -n "input,physical," |cut -d':' -f1)
audio_lines=$(echo "$all_jack_lsp" |grep -n " audio"|cut -d':' -f1)
capture_physical_ports=0
playback_physical_ports=0
for out_phy_line in $output_physical_lines;do
if echo "$audio_lines"|grep -q $(($out_phy_line + 1));then
((capture_physical_ports++))
fi
done
for in_phy_line in $input_physical_lines;do
if echo "$audio_lines"|grep -q $(($in_phy_line + 1));then
((playback_physical_ports++))
fi
done
#count PulseAudio jack ports
current_playback_ports=$(echo "$all_jack_lsp"|grep ^"PulseAudio JACK Sink:" |wc -l)
current_capture_ports=$( echo "$all_jack_lsp"|grep ^"PulseAudio JACK Source:"|wc -l)
#if number of pulseaudio ports equal to physical ports, consider pulseaudio module is running the default mode (no channels=n)
[ $current_capture_ports == $capture_physical_ports ] && current_capture_ports=-1
[ $current_playback_ports == $playback_physical_ports ] && current_playback_ports=-1
[ $wanted_capture_ports == $capture_physical_ports ] && wanted_capture_ports=-1
[ $wanted_playback_ports == $playback_physical_ports ] && wanted_playback_ports=-1
if [ $wanted_capture_ports == $current_capture_ports ] && [ $wanted_playback_ports == $current_playback_ports ];then
echo "PulseAudio is already started and bridged to Jack with $current_capture_ports inputs and $current_playback_ports outputs, nothing to do !"
exit
fi
if [ $current_capture_ports != $wanted_capture_ports ];then
if [ $current_capture_ports != 0 ];then
echo "unload PulseAudio JACK Source"
pactl unload-module module-jack-source > /dev/null || killReStart
fi
if [ $wanted_capture_ports != 0 ];then
echo "load PulseAudio JACK Source $str_capture"
pactl load-module module-jack-source $str_capture > /dev/null
pacmd set-default-source jack_in > /dev/null
fi
fi
if [ $current_playback_ports != $wanted_playback_ports ];then
if [ $current_playback_ports != 0 ];then
echo "unload PulseAudio JACK Sink"
pactl unload-module module-jack-sink > /dev/null || killReStart
fi
if [ $wanted_playback_ports != 0 ];then
echo "load PulseAudio JACK Sink $str_playback"
pactl load-module module-jack-sink $str_playback > /dev/null
pactl set-default-sink jack_out > /dev/null
fi
fi
}
else
{
StartBridged
# #write pulseaudio config file in a tmp file
# pa_file=$(mktemp --suffix .pa)
# echo .fail > $pa_file
#
# ### Automatically restore the volume of streams and devices
# echo load-module module-device-restore >> $pa_file
# echo load-module module-stream-restore >> $pa_file
# echo load-module module-card-restore >> $pa_file
#
# ### Load Jack modules
# [ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file
# [ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file
#
# ### Load unix protocol
# echo load-module module-native-protocol-unix >> $pa_file
#
# ### Automatically restore the default sink/source when changed by the user
# ### during runtime
# ### NOTE: This should be loaded as early as possible so that subsequent modules
# ### that look up the default sink/source get the right value
# echo load-module module-default-device-restore >> $pa_file
#
# ### Automatically move streams to the default sink if the sink they are
# ### connected to dies, similar for sources
# echo load-module module-rescue-streams >> $pa_file
#
# ### Make sure we always have a sink around, even if it is a null sink.
# echo load-module module-always-sink >> $pa_file
#
# ### Make Jack default
# [ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file
# [ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file
#
# if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then
# echo "Initiated PulseAudio successfully!"
# else
# echo "Failed to initialize PulseAudio!"
# fi
}
fi