Collection of tools useful for audio production
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

172 lines
4.8KB

  1. #! /usr/bin/env bash
  2. # Script to bridge/start pulseaudio into JACK mode
  3. INSTALL_PREFIX="X-PREFIX-X"
  4. PULSE_CONFIG_DIR=${PULSE_CONFIG_DIR:-"$HOME/.pulse"}
  5. JACK_CONNFILE="$PULSE_CONFIG_DIR/jack-connections"
  6. PA_CTLFILE="$PULSE_CONFIG_DIR/ctl.pa"
  7. # ----------------------------------------------
  8. if [ ! -d $PULSE_CONFIG_DIR ]; then
  9. mkdir -p $PULSE_CONFIG_DIR
  10. fi
  11. if [ ! -f $PULSE_CONFIG_DIR/client.conf ]; then
  12. echo "autospawn = no" > $PULSE_CONFIG_DIR/client.conf
  13. else
  14. if (! cat $PULSE_CONFIG_DIR/client.conf | grep "autospawn = no" > /dev/null); then
  15. sed -i '/autospawn =/d' $PULSE_CONFIG_DIR/client.conf
  16. echo "autospawn = no" >> $PULSE_CONFIG_DIR/client.conf
  17. fi
  18. fi
  19. if [ ! -f $PULSE_CONFIG_DIR/daemon.conf ]; then
  20. echo "default-sample-format = float32le" > $PULSE_CONFIG_DIR/daemon.conf
  21. echo "realtime-scheduling = yes" >> $PULSE_CONFIG_DIR/daemon.conf
  22. echo "rlimit-rttime = -1" >> $PULSE_CONFIG_DIR/daemon.conf
  23. echo "exit-idle-time = -1" >> $PULSE_CONFIG_DIR/daemon.conf
  24. else
  25. if (! cat $PULSE_CONFIG_DIR/daemon.conf | grep "default-sample-format = float32le" > /dev/null); then
  26. sed -i '/default-sample-format = /d' $PULSE_CONFIG_DIR/daemon.conf
  27. echo "default-sample-format = float32le" >> $PULSE_CONFIG_DIR/daemon.conf
  28. fi
  29. if (! cat $PULSE_CONFIG_DIR/daemon.conf | grep "realtime-scheduling = yes" > /dev/null); then
  30. sed -i '/realtime-scheduling = /d' $PULSE_CONFIG_DIR/daemon.conf
  31. echo "realtime-scheduling = yes" >> $PULSE_CONFIG_DIR/daemon.conf
  32. fi
  33. if (! cat $PULSE_CONFIG_DIR/daemon.conf | grep "rlimit-rttime = -1" > /dev/null); then
  34. sed -i '/rlimit-rttime =/d' $PULSE_CONFIG_DIR/daemon.conf
  35. echo "rlimit-rttime = -1" >> $PULSE_CONFIG_DIR/daemon.conf
  36. fi
  37. if (! cat $PULSE_CONFIG_DIR/daemon.conf | grep "exit-idle-time = -1" > /dev/null); then
  38. sed -i '/exit-idle-time =/d' $PULSE_CONFIG_DIR/daemon.conf
  39. echo "exit-idle-time = -1" >> $PULSE_CONFIG_DIR/daemon.conf
  40. fi
  41. fi
  42. # ----------------------------------------------
  43. PLAY_ONLY="no"
  44. case $1 in
  45. -h|--h|--help)
  46. echo "usage: $0 [command]
  47. -p, --play Playback mode only
  48. -h, --help Show this help menu
  49. --dummy Don't do anything, just create the needed files
  50. NOTE:
  51. When ran with no arguments, pulse2jack will
  52. activate PulseAudio with both playback and record modes.
  53. "
  54. exit
  55. ;;
  56. --dummy)
  57. exit
  58. ;;
  59. -p|--p|--play)
  60. PLAY_ONLY="yes"
  61. ;;
  62. *)
  63. ;;
  64. esac
  65. TEMPLATE_PA_FILE=$INSTALL_PREFIX/share/cadence/pulse2jack/template.pa
  66. # ----------------------------------------------
  67. addJackConnectionsToPAFile() {
  68. PAFILE=$1
  69. OUTFILE=$2
  70. cp $PAFILE $OUTFILE
  71. tac $JACK_CONNFILE | while IFS=\| read name type channels connect; do
  72. sed -i "/### Load Jack modules/a load-module module-jack-$type channels=$channels connect=$connect client_name=\"$name\"" $OUTFILE
  73. done
  74. }
  75. loadConnectionsIntoPA() {
  76. CONNTYPE=$1
  77. while IFS=\| read name type channels connect; do
  78. if [ $CONNTYPE == "$type" ] ; then
  79. pactl load-module module-jack-$type channels=$channels connect=$connect client_name="$name" > /dev/null
  80. fi
  81. done < $JACK_CONNFILE
  82. }
  83. addDefaultSink() {
  84. INFILE=$1
  85. sed -i "/### Make Jack default/a set-default-sink jack_out" $INFILE
  86. }
  87. addDefaultSource() {
  88. INFILE=$1
  89. sed -i "/### Make Jack default/a set-default-source jack_in" $INFILE
  90. }
  91. if [ ! -f $PULSE_CONFIG_DIR/jack-connections ] ; then
  92. # safety in case there's no config generated yet from GUI
  93. sed "/### Load Jack modules/a load-module module-jack-sink
  94. /### Load Jack modules/a load-module module-jack-source" $TEMPLATE_PA_FILE > $PA_CTLFILE
  95. else
  96. addJackConnectionsToPAFile $TEMPLATE_PA_FILE $PA_CTLFILE
  97. fi
  98. addDefaultSource $PA_CTLFILE
  99. addDefaultSink $PA_CTLFILE
  100. IsPulseAudioRunning()
  101. {
  102. PROCESS=`ps -u $USER | grep pulseaudio`
  103. if [ "$PROCESS" == "" ]; then
  104. false
  105. else
  106. true
  107. fi
  108. }
  109. if (IsPulseAudioRunning); then
  110. {
  111. if (`jack_lsp | grep "PulseAudio JACK Sink:" > /dev/null`); then
  112. {
  113. echo "PulseAudio is already running and bridged to JACK"
  114. }
  115. else
  116. {
  117. echo "PulseAudio is already running, bridge it..."
  118. if [ "$PLAY_ONLY" == "yes" ]; then
  119. {
  120. loadConnectionsIntoPA "sink"
  121. pacmd set-default-source jack_in > /dev/null
  122. }
  123. else
  124. {
  125. loadConnectionsIntoPA "source"
  126. loadConnectionsIntoPA "sink"
  127. pacmd set-default-sink jack_out > /dev/null
  128. pacmd set-default-source jack_in > /dev/null
  129. }
  130. fi
  131. echo "Done"
  132. }
  133. fi
  134. }
  135. else
  136. {
  137. if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$PA_CTLFILE -n`); then
  138. echo "Initiated PulseAudio successfully!"
  139. else
  140. echo "Failed to initialize PulseAudio!"
  141. fi
  142. }
  143. fi