[arch-releng] [PATCH 2/5] add necessary helper scripts

Alexandr Epaneshnikov aarnaarn2 at gmail.com
Fri Oct 18 14:19:37 UTC 2019


for sound activation and sound card selection.
---
 .../system/livecd-alsa-unmuter.service        |  15 ++
 .../airootfs/root/customize_airootfs.sh       |   2 +-
 .../airootfs/usr/bin/livecd-alsa-unmuter      |   8 +
 configs/releng/airootfs/usr/bin/pick-a-card   |  54 +++++
 configs/releng/airootfs/usr/bin/talk-to-me    |  10 +
 .../usr/share/livecd-sound/asound.conf.in     |  12 ++
 .../airootfs/usr/share/livecd-sound/functions | 199 ++++++++++++++++++
 7 files changed, 299 insertions(+), 1 deletion(-)
 create mode 100644 configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
 create mode 100755 configs/releng/airootfs/usr/bin/livecd-alsa-unmuter
 create mode 100755 configs/releng/airootfs/usr/bin/pick-a-card
 create mode 100755 configs/releng/airootfs/usr/bin/talk-to-me
 create mode 100644 configs/releng/airootfs/usr/share/livecd-sound/asound.conf.in
 create mode 100644 configs/releng/airootfs/usr/share/livecd-sound/functions

diff --git a/configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service b/configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
new file mode 100644
index 0000000..73a4d2e
--- /dev/null
+++ b/configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Unmute All Sound Card Controls For Use With The Live TalkingArch Environment
+# This needs to run after the audio device becomes available.
+Wants=systemd-udev-settle.service
+After=systemd-udev-settle.service sound.target
+DefaultDependencies=no
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/livecd-alsa-unmuter
+StandardOutput=syslog
+
+[Install]
+WantedBy=sound.target
diff --git a/configs/releng/airootfs/root/customize_airootfs.sh b/configs/releng/airootfs/root/customize_airootfs.sh
index bf5210c..697555b 100755
--- a/configs/releng/airootfs/root/customize_airootfs.sh
+++ b/configs/releng/airootfs/root/customize_airootfs.sh
@@ -19,5 +19,5 @@ sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' /etc/systemd/logind.conf
 sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' /etc/systemd/logind.conf
 sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' /etc/systemd/logind.conf
 
-systemctl enable pacman-init.service choose-mirror.service
+systemctl enable pacman-init.service choose-mirror.service livecd-alsa-unmuter.service brltty.service
 systemctl set-default multi-user.target
diff --git a/configs/releng/airootfs/usr/bin/livecd-alsa-unmuter b/configs/releng/airootfs/usr/bin/livecd-alsa-unmuter
new file mode 100755
index 0000000..6de05a0
--- /dev/null
+++ b/configs/releng/airootfs/usr/bin/livecd-alsa-unmuter
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# Properly initialize the sound card so that we have audio at boot.
+# This script is released under the GNU General Public License.
+source /usr/share/livecd-sound/functions
+
+preinit_levels all
+sanify_levels all
diff --git a/configs/releng/airootfs/usr/bin/pick-a-card b/configs/releng/airootfs/usr/bin/pick-a-card
new file mode 100755
index 0000000..7f469e8
--- /dev/null
+++ b/configs/releng/airootfs/usr/bin/pick-a-card
@@ -0,0 +1,54 @@
+#!/bin/bash
+
+# If there are multiple usable sound cards, prompt the user to choose one,
+# using auditory feedback.
+# This script is released under the GNU General Public License.
+
+source /usr/share/livecd-sound/functions
+
+nwords() {
+	echo $#
+}
+
+is_numeric() {
+	local str=$1
+	expr match "$str" '[[:digit:]]\+$' > /dev/null 2>&1
+}
+
+set_default_card() {
+	local card=$1
+	sed -e "s/%card%/$card/g" < /usr/share/livecd-sound/asound.conf.in \
+	    > /etc/asound.conf
+}
+
+play_on_card() {
+	local card=$1 file=$2
+	aplay "-Dplughw:$card,0" "$file"
+}
+
+set -f
+usable_cards="$(list_non_pcsp_cards)"
+num_usable_cards=$(nwords $usable_cards)
+
+if [ "$num_usable_cards" -eq 1 ]; then
+	exit 0
+fi
+
+for card in $usable_cards; do
+	if ! is_numeric "$card"; then
+		continue
+	fi
+	play_on_card "$card" /usr/share/livecd-sound/sounds/pick-a-card.wav&
+done
+wait
+sleep 1
+for card in $usable_cards; do
+	if ! is_numeric "$card"; then
+		continue
+	fi
+	play_on_card "$card" /usr/share/livecd-sound/sounds/beep.wav
+	if read -t 10; then
+		set_default_card "$card"
+		break
+	fi
+done
diff --git a/configs/releng/airootfs/usr/bin/talk-to-me b/configs/releng/airootfs/usr/bin/talk-to-me
new file mode 100755
index 0000000..73998d8
--- /dev/null
+++ b/configs/releng/airootfs/usr/bin/talk-to-me
@@ -0,0 +1,10 @@
+#!/bin/sh
+started_flag=/run/speech-is-running
+if [ -f $started_flag ]; then
+	exit 0
+fi
+systemctl stop espeakup
+sleep 5
+pick-a-card
+systemctl start espeakup
+touch $started_flag
diff --git a/configs/releng/airootfs/usr/share/livecd-sound/asound.conf.in b/configs/releng/airootfs/usr/share/livecd-sound/asound.conf.in
new file mode 100644
index 0000000..851f829
--- /dev/null
+++ b/configs/releng/airootfs/usr/share/livecd-sound/asound.conf.in
@@ -0,0 +1,12 @@
+pcm.!default {
+	type plug
+	slave.pcm {
+		type hw
+		card %card%
+	}
+}
+
+ctl.!default {
+	type hw
+	card %card%
+}
diff --git a/configs/releng/airootfs/usr/share/livecd-sound/functions b/configs/releng/airootfs/usr/share/livecd-sound/functions
new file mode 100644
index 0000000..e517795
--- /dev/null
+++ b/configs/releng/airootfs/usr/share/livecd-sound/functions
@@ -0,0 +1,199 @@
+# Functions for setting up sound on the live CD.
+# This library is released under the GNU General Public License,
+# and it incorporates code from the /etc/init.d/alsa-utils included with
+# Ubuntu 8.04.  Proper credit also goes to Debian.
+
+# Start code copied from Debian / Ubuntu:
+
+bugout () {
+	printf "/etc/rc.d/livecdsound: programming error"
+	stat_fail
+}
+
+echo_card_indices()
+{
+	if [ -f /proc/asound/cards ] ; then
+		sed -n -e's/^[[:space:]]*\([0-7]\)[[:space:]].*/\1/p' /proc/asound/cards
+	fi
+}
+
+filter_amixer_output()
+{
+	sed \
+		-e '/Unable to find simple control/d' \
+		-e '/Unknown playback setup/d' \
+		-e '/^$/d'
+}
+
+# The following functions try to set many controls.
+# No card has all the controls and so some of the attempts are bound to fail.
+# Because of this, the functions can't return useful status values.
+
+# $1 <control>
+# $2 <level>
+# $CARDOPT
+unmute_and_set_level()
+{
+	{ [ "$2" ] && [ "$CARDOPT" ] ; } || bugout
+	amixer $CARDOPT -q set "$1" "$2" unmute 2>&1 | filter_amixer_output || :
+	return 0
+}
+
+# $1 <control>
+# $CARDOPT
+mute_and_zero_level()
+{
+	{ [ "$1" ] && [ "$CARDOPT" ] ; } || bugout
+	amixer $CARDOPT -q set "$1" "0%" mute 2>&1 | filter_amixer_output || :
+	return 0
+}
+
+# $1 <control>
+# $2 "on" | "off"
+# $CARDOPT
+switch_control()
+{
+	{ [ "$2" ] && [ "$CARDOPT" ] ; } || bugout
+	amixer $CARDOPT -q set "$1" "$2" 2>&1 | filter_amixer_output || :
+	return 0
+}
+
+# $1 <card ID>
+sanify_levels_on_card()
+{
+	CARDOPT="-c $1"
+
+	unmute_and_set_level "Front" "80%"
+	unmute_and_set_level "Master" "80%"
+	unmute_and_set_level "Master Mono" "80%"  
+	unmute_and_set_level "Master Digital" "80%"   # E.g., cs4237B
+	unmute_and_set_level "Playback" "80%"
+	unmute_and_set_level "Headphone" "100%"
+	unmute_and_set_level "PCM" "80%"
+	unmute_and_set_level "PCM,1" "80%"   # E.g., ess1969
+	unmute_and_set_level "DAC" "80%"     # E.g., envy24, cs46xx
+	unmute_and_set_level "DAC,0" "80%"   # E.g., envy24
+	unmute_and_set_level "DAC,1" "80%"   # E.g., envy24
+	unmute_and_set_level "Synth" "80%"
+	unmute_and_set_level "CD" "80%"
+	unmute_and_set_level "PC Speaker" "100%"
+
+	mute_and_zero_level "Mic"
+	mute_and_zero_level "IEC958"         # Ubuntu #19648
+
+	# Intel P4P800-MX  
+	switch_control "Master Playback Switch" on
+	switch_control "Master Surround" on
+
+	# Trident/YMFPCI/emu10k1:
+	unmute_and_set_level "Wave" "80%"
+	unmute_and_set_level "Music" "80%"
+	unmute_and_set_level "AC97" "80%"
+
+	# DRC:
+	unmute_and_set_level "Dynamic Range Compression" "80%"
+
+	# Required for HDA Intel (hda-intel):
+	unmute_and_set_level "Front" "80%"
+
+	# Required for SB Live 7.1/24-bit (ca0106):
+	unmute_and_set_level "Analog Front" "80%"
+
+	# Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard
+	switch_control "IEC958 Capture Monitor" off
+
+	# Required for hardware allowing toggles for AC97 through IEC958,
+	#  valid values are 0, 1, 2, 3. Needs to be set to 0 for PCM1.
+	unmute_and_set_level "IEC958 Playback AC97-SPSA" "0"
+
+	# Required for newer Via hardware 
+	unmute_and_set_level "VIA DXS,0" "80%"
+	unmute_and_set_level "VIA DXS,1" "80%"
+	unmute_and_set_level "VIA DXS,2" "80%"
+	unmute_and_set_level "VIA DXS,3" "80%"
+
+	# Required on some notebooks with ICH4:
+	switch_control "Headphone Jack Sense" off
+	switch_control "Line Jack Sense" off
+
+	# Some machines need one or more of these to be on;
+	# others need one or more of these to be off:
+	#
+	# switch_control "External Amplifier" on
+	switch_control "Audigy Analog/Digital Output Jack" on
+	switch_control "SB Live Analog/Digital Output Jack" on
+	
+	# D1984 -- Thinkpad T61/X61
+	switch_control "Speaker" on
+	switch_control "Headphone" on
+
+	# HDA-Intel w/ "Digital" capture mixer (See Ubuntu #193823)
+	unmute_and_set_level "Digital" "80%"
+
+	return 0
+}
+
+# $1 <card ID> | "all"
+sanify_levels()
+{
+	TTSDML_RETURNSTATUS=0
+	case "$1" in
+	  all)
+		for CARD in $(echo_card_indices) ; do
+			sanify_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1
+		done
+		;;
+	  *)
+		sanify_levels_on_card "$1" || TTSDML_RETURNSTATUS=1
+		;;
+	esac
+	return $TTSDML_RETURNSTATUS
+}
+
+# $1 <card ID>
+preinit_levels_on_card()
+{
+	CARDOPT="-c $1"
+
+	# Silly dance to activate internal speakers by default on PowerMac
+	# Snapper and Tumbler
+	id=`cat /proc/asound/card$1/id 2>/dev/null`
+	if [ "$id" = "Snapper" -o "$id" = "Tumbler" ]; then
+		switch_control "Auto Mute" off
+		switch_control "PC Speaker" off
+		switch_control "Auto Mute" on
+	fi
+}
+
+# $1 <card ID> | "all"
+preinit_levels()
+{
+	TTSDML_RETURNSTATUS=0
+	case "$1" in
+	  all)
+		for CARD in $(echo_card_indices) ; do
+			preinit_levels_on_card "$CARD" || TTSDML_RETURNSTATUS=1
+		done
+		;;
+	  *)
+		preinit_levels_on_card "$1" || TTSDML_RETURNSTATUS=1
+		;;
+	esac
+	return $TTSDML_RETURNSTATUS
+}
+
+# End copied code.
+
+# List all cards that *should* be usable for PCM audio.  In my experience,
+# the console speaker (handled by the pcsp driver) isn't a suitable playback
+# device, so we'll exclude it.
+list_non_pcsp_cards()
+{
+	for card in $(echo_card_indices); do
+		local cardfile="/proc/asound/card${card}/id"
+		if [ -r "$cardfile" -a -f "$cardfile" ] && \
+		    [ "$(cat "$cardfile")" != pcsp ]; then
+			echo "$card"
+		fi
+	done
+}
-- 
2.23.0


More information about the arch-releng mailing list