From 92795313f057e60a00560fa36d47eba44dbf40ee Mon Sep 17 00:00:00 2001 From: Seppo Ingalsuo Date: Wed, 14 Oct 2020 19:44:05 +0300 Subject: [PATCH] [WIP][RFC] Test-case: Set PGAs to unity gain in script check-alsabat.sh This patch adds find of volume controls for used playback and capture devices and sets them to unity gain (0 dB). The alsabat test fails if e.g. capture PGA is set to their maximum value that can be up to +30 dB. The test sine wave distorts and causes test fail. Signed-off-by: Seppo Ingalsuo --- test-case/check-alsabat.sh | 82 +++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/test-case/check-alsabat.sh b/test-case/check-alsabat.sh index 480328564..2a54150e5 100755 --- a/test-case/check-alsabat.sh +++ b/test-case/check-alsabat.sh @@ -20,7 +20,11 @@ set -e # remove the existing alsabat wav files rm -f /tmp/bat.wav.* -source $(dirname ${BASH_SOURCE[0]})/../case-lib/lib.sh +TESTDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) +TPLGREADER="$TESTDIR"/tools/sof-tplgreader.py + +# shellcheck source=case-lib/lib.sh +source "$TESTDIR/case-lib/lib.sh" OPT_OPT_lst['p']='pcm_p' OPT_DESC_lst['p']='pcm for playback. Example: hw:0,0' OPT_PARM_lst['p']=1 OPT_VALUE_lst['p']='' @@ -37,12 +41,16 @@ OPT_PARM_lst['n']=1 OPT_VALUE_lst['n']=240000 OPT_OPT_lst['s']='sof-logger' OPT_DESC_lst['s']="Open sof-logger trace the data will store at $LOG_ROOT" OPT_PARM_lst['s']=0 OPT_VALUE_lst['s']=1 +OPT_OPT_lst['t']='tplg' OPT_DESC_lst['t']='tplg file, default value is env TPLG: $''TPLG' +OPT_PARM_lst['t']=1 OPT_VALUE_lst['t']="$TPLG" + func_opt_parse_option "$@" pcm_p=${OPT_VALUE_lst['p']} pcm_c=${OPT_VALUE_lst['c']} frequency=${OPT_VALUE_lst['f']} frames=${OPT_VALUE_lst['n']} +tplg=${OPT_VALUE_lst['t']} if [ "$pcm_p" = "" ]||[ "$pcm_c" = "" ]; then @@ -64,11 +72,83 @@ function __upload_wav_file done } +set_pga_to_unity_gain() +{ + tmp=$(amixer controls | grep "$1" | grep Volume) + search="name=" + cname=${tmp#*$search} + + # Get volume min and step to compute value for cset + # for 0 dB gain. The amixer line looks like + # "| dBscale-min=-50.00dB,step=1.00dB,mute=1" + scale=$(amixer cget name="$cname" | grep "dBscale" || true) + search="dBscale-min=" + tmp=${scale#*$search} + min_db="${tmp%%dB*}" + search="step=" + tmp=${scale#*$search} + step_db="${tmp%%dB*}" + + # Get multiplied by 100 values by removing decimal dot + min_x100="${min_db//.}" + step_x100="${step_db//.}" + val=$(printf %d "$(((-min_x100) / step_x100))") + + # Apply the computed value for requested gain + amixer cset name="$cname" "$val" +} + +set_pgas_list_to_unity_gain() +{ + for pga in "$@"; do + dlogi "Set $pga" + set_pga_to_unity_gain "$pga" + done +} + +get_snd_base() +{ + # Converts e.g. string hw:1,0 to /dev/snd/pcmC1D0 + # the p or c for playback or capture is appended + # in the calling function. + tmp=${1#*"hw:"} + ncard="${tmp%%,*}" + ndevice="${tmp#*,}" + echo "/dev/snd/pcmC${ncard}D${ndevice}" +} + +get_play_snd() +{ + tmp=$(get_snd_base "$1") + echo "${tmp}"p +} + +get_capture_snd() +{ + tmp=$(get_snd_base "$1") + echo "${tmp}"c +} + # check the PCMs before alsabat test dlogi "check the PCMs before alsabat test" [[ $(aplay -Dplug$pcm_p -d 1 /dev/zero -q) ]] && die "Failed to play on PCM: $pcm_p" [[ $(arecord -Dplug$pcm_c -d 1 /dev/null -q) ]] && die "Failed to capture on PCM: $pcm_c" +# Set PGAs for PCMs to 0 dB value +test -n "$(command -v "$TPLGREADER")" || + die "Command $TPLGREADER is not available." + +test -n "$tplg" || die "Use -t or set environment variable TPLG to current topology" +tplg_full_path=$(func_lib_get_tplg_path "$tplg") +dlogi "Getting playback PGA information" +play_snd=$(get_play_snd "$pcm_p") +PLAY_PGAS=$($TPLGREADER "$tplg_full_path" -f "snd:$play_snd" -d pga -v) +set_pgas_list_to_unity_gain $PLAY_PGAS +dlogi "Getting capture PGA information" +cap_snd=$(get_capture_snd "$pcm_c") +CAP_PGAS=$($TPLGREADER "$tplg_full_path" -f "snd:$cap_snd" -d pga -v) +set_pgas_list_to_unity_gain $CAP_PGAS + # alsabat test # different PCMs may support different audio formats(like samplerate, channel-counting, etc.). # use plughw to do the audio format conversions. So we don't need to specify them for each PCM.