From e4fd6acd2d59cd10450fc57cf89e2dcc3c1e9c87 Mon Sep 17 00:00:00 2001 From: bill-auger Date: Sat, 30 Jun 2018 06:16:32 -0400 Subject: add braille and screen reader support from talkingparabola config --- configs/profile/build.sh | 7 +- configs/profile/packages/packages-systemd.all | 6 + configs/profile/rebuild.sh | 4 +- configs/profile/root-image/etc/skel/.bash_profile | 5 + .../etc/systemd/system/livecd-alsa-unmuter.service | 15 ++ .../root-image/root/.install-systemd-mate/packages | 5 + .../root/customize_root_image-constants.inc | 12 +- .../root-image/root/customize_root_image.sh | 17 +- .../profile/root-image/usr/bin/livecd-alsa-unmuter | 8 + configs/profile/root-image/usr/bin/pick-a-card | 54 ++++++ configs/profile/root-image/usr/bin/talk-to-me | 16 ++ .../usr/share/livecd-sound/asound.conf.in | 12 ++ .../root-image/usr/share/livecd-sound/functions | 199 +++++++++++++++++++++ 13 files changed, 349 insertions(+), 11 deletions(-) create mode 100644 configs/profile/root-image/etc/systemd/system/livecd-alsa-unmuter.service create mode 100755 configs/profile/root-image/usr/bin/livecd-alsa-unmuter create mode 100755 configs/profile/root-image/usr/bin/pick-a-card create mode 100755 configs/profile/root-image/usr/bin/talk-to-me create mode 100644 configs/profile/root-image/usr/share/livecd-sound/asound.conf.in create mode 100644 configs/profile/root-image/usr/share/livecd-sound/functions diff --git a/configs/profile/build.sh b/configs/profile/build.sh index 20deb91..a20824e 100755 --- a/configs/profile/build.sh +++ b/configs/profile/build.sh @@ -17,6 +17,7 @@ iso_version=$(date +%Y.%m.%d) iso_label="PARA_$(date +%Y%m)" iso_dirname='parabola' enable_offline_install='false' +enable_tts_brltty='false' offline_switch='' work_dir=./work out_dir=./out/$(echo "${iso_edition}-${iso_version}" | tr '[:upper:]/' '[:lower:]-') @@ -50,6 +51,8 @@ _usage () echo " Default: ${iso_dirname}" echo " -O Enable offline install." echo " Default: '${enable_offline_install}'" + echo " -S Enable speech and braille." + echo " Default: '${enable_tts_brltty}'" echo " -C Specify the pacman.conf file used for chroot install." echo " Default: '${pacman_conf}'" echo " -w Set the working directory" @@ -205,6 +208,7 @@ make_customize_root_image() { ISO_INIT="${iso_init}" \ ISO_GUI="${iso_gui}" \ ENABLE_OFFLINE_INSTALL="${enable_offline_install}" \ + ENABLE_TTS_BRLTTY="${enable_tts_brltty}" \ setarch ${arch} mkparabolaiso ${verbose} -w ${work_dir}/${arch} \ -C ${pacman_conf} \ -D ${iso_dirname} \ @@ -359,7 +363,7 @@ make_iso() { ## prepare state ## # set CLI options -while getopts 'E:T:V:L:D:OC:w:o:vh' arg; do +while getopts 'E:T:V:L:D:OSC:w:o:vh' arg; do case "${arg}" in E) iso_edition="${OPTARG}" ;; T) target="${OPTARG}" ;; @@ -367,6 +371,7 @@ while getopts 'E:T:V:L:D:OC:w:o:vh' arg; do L) iso_label="${OPTARG}" ;; D) iso_dirname="${OPTARG}" ;; O) enable_offline_install='true' offline_switch='-O' ;; + S) enable_tts_brltty='true' ;; C) pacman_conf="${OPTARG}" ;; w) work_dir="${OPTARG}" ;; o) out_dir="${OPTARG}" ;; diff --git a/configs/profile/packages/packages-systemd.all b/configs/profile/packages/packages-systemd.all index 5bf8c77..5963233 100644 --- a/configs/profile/packages/packages-systemd.all +++ b/configs/profile/packages/packages-systemd.all @@ -11,3 +11,9 @@ openssh openvpn rsync wpa_supplicant + +# Accessibility +alsa-utils +bluez +brltty +espeakup diff --git a/configs/profile/rebuild.sh b/configs/profile/rebuild.sh index 87c8143..416b947 100755 --- a/configs/profile/rebuild.sh +++ b/configs/profile/rebuild.sh @@ -11,6 +11,8 @@ readonly TARGET='dual' # dual-arch (default) # readonly EDITION='OpenRC/LXDE' # OpenRC/LXDE init/WM-DE pair readonly EDITION='SystemD/CLI' # SystemD/CLI init/WM-DE pair (default) # readonly EDITION='SystemD/LXDE' # SystemD/LXDE init/WM-DE pair +readonly TALKING='' # speech and braille disabled (default) +# readonly TALKING='-S' # speech and braille enabled readonly CACHE='' # net-install (default) # readonly CACHE='-O' # offline install readonly VERSION="`date +%Y.%m.%d`" # for ISO filename (default) @@ -67,7 +69,7 @@ then rm work/build.make_customize_root_image_$TARGET \ fi -CMD="./build.sh -v -E $EDITION -T $TARGET $CACHE -V $VERSION $*" +CMD="./build.sh -v -E $EDITION -T $TARGET $TALKING $CACHE -V $VERSION $*" if ${CMD} then echo "success" ; rm ./continue.sh 2> /dev/null else echo -e "failure executing:\n\t${CMD}\ncontinue with:\n\t./continue.sh [args-to-build.sh]" diff --git a/configs/profile/root-image/etc/skel/.bash_profile b/configs/profile/root-image/etc/skel/.bash_profile index 4dfbab5..3698904 100644 --- a/configs/profile/root-image/etc/skel/.bash_profile +++ b/configs/profile/root-image/etc/skel/.bash_profile @@ -9,6 +9,7 @@ export EDITOR=nano export DE='_DESKTOP_SESSION_' # gnome, kde, xfce, lxde, mate export DESKTOP_SESSION='_DESKTOP_SESSION_' # lxde +ENABLE_TTS_BRLTTY='_ENABLE_TTS_BRLTTY_' # speech and braille # set custom environment @@ -17,5 +18,9 @@ sudo /root/.language.sh export $(cat /etc/locale.conf) +# launch accessibility features +[[ "$ENABLE_TTS_BRLTTY" == 'true' ]] && flock -n /run/talk-to-me.lck /usr/bin/talk-to-me + + # launch X [ -n "$DESKTOP_SESSION" -a -z "$DISPLAY" -a "$(tty)" = /dev/tty1 ] && exec startx || cat /etc/motd diff --git a/configs/profile/root-image/etc/systemd/system/livecd-alsa-unmuter.service b/configs/profile/root-image/etc/systemd/system/livecd-alsa-unmuter.service new file mode 100644 index 0000000..e3b9073 --- /dev/null +++ b/configs/profile/root-image/etc/systemd/system/livecd-alsa-unmuter.service @@ -0,0 +1,15 @@ +[Unit] +Description=Unmute All Sound Card Controls For Use With The Live TalkingParabola 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/profile/root-image/root/.install-systemd-mate/packages b/configs/profile/root-image/root/.install-systemd-mate/packages index 0d0fd76..299605e 100644 --- a/configs/profile/root-image/root/.install-systemd-mate/packages +++ b/configs/profile/root-image/root/.install-systemd-mate/packages @@ -51,3 +51,8 @@ lightdm-gtk-greeter-settings mate mate-extra volumeicon +alsa-utils +bluez +bluez-libs +brltty +espeakup diff --git a/configs/profile/root-image/root/customize_root_image-constants.inc b/configs/profile/root-image/root/customize_root_image-constants.inc index d02e3cc..38c149e 100644 --- a/configs/profile/root-image/root/customize_root_image-constants.inc +++ b/configs/profile/root-image/root/customize_root_image-constants.inc @@ -3,6 +3,7 @@ # ISO_INIT # ISO_GUI # ENABLE_OFFLINE_INSTALL +# HAS_BRLTTY_TTS readonly LOCALES="en_US\.UTF-8 \ @@ -34,11 +35,15 @@ readonly OPENRC_SERVICES_GUI="alsasound \ readonly SYSTEMD_SERVICES_ALL="choose-mirror.service \ multi-user.target \ pacman-init.service " +readonly SYSTEMD_SERVICES_ACC="bluetooth.service \ + brltty.service \ + livecd-alsa-unmuter.service " readonly SYSTEMD_SERVICES_GUI="NetworkManager.service" readonly OPENRC_SERVICES="${OPENRC_SERVICES_ALL} \ $([[ "${ISO_GUI}" != 'cli' ]] && echo " ${OPENRC_SERVICES_GUI}")" -readonly SYSTEMD_SERVICES="${SYSTEMD_SERVICES_ALL} \ - $([[ "${ISO_GUI}" != 'cli' ]] && echo " ${SYSTEMD_SERVICES_GUI}")" +readonly SYSTEMD_SERVICES="${SYSTEMD_SERVICES_ALL} \ + $([[ "${ISO_GUI}" != 'cli' ]] && echo " ${SYSTEMD_SERVICES_GUI}") \ + $([[ "${ENABLE_TTS_BRLTTY}" == 'yes' ]] && echo " ${SYSTEMD_SERVICES_ACC}")" readonly DEFAULT_SHELL=/bin/bash @@ -68,3 +73,6 @@ readonly OS_VERSION=$( echo ${ISO_TITLE} | cut -d ' ' -f 6 readonly OS_VERSION_ID=$( echo ${ISO_TITLE} | cut -d ' ' -f 6 ) readonly OS_VARIANT="$( echo ${OS_PRETTY_NAME} | cut -d ' ' -f -3 --complement )" readonly OS_VARIANT_ID=${ISO_INIT}-${ISO_GUI} + + +LOG_CONFIG() { printf "\033[01;34mconfiguring: %s\033[00m\n" "$(echo -e $*)" ; } diff --git a/configs/profile/root-image/root/customize_root_image.sh b/configs/profile/root-image/root/customize_root_image.sh index 0444bbb..4ce914a 100755 --- a/configs/profile/root-image/root/customize_root_image.sh +++ b/configs/profile/root-image/root/customize_root_image.sh @@ -6,26 +6,27 @@ set -e -u source /root/customize_root_image-constants.inc -# configure timezone and locales # +LOG_CONFIG "timezone and locales" ln -sf /usr/share/zoneinfo/UTC /etc/localtime for locale in ${LOCALES} ; do sed -i "s/#${locale}/${locale}/" /etc/locale.gen ; done ; locale-gen -# configure sudo # +LOG_CONFIG "sudo" chmod 750 /etc/sudoers.d chmod 440 /etc/sudoers.d/g_wheel -# configure pacman # +LOG_CONFIG "pacman" sed -i "s|#Server|Server|" /etc/pacman.d/mirrorlist [ "${INSTALL_TYPE}" == 'Complete' ] && cp /etc/pacman-offline.conf /etc/pacman.conf || \ cp /etc/pacman-online.conf /etc/pacman.conf -# configure services # + +LOG_CONFIG "services" if [[ "${ISO_INIT}" == 'openrc' ]] then # delete files that are specific to other init systems @@ -50,7 +51,7 @@ else echo "invalid \$ISO_INIT for services '${ISO_INIT}'" fi -# configure root user, system defaults, and login session # +LOG_CONFIG "system defaults and root user" usermod -s ${DEFAULT_SHELL} root 2> /dev/null sed -i "s|_EDITION_TITLE_|${ISO_TITLE}|" /etc/motd @@ -62,14 +63,16 @@ echo "VARIANT=\"${OS_VARIANT}\"" >> /usr/lib/os-release echo "VARIANT_ID=\"${OS_VARIANT_ID}\"" >> /usr/lib/os-release -# configure login session # +LOG_CONFIG "login session and live user" + +sed -i "s|_ENABLE_TTS_BRLTTY_|${ENABLE_TTS_BRLTTY}|" /etc/skel/.bash_profile if [[ "${ISO_GUI}" == 'cli' ]] then # configure CLI login session cp ${ROOT_SKEL_FILES} /root/ sed -i "s|_DESKTOP_SESSION_||" /root/.bash_profile -else # configure GUI login session and live user +else # configure GUI login session # configure live user [[ -n "$(id ${LIVE_USER} 2> /dev/null)" ]] && userdel -r ${LIVE_USER} 2> /dev/null diff --git a/configs/profile/root-image/usr/bin/livecd-alsa-unmuter b/configs/profile/root-image/usr/bin/livecd-alsa-unmuter new file mode 100755 index 0000000..6de05a0 --- /dev/null +++ b/configs/profile/root-image/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/profile/root-image/usr/bin/pick-a-card b/configs/profile/root-image/usr/bin/pick-a-card new file mode 100755 index 0000000..7f469e8 --- /dev/null +++ b/configs/profile/root-image/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/profile/root-image/usr/bin/talk-to-me b/configs/profile/root-image/usr/bin/talk-to-me new file mode 100755 index 0000000..118b013 --- /dev/null +++ b/configs/profile/root-image/usr/bin/talk-to-me @@ -0,0 +1,16 @@ +#!/bin/sh + +# Initialize the Speakup screenreader +# This script is released under the GNU General Public License. + +started_flag=/run/speech-is-running + +if [[ ! -f $started_flag ]]; then + systemctl stop espeakup + + sleep 5 + pick-a-card + + systemctl start espeakup + touch $started_flag +fi diff --git a/configs/profile/root-image/usr/share/livecd-sound/asound.conf.in b/configs/profile/root-image/usr/share/livecd-sound/asound.conf.in new file mode 100644 index 0000000..851f829 --- /dev/null +++ b/configs/profile/root-image/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/profile/root-image/usr/share/livecd-sound/functions b/configs/profile/root-image/usr/share/livecd-sound/functions new file mode 100644 index 0000000..e517795 --- /dev/null +++ b/configs/profile/root-image/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 +# $2 +# $CARDOPT +unmute_and_set_level() +{ + { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout + amixer $CARDOPT -q set "$1" "$2" unmute 2>&1 | filter_amixer_output || : + return 0 +} + +# $1 +# $CARDOPT +mute_and_zero_level() +{ + { [ "$1" ] && [ "$CARDOPT" ] ; } || bugout + amixer $CARDOPT -q set "$1" "0%" mute 2>&1 | filter_amixer_output || : + return 0 +} + +# $1 +# $2 "on" | "off" +# $CARDOPT +switch_control() +{ + { [ "$2" ] && [ "$CARDOPT" ] ; } || bugout + amixer $CARDOPT -q set "$1" "$2" 2>&1 | filter_amixer_output || : + return 0 +} + +# $1 +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 | "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 +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 | "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 +} -- cgit v1.2.2