From patchwork Fri Oct 18 14:19:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: nl6720 via arch-releng X-Patchwork-Id: 1282 Return-Path: Delivered-To: patchwork@archlinux.org Received: from apollo.archlinux.org (localhost [127.0.0.1]) by apollo.archlinux.org (Postfix) with ESMTP id 4593B147E9E69 for ; Fri, 18 Oct 2019 14:22:51 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on apollo X-Spam-Level: X-Spam-Status: No, score=-3.4 required=5.0 tests=DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1,DKIM_VALID=-0.1,DKIM_VALID_AU=-0.1, MAILING_LIST_MULTI=-1,RCVD_IN_DNSWL_MED=-2.3,SPF_HELO_NONE=0.001, T_DMARC_POLICY_NONE=0.01 autolearn=unavailable autolearn_force=no version=3.4.2 X-Spam-BL-Results: [127.0.0.10] [127.0.9.2] Received: from orion.archlinux.org (orion.archlinux.org [IPv6:2a01:4f8:160:6087::1]) by apollo.archlinux.org (Postfix) with ESMTPS for ; Fri, 18 Oct 2019 14:22:51 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id DA93B15EEDC76E; Fri, 18 Oct 2019 14:22:49 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [IPv6:2a01:4f8:160:3033::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits)) (No client certificate requested) by orion.archlinux.org (Postfix) with ESMTPS; Fri, 18 Oct 2019 14:22:49 +0000 (UTC) Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id C8CA32CAD1; Fri, 18 Oct 2019 14:22:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=archlinux.org; s=luna2; t=1571408569; bh=/YqFY2yg589I/ivwi6SRImRz4pgsgXkOx/hlwF00Lus=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc; b=OD2rXwNBoF9ZWmhP5AG4PN8ynpkeufTp2U1UhD4MPCFxNyvLCOZpcE4pBWE3bcvYp quxkMsrWRfuThe8Mxz1x3S18m12sZtlYdHDCdTLuZm2Uaqp28l3FMAQuAQQF0EXz32 ZT3uDbb5+RgEabD1owbJMoOIE7Ih2mMegB+NMNymddpCRb+ZD7z06QmNx+AEnXoP4p SWCgWoZpF/0SZzYIHFMrPj+oQm/ssej4X7iADYaEsrqoEk/I6RAJZQpjDqtSlrVssC FLb5uP4RJiCcPjAYbsSlE3/6Qttl8cTovMqv4PjI1PFnfPqWCzozxD5kB92Jl0ypHz GfokJ/MvsPqrz/WS3zBaQlG8xFrQ8kau9VUlAAx/tuLPoh3/I4OxmHLgCmQDjNFcod KMrGkkURWCawMknEGlPDDvv9f69yWBoZoqdaL2U8w9If741wcTPUQxOV9wr0R9hOzf EECPstMJcE51+Osvwxq+4GsqPYkyw3QuNOYsDPw6V2+2tMtA68EIAPT6/zagJHmMko CnHk9XBwSGK1vM4g6D8E//Q688+nP4yDr2AK8IqaivNXblbEFeZvK+CRQDyZnXrvJH W8rblJdXqB94Z5ygTVoVjpsDujMdBp9s9ihMvKUjx1MKKi24DzGKG4QQS2/DS3iTcO Nnkkspi6ePrZ+3eBd4UFRo7s= Received: from luna.archlinux.org (luna.archlinux.org [127.0.0.1]) by luna.archlinux.org (Postfix) with ESMTP id AF9502CB18 for ; Fri, 18 Oct 2019 14:22:46 +0000 (UTC) Received: from orion.archlinux.org (orion.archlinux.org [88.198.91.70]) by luna.archlinux.org (Postfix) with ESMTPS for ; Fri, 18 Oct 2019 14:22:46 +0000 (UTC) Received: from orion.archlinux.org (localhost [127.0.0.1]) by orion.archlinux.org (Postfix) with ESMTP id 6954915EEDC76A for ; Fri, 18 Oct 2019 14:22:45 +0000 (UTC) Received: from mail-lj1-x242.google.com (mail-lj1-x242.google.com [IPv6:2a00:1450:4864:20::242]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by orion.archlinux.org (Postfix) with ESMTPS for ; Fri, 18 Oct 2019 14:22:45 +0000 (UTC) Received: by mail-lj1-x242.google.com with SMTP id d1so6386268ljl.13 for ; Fri, 18 Oct 2019 07:22:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=YiXVxRKpi0YJIV/fpWaaO3jNo6wsccl8lMFc1vjEiyk=; b=XUxMJUeHao5rIADoe1U4/oAbqxkxzJmF/PM+bRthg5U16oAFbz5H46pDBODDtlcEkW dcdk7zWxw3XMo8nsjnf0NNKuubT+OnJkWmSZcIY7uS2sQB1XSLsST1ozQ2SThXLYaL/J acSS8X/CKZ5JJ30xzF7RjKesdwiwozBKA5ppD50vKTGvgGfzT6ZxfPJRYLbxpatW0OzV OgYG7X0IMV0NoCTXYoMoAiyb1A3Av2ElozqwD6YZ6s6Wrauge1NSOjOwy3SK9SrpX8Rm JYzOJLHPBPRd/vApefGsSHJ/j0d8ISA0LToHrGE9VaYWAov/hofdfvQutTvTS56A4so1 yE6g== X-Gm-Message-State: APjAAAUtg3PjPpxIUs53hMAiREeduCPmRikQEOaRveIHZtl/CwBFRA9y r8/gPx+Pbd7ZrLRmlj5Z4TdeX9aWB0s= X-Google-Smtp-Source: APXvYqxjwn0ikp+dwTdTeuZqVrAud9QZQrSC2U6WJr7SE13HfSEe6nlNbORsudltHrGaEaCHlkVg4w== X-Received: by 2002:a2e:3505:: with SMTP id z5mr188627ljz.126.1571408564126; Fri, 18 Oct 2019 07:22:44 -0700 (PDT) Received: from localhost.localdomain ([91.77.167.245]) by smtp.gmail.com with ESMTPSA id x5sm2811056lfg.71.2019.10.18.07.22.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 18 Oct 2019 07:22:43 -0700 (PDT) To: arch-releng@archlinux.org Date: Fri, 18 Oct 2019 17:19:37 +0300 Message-Id: <20191018141940.6401-3-aarnaarn2@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191018141940.6401-1-aarnaarn2@gmail.com> References: <20191018141940.6401-1-aarnaarn2@gmail.com> MIME-Version: 1.0 Subject: [arch-releng] [PATCH 2/5] add necessary helper scripts X-BeenThere: arch-releng@archlinux.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Arch Linux Release Engineering List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Alexandr Epaneshnikov via arch-releng Reply-To: Arch Linux Release Engineering Cc: Alexandr Epaneshnikov Errors-To: arch-releng-bounces@archlinux.org Sender: "arch-releng" 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 +# $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 +}