Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Epaneshnikov <aarnaarn2@gmail.com>2020-10-03 22:32:05 +0300
committerAlexander Epaneshnikov <aarnaarn2@gmail.com>2020-10-29 12:30:37 +0000
commit6a39300b0f0a08574038bad4537a27bb614a841d (patch)
tree1fb090ee534f85703d8b3e03b9102cc463f18039
parent6820f2cb69f214a1e10c95f42d0c44bce2cc8fc4 (diff)
implement accessibility support in archiso
this fixes #67
-rw-r--r--Makefile3
-rw-r--r--configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service16
-rw-r--r--configs/releng/airootfs/etc/systemd/system/livecd-talk.service23
l---------configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service1
l---------configs/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service1
-rw-r--r--configs/releng/airootfs/root/.zlogin5
-rwxr-xr-xconfigs/releng/airootfs/usr/local/bin/livecd-sound252
-rw-r--r--configs/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in3
-rw-r--r--configs/releng/efiboot/loader/entries/archiso-x86_64-speech-linux.conf9
-rw-r--r--configs/releng/efiboot/loader/loader.conf2
-rw-r--r--configs/releng/packages.x86_644
-rw-r--r--configs/releng/syslinux/archiso_head.cfg1
-rw-r--r--configs/releng/syslinux/archiso_sys-linux.cfg11
-rw-r--r--configs/releng/syslinux/archiso_sys.cfg2
14 files changed, 330 insertions, 3 deletions
diff --git a/Makefile b/Makefile
index 2890026..1f94998 100644
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,8 @@ lint:
$(wildcard configs/*/build.sh) \
$(wildcard configs/*/profiledef.sh) \
configs/releng/airootfs/root/.automated_script.sh \
- configs/releng/airootfs/usr/local/bin/choose-mirror
+ configs/releng/airootfs/usr/local/bin/choose-mirror \
+ configs/releng/airootfs/usr/local/bin/livecd-sound
shellcheck -s dash $(HOOKS_FILES) $(SCRIPT_FILES)
install: install-program install-examples install-doc
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..8c5317d
--- /dev/null
+++ b/configs/releng/airootfs/etc/systemd/system/livecd-alsa-unmuter.service
@@ -0,0 +1,16 @@
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[Unit]
+Description=Unmute All Sound Card Controls For Use With The Live Arch Environment
+# This needs to run after the audio device becomes available.
+Wants=systemd-udev-settle.service
+After=systemd-udev-settle.service sound.target
+ConditionKernelCommandLine=accessibility=on
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/livecd-sound -u
+
+[Install]
+WantedBy=sound.target
diff --git a/configs/releng/airootfs/etc/systemd/system/livecd-talk.service b/configs/releng/airootfs/etc/systemd/system/livecd-talk.service
new file mode 100644
index 0000000..d959ab3
--- /dev/null
+++ b/configs/releng/airootfs/etc/systemd/system/livecd-talk.service
@@ -0,0 +1,23 @@
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+[Unit]
+Description=Screen reader service
+After=livecd-alsa-unmuter.service
+Before=getty@tty1.service
+ConditionKernelCommandLine=accessibility=on
+
+[Service]
+Type=oneshot
+TTYPath=/dev/tty13
+ExecStartPre=/usr/bin/chvt 13
+ExecStart=/usr/local/bin/livecd-sound -p
+ExecStartPost=/usr/bin/chvt 1
+ExecStartPost=systemctl start espeakup.service
+StandardInput=tty
+TTYVHangup=yes
+TTYVTDisallocate=yes
+RemainAfterExit=true
+
+[Install]
+WantedBy=multi-user.target
diff --git a/configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service b/configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service
new file mode 120000
index 0000000..b917481
--- /dev/null
+++ b/configs/releng/airootfs/etc/systemd/system/multi-user.target.wants/livecd-talk.service
@@ -0,0 +1 @@
+/etc/systemd/system/livecd-talk.service \ No newline at end of file
diff --git a/configs/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service b/configs/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service
new file mode 120000
index 0000000..98c0fc8
--- /dev/null
+++ b/configs/releng/airootfs/etc/systemd/system/sound.target.wants/livecd-alsa-unmuter.service
@@ -0,0 +1 @@
+../livecd-alsa-unmuter.service \ No newline at end of file
diff --git a/configs/releng/airootfs/root/.zlogin b/configs/releng/airootfs/root/.zlogin
index f598e43..0fb119d 100644
--- a/configs/releng/airootfs/root/.zlogin
+++ b/configs/releng/airootfs/root/.zlogin
@@ -1 +1,6 @@
+# fix for screen readers
+if grep -Fq 'accessibility=' /proc/cmdline &> /dev/null; then
+ setopt SINGLE_LINE_ZLE
+fi
+
~/.automated_script.sh
diff --git a/configs/releng/airootfs/usr/local/bin/livecd-sound b/configs/releng/airootfs/usr/local/bin/livecd-sound
new file mode 100755
index 0000000..87d6f30
--- /dev/null
+++ b/configs/releng/airootfs/usr/local/bin/livecd-sound
@@ -0,0 +1,252 @@
+#!/usr/bin/env bash
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+usage() {
+ cat <<- _EOF_
+ live cd sound helper script.
+ Usage: livecdsound [OPTION]
+ OPTIONS
+ -u, --unmute unmute all sound cards
+ -p, --pick select a card for speetch output
+ -h, --help Show this usage message
+
+_EOF_
+}
+
+bugout () {
+ printf "/usr/local/bin/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
+}
+
+# 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 <card id>
+# $2 <control>
+# $3 <level>
+unmute_and_set_level(){
+ { [ "$3" ] &&[ "$2" ] && [ "$1" ] ; } || bugout
+ systemd-cat -t "livecdsound" printf "Setting: %s on card: %s to %s\n" "$2" "$1" "$3"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3" unmute
+ return 0
+}
+
+# $1 <card id>
+# $2 <control>
+mute_and_zero_level()
+{
+ { [ "$1" ] && [ "$2" ] ; } || bugout
+ systemd-cat -t "livecdsound" printf "Muting control: %s on card: %s\n" "$2" "$1"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "0%" mute
+ return 0
+}
+
+# $1 <card ID>
+# $2 <control>
+# $3 "on" | "off"
+switch_control()
+{
+ { [ "$3" ] && [ "$1" ] ; } || bugout
+ systemd-cat -t "livecdsound" printf "Switching control: %s on card: %s to %s\n" "$2" "$1" "$3"
+ systemd-cat -t "livecdsound" amixer -c "$1" set "$2" "$3"
+ return 0
+}
+
+# $1 <card ID>
+sanify_levels_on_card()
+{
+ unmute_and_set_level "$1" "Front" "80%"
+ unmute_and_set_level "$1" "Master" "80%"
+ unmute_and_set_level "$1" "Master Mono" "80%"
+ unmute_and_set_level "$1" "Master Digital" "80%" # E.g., cs4237B
+ unmute_and_set_level "$1" "Playback" "80%"
+ unmute_and_set_level "$1" "Headphone" "100%"
+ unmute_and_set_level "$1" "PCM" "80%"
+ unmute_and_set_level "$1" "PCM,1" "80%" # E.g., ess1969
+ unmute_and_set_level "$1" "DAC" "80%" # E.g., envy24, cs46xx
+ unmute_and_set_level "$1" "DAC,0" "80%" # E.g., envy24
+ unmute_and_set_level "$1" "DAC,1" "80%" # E.g., envy24
+ unmute_and_set_level "$1" "Synth" "80%"
+ unmute_and_set_level "$1" "CD" "80%"
+ unmute_and_set_level "$1" "PC Speaker" "100%"
+
+ mute_and_zero_level "$1" "Mic"
+ mute_and_zero_level "$1" "IEC958" # Ubuntu #19648
+
+ # Intel P4P800-MX
+ switch_control "$1" "Master Playback Switch" on
+ switch_control "$1" "Master Surround" on
+
+ # Trident/YMFPCI/emu10k1:
+ unmute_and_set_level "$1" "Wave" "80%"
+ unmute_and_set_level "$1" "Music" "80%"
+ unmute_and_set_level "$1" "AC97" "80%"
+
+ # DRC:
+ unmute_and_set_level "$1" "Dynamic Range Compression" "80%"
+
+ # Required for HDA Intel (hda-intel):
+ unmute_and_set_level "$1" "Front" "80%"
+
+ # Required for SB Live 7.1/24-bit (ca0106):
+ unmute_and_set_level "$1" "Analog Front" "80%"
+
+ # Required at least for Via 823x hardware on DFI K8M800-MLVF Motherboard
+ switch_control "$1" "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 "$1" "IEC958 Playback AC97-SPSA" "0"
+
+ # Required for newer Via hardware
+ unmute_and_set_level "$1" "VIA DXS,0" "80%"
+ unmute_and_set_level "$1" "VIA DXS,1" "80%"
+ unmute_and_set_level "$1" "VIA DXS,2" "80%"
+ unmute_and_set_level "$1" "VIA DXS,3" "80%"
+
+ # Required on some notebooks with ICH4:
+ switch_control "$1" "Headphone Jack Sense" off
+ switch_control "$1" "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 "$1" "Audigy Analog/Digital Output Jack" on
+ switch_control "$1" "SB Live Analog/Digital Output Jack" on
+
+ # D1984 -- Thinkpad T61/X61
+ switch_control "$1" "Speaker" on
+ switch_control "$1" "Headphone" on
+
+ # HDA-Intel w/ "Digital" capture mixer (See Ubuntu #193823)
+ unmute_and_set_level "$1" "Digital" "80%"
+
+ return 0
+}
+
+# $1 <card ID> | "all"
+sanify_levels()
+{
+ local ttsdml_returnstatus=0
+ local card
+ 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
+}
+
+# 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" ] && [ -f "$cardfile" ] && \
+ [ "$(cat "$cardfile")" != pcsp ]; then
+ echo "$card"
+ fi
+ done
+}
+
+# Properly initialize the sound card so that we have audio at boot.
+unmute_all_cards()
+{
+ sanify_levels all
+}
+
+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/local/share/livecd-sound/asound.conf.in \
+ > /etc/asound.conf
+}
+
+play_on_card() {
+ local card=$1 file=$2
+ aplay -q "-Dplughw:$card,0" "$file"
+}
+
+# If there are multiple usable sound cards, prompt the user to choose one,
+# using auditory feedback.
+pick_a_card()
+{
+ set -f
+ usable_cards="$(list_non_pcsp_cards)"
+ num_usable_cards=$(nwords $usable_cards)
+
+ if [ "$num_usable_cards" -eq 1 ]; then
+ systemd-cat -t "livecdsound" printf "Only one sound card is detected\n"
+ exit 0
+ fi
+ systemd-cat -t "livecdsound" printf "multiple sound cards detected\n"
+ for card in $usable_cards; do
+ if ! is_numeric "$card"; then
+ continue
+ fi
+ play_on_card "$card" /usr/share/livecd-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-sounds/beep.wav
+ if read -r -t 10; then
+ systemd-cat -t "livecdsound" printf "Selecting %s sound card as default\n" "$card"
+ set_default_card "$card"
+ break
+ fi
+done
+}
+
+if [[ $# -eq 0 ]]; then
+ echo "error: No argument passed."
+ exit 1
+fi
+while [[ "${1}" != "" ]]; do
+ case ${1} in
+ -h|--help)
+ usage
+ exit
+ ;;
+ -u|--unmute)
+ systemd-cat -t "livecdsound" printf "Unmuting all cards"
+ unmute_all_cards
+ ;;
+ -p|--pick)
+ pick_a_card
+ ;;
+ *)
+ echo "error: Unsupported argument"
+ usage
+ exit 1
+ ;;
+ esac
+ shift
+done
diff --git a/configs/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in b/configs/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in
new file mode 100644
index 0000000..3f9c7aa
--- /dev/null
+++ b/configs/releng/airootfs/usr/local/share/livecd-sound/asound.conf.in
@@ -0,0 +1,3 @@
+Defaults node
+defaults.ctl.card %card%;
+defaults.pcm.card %card%;
diff --git a/configs/releng/efiboot/loader/entries/archiso-x86_64-speech-linux.conf b/configs/releng/efiboot/loader/entries/archiso-x86_64-speech-linux.conf
new file mode 100644
index 0000000..a9525ee
--- /dev/null
+++ b/configs/releng/efiboot/loader/entries/archiso-x86_64-speech-linux.conf
@@ -0,0 +1,9 @@
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+title Arch Linux install medium (x86_64, UEFI) with speach
+linux /%INSTALL_DIR%/boot/x86_64/vmlinuz-linux
+initrd /%INSTALL_DIR%/boot/intel-ucode.img
+initrd /%INSTALL_DIR%/boot/amd-ucode.img
+initrd /%INSTALL_DIR%/boot/x86_64/initramfs-linux.img
+options archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% accessibility=on
diff --git a/configs/releng/efiboot/loader/loader.conf b/configs/releng/efiboot/loader/loader.conf
index 1ea5ce5..e4ef640 100644
--- a/configs/releng/efiboot/loader/loader.conf
+++ b/configs/releng/efiboot/loader/loader.conf
@@ -1,5 +1,5 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
-timeout 3
+timeout 30
default archiso-x86_64-linux.conf
diff --git a/configs/releng/packages.x86_64 b/configs/releng/packages.x86_64
index c481c45..2160eb6 100644
--- a/configs/releng/packages.x86_64
+++ b/configs/releng/packages.x86_64
@@ -1,10 +1,12 @@
#
# SPDX-License-Identifier: GPL-3.0-or-later
+alsa-utils
amd-ucode
arch-install-scripts
b43-fwcutter
base
bind-tools
+brltty
broadcom-wl
btrfs-progs
clonezilla
@@ -19,6 +21,7 @@ dnsmasq
dosfstools
edk2-shell
efibootmgr
+espeakup
ethtool
exfatprogs
f2fs-tools
@@ -40,6 +43,7 @@ lftp
linux
linux-atm
linux-firmware
+livecd-sounds
lsscsi
lvm2
lynx
diff --git a/configs/releng/syslinux/archiso_head.cfg b/configs/releng/syslinux/archiso_head.cfg
index 2dc18ed..be08525 100644
--- a/configs/releng/syslinux/archiso_head.cfg
+++ b/configs/releng/syslinux/archiso_head.cfg
@@ -28,3 +28,4 @@ MENU COLOR msg07 37;40 #90ffffff #a0000000 std
MENU COLOR tabmsg 31;40 #30ffffff #00000000 std
MENU CLEAR
+MENU IMMEDIATE
diff --git a/configs/releng/syslinux/archiso_sys-linux.cfg b/configs/releng/syslinux/archiso_sys-linux.cfg
index 6d0186b..d5fd776 100644
--- a/configs/releng/syslinux/archiso_sys-linux.cfg
+++ b/configs/releng/syslinux/archiso_sys-linux.cfg
@@ -10,3 +10,14 @@ MENU LABEL Arch Linux install medium (x86_64, BIOS)
LINUX boot/x86_64/vmlinuz-linux
INITRD boot/intel-ucode.img,boot/amd-ucode.img,boot/x86_64/initramfs-linux.img
APPEND archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL%
+
+# Accessibility boot option
+LABEL arch64speech
+TEXT HELP
+Boot the Arch Linux install medium on BIOS with speakup screen reader.
+It allows you to install Arch Linux or perform system maintenance with speech feedback.
+ENDTEXT
+MENU LABEL Arch Linux install medium (x86_64, BIOS) with ^speech
+LINUX boot/x86_64/vmlinuz-linux
+INITRD boot/intel-ucode.img,boot/amd-ucode.img,boot/x86_64/initramfs-linux.img
+APPEND archisobasedir=%INSTALL_DIR% archisolabel=%ARCHISO_LABEL% accessibility=on
diff --git a/configs/releng/syslinux/archiso_sys.cfg b/configs/releng/syslinux/archiso_sys.cfg
index 8a61d49..ac06ef6 100644
--- a/configs/releng/syslinux/archiso_sys.cfg
+++ b/configs/releng/syslinux/archiso_sys.cfg
@@ -4,7 +4,7 @@
INCLUDE boot/syslinux/archiso_head.cfg
DEFAULT arch64
-TIMEOUT 30
+TIMEOUT 300
INCLUDE boot/syslinux/archiso_sys-linux.cfg