diff --git a/case-lib/hijack.sh b/case-lib/hijack.sh index 264edb4b..a6ae13b4 100644 --- a/case-lib/hijack.sh +++ b/case-lib/hijack.sh @@ -185,6 +185,11 @@ function func_exit_handler() fi } + # Restore ALSA settings after execution if state file exists + if [ -f "${SOF_TEST_ALSA_STATE_FILENAME}" ]; then + restore_alsa_state + fi + print_test_result_exit $exit_status } diff --git a/case-lib/lib.sh b/case-lib/lib.sh index 5b381eda..2dde327d 100644 --- a/case-lib/lib.sh +++ b/case-lib/lib.sh @@ -8,6 +8,8 @@ SCRIPT_HOME=$(cd "$SCRIPT_HOME/.." && pwd) SCRIPT_NAME="$0" # get test-case script load name # shellcheck disable=SC2034 # external script can use it SCRIPT_PRAM="$*" # get test-case parameter +# shellcheck disable=SC2034 # external script can use it +SOF_TEST_ALSA_STATE_FILENAME=/tmp/"${SCRIPT_NAME##*/}".$$.state # Source from the relative path of current folder # shellcheck source=case-lib/config.sh @@ -1187,3 +1189,27 @@ perf_analyze() fi } +# Restore the machine state from a file. +# Should be triggered at the end of +# every test touching ALSA. +# Couple with save_machine_state. +restore_alsa_state() +{ + dlogi "restore_alsa_state called in ${SOF_TEST_ALSA_STATE_FILENAME}" + if [ -f "${SOF_TEST_ALSA_STATE_FILENAME}" ]; then + dlogi "restore_alsa_state found a relevant state file." + alsactl restore --file "${SOF_TEST_ALSA_STATE_FILENAME}" --pedantic --no-ucm --no-init-fallback || dlogi "alsactl state restoration failed!" + rm "${SOF_TEST_ALSA_STATE_FILENAME}" || dlogi "Old state file removal failed!" + fi +} + +# Save the machine state to a file. +# Should be used at the start of +# every test touching ALSA. +# Coupled with restore_machine_state +# on an exit signal inside func_exit_handler. +save_alsa_state() +{ + dlogi "save_alsa_state called in ${SOF_TEST_ALSA_STATE_FILENAME}" + alsactl store --file "${SOF_TEST_ALSA_STATE_FILENAME}" || dlogi "alsactl state storage failed!" +} diff --git a/test-case/check-alsabat.sh b/test-case/check-alsabat.sh index 9aadb863..48f833b9 100755 --- a/test-case/check-alsabat.sh +++ b/test-case/check-alsabat.sh @@ -74,6 +74,7 @@ sigmak=${OPT_VAL['k']} frames=${OPT_VAL['n']} start_test +save_alsa_state if [ "$pcm_p" = "" ]||[ "$pcm_c" = "" ]; then diff --git a/test-case/check-audio-equalizer.sh b/test-case/check-audio-equalizer.sh index 1b4a4ad3..a3a7dd62 100755 --- a/test-case/check-audio-equalizer.sh +++ b/test-case/check-audio-equalizer.sh @@ -43,6 +43,7 @@ func_pipeline_export "$tplg" "eq:any" sofcard=${SOFCARD:-0} start_test +save_alsa_state setup_kernel_check_point # Test equalizer diff --git a/test-case/check-capture.sh b/test-case/check-capture.sh index 444e5d4c..57fa24aa 100755 --- a/test-case/check-capture.sh +++ b/test-case/check-capture.sh @@ -58,6 +58,7 @@ out_dir=${OPT_VAL['o']} file_prefix=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/check-fw-echo-reference.sh b/test-case/check-fw-echo-reference.sh index 1e8ace9f..606f29c8 100755 --- a/test-case/check-fw-echo-reference.sh +++ b/test-case/check-fw-echo-reference.sh @@ -41,6 +41,7 @@ frames=${OPT_VAL['n']} frequency=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "echo:any" diff --git a/test-case/check-keyword-detection.sh b/test-case/check-keyword-detection.sh index ebcad8fd..6adeb85b 100755 --- a/test-case/check-keyword-detection.sh +++ b/test-case/check-keyword-detection.sh @@ -54,6 +54,7 @@ preamble_time=${OPT_VAL['p']} duration=${OPT_VAL['d']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "kpb:any" diff --git a/test-case/check-kmod-load-unload-after-playback.sh b/test-case/check-kmod-load-unload-after-playback.sh index e7aa542b..c9d3298a 100755 --- a/test-case/check-kmod-load-unload-after-playback.sh +++ b/test-case/check-kmod-load-unload-after-playback.sh @@ -55,6 +55,7 @@ loop_cnt=${OPT_VAL['l']} pb_duration=${OPT_VAL['d']} start_test +save_alsa_state func_pipeline_export "$tplg" "type:playback" diff --git a/test-case/check-kmod-load-unload.sh b/test-case/check-kmod-load-unload.sh index 9e51729a..8f6e3d65 100755 --- a/test-case/check-kmod-load-unload.sh +++ b/test-case/check-kmod-load-unload.sh @@ -39,6 +39,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state loop_cnt=${OPT_VAL['l']} diff --git a/test-case/check-pause-release-suspend-resume.sh b/test-case/check-pause-release-suspend-resume.sh index db2c804d..af1f97e5 100755 --- a/test-case/check-pause-release-suspend-resume.sh +++ b/test-case/check-pause-release-suspend-resume.sh @@ -95,6 +95,7 @@ test_mode=${OPT_VAL['m']} file_name=${OPT_VAL['F']} start_test +save_alsa_state case $test_mode in "playback") diff --git a/test-case/check-pause-resume.sh b/test-case/check-pause-resume.sh index 17c49ffc..6015bfc8 100755 --- a/test-case/check-pause-resume.sh +++ b/test-case/check-pause-resume.sh @@ -58,6 +58,7 @@ rnd_min=${OPT_VAL['i']} rnd_max=${OPT_VAL['a']} start_test +save_alsa_state rnd_range=$(( rnd_max - rnd_min )) [[ $rnd_range -le 0 ]] && dlogw "Error random range scope [ min:$rnd_min - max:$rnd_max ]" && exit 2 diff --git a/test-case/check-performance.sh b/test-case/check-performance.sh index 2b0eecfc..037d956d 100755 --- a/test-case/check-performance.sh +++ b/test-case/check-performance.sh @@ -42,6 +42,7 @@ tplg=${OPT_VAL['t']} duration=${OPT_VAL['d']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/check-playback.sh b/test-case/check-playback.sh index 0958647b..1b1e4986 100755 --- a/test-case/check-playback.sh +++ b/test-case/check-playback.sh @@ -54,6 +54,7 @@ loop_cnt=${OPT_VAL['l']} file=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # checking if source file exists diff --git a/test-case/check-runtime-pm-double-active.sh b/test-case/check-runtime-pm-double-active.sh index 51b99b86..6a7f73f2 100755 --- a/test-case/check-runtime-pm-double-active.sh +++ b/test-case/check-runtime-pm-double-active.sh @@ -60,6 +60,7 @@ tplg=${OPT_VAL['t']} loop_count=${OPT_VAL['l']} start_test +save_alsa_state [[ -z $tplg ]] && dloge "Miss tplg file to run" && exit 2 diff --git a/test-case/check-runtime-pm-status.sh b/test-case/check-runtime-pm-status.sh index f9b83fa4..469aa20e 100755 --- a/test-case/check-runtime-pm-status.sh +++ b/test-case/check-runtime-pm-status.sh @@ -56,6 +56,7 @@ tplg=${OPT_VAL['t']} loop_count=${OPT_VAL['l']} start_test +save_alsa_state [[ -z $tplg ]] && die "Miss tplg file to run" diff --git a/test-case/check-signal-stop-start.sh b/test-case/check-signal-stop-start.sh index 0aa79fb0..68132586 100755 --- a/test-case/check-signal-stop-start.sh +++ b/test-case/check-signal-stop-start.sh @@ -44,6 +44,7 @@ interval=${OPT_VAL['i']} test_mode=${OPT_VAL['m']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect case $test_mode in diff --git a/test-case/check-smart-amplifier.sh b/test-case/check-smart-amplifier.sh index 41a9b345..412f16d8 100755 --- a/test-case/check-smart-amplifier.sh +++ b/test-case/check-smart-amplifier.sh @@ -57,6 +57,7 @@ loop_cnt=${OPT_VAL['l']} tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "smart_amp:any" diff --git a/test-case/check-sof-logger.sh b/test-case/check-sof-logger.sh index 23c9a5d5..c7fc2217 100755 --- a/test-case/check-sof-logger.sh +++ b/test-case/check-sof-logger.sh @@ -28,6 +28,7 @@ source "${TOPDIR}"/case-lib/lib.sh func_opt_parse_option "$@" start_test +save_alsa_state # check sof-logger location type -a sof-logger || @@ -72,7 +73,7 @@ sof_alsa_card_found() # - /proc/asound/sofsoundwire/id # - /proc/asound/sofhdadsp/id # - https://github.com/thesofproject/sof-test/issues/1243 - # Designed to support multiple SOF instances with SOF probes + # Designed to support multiple SOF instances with SOF probes for i in /proc/asound/sof*/id; do if test -e "$i"; then return 0; fi done diff --git a/test-case/check-suspend-resume-with-audio.sh b/test-case/check-suspend-resume-with-audio.sh index 40397a54..c20f363b 100755 --- a/test-case/check-suspend-resume-with-audio.sh +++ b/test-case/check-suspend-resume-with-audio.sh @@ -63,6 +63,7 @@ func_lib_check_sudo tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # overwrite the subscript: test-case LOG_ROOT environment @@ -139,4 +140,3 @@ do dlogi "Killing $cmd_args" kill -9 $process_id || true done - diff --git a/test-case/check-userspace-cardinfo.sh b/test-case/check-userspace-cardinfo.sh index 1a1c36c8..3a5a6aca 100755 --- a/test-case/check-userspace-cardinfo.sh +++ b/test-case/check-userspace-cardinfo.sh @@ -23,6 +23,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state # check pulseaudio runs properly or not func_lib_check_pa || die "Please check whether pulseaudio runs correctly or not" diff --git a/test-case/check-userspace-paplay.sh b/test-case/check-userspace-paplay.sh index 4bfc158f..2d7dbb7c 100755 --- a/test-case/check-userspace-paplay.sh +++ b/test-case/check-userspace-paplay.sh @@ -45,6 +45,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state round_cnt=${OPT_VAL['r']} duration=${OPT_VAL['d']} diff --git a/test-case/check-userspace-parecord.sh b/test-case/check-userspace-parecord.sh index 2b660a49..c757de72 100755 --- a/test-case/check-userspace-parecord.sh +++ b/test-case/check-userspace-parecord.sh @@ -52,6 +52,7 @@ rate=${OPT_VAL['R']} channel=${OPT_VAL['C']} start_test +save_alsa_state [[ -e $file ]] || { dlogw "$file does not exist, use /dev/zero as dummy playback source" && file=/dev/null; } diff --git a/test-case/check-volume-levels.sh b/test-case/check-volume-levels.sh index b421dff1..0486f849 100755 --- a/test-case/check-volume-levels.sh +++ b/test-case/check-volume-levels.sh @@ -59,6 +59,7 @@ ARECORD_WAV2=$(mktemp --suffix=.wav) ARECORD_WAV3=$(mktemp --suffix=.wav) start_test +save_alsa_state # # Main test procedure diff --git a/test-case/check-xrun-injection.sh b/test-case/check-xrun-injection.sh index 30a2b045..02d1d2e0 100755 --- a/test-case/check-xrun-injection.sh +++ b/test-case/check-xrun-injection.sh @@ -43,6 +43,7 @@ count=${OPT_VAL['c']} interval=${OPT_VAL['i']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect setup_kernel_check_point diff --git a/test-case/latency-metrics.sh b/test-case/latency-metrics.sh index 0a288177..29696654 100755 --- a/test-case/latency-metrics.sh +++ b/test-case/latency-metrics.sh @@ -274,6 +274,7 @@ main() setup_kernel_check_point start_test + save_alsa_state logger_disabled || func_lib_start_log_collect diff --git a/test-case/multiple-pause-resume.sh b/test-case/multiple-pause-resume.sh index e79701e2..989bdff2 100755 --- a/test-case/multiple-pause-resume.sh +++ b/test-case/multiple-pause-resume.sh @@ -56,6 +56,7 @@ rnd_max=${OPT_VAL['a']} rnd_range=$((rnd_max - rnd_min)) start_test +save_alsa_state [[ $rnd_range -le 0 ]] && dlogw "Error random range scope [ min:$rnd_min - max:$rnd_max ]" && exit 2 @@ -140,7 +141,7 @@ func_pause_resume_pipeline() } # to prevent infinite loop, 5 second per a repeat is plenty -max_wait_time=$((5 * repeat_count)) +max_wait_time=$((5 * repeat_count)) for i in $(seq 1 "$loop_count") do @@ -203,4 +204,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/multiple-pipeline.sh b/test-case/multiple-pipeline.sh index b7dd22d0..b31673c3 100755 --- a/test-case/multiple-pipeline.sh +++ b/test-case/multiple-pipeline.sh @@ -61,6 +61,7 @@ tplg=${OPT_VAL['t']} f_arg=${OPT_VAL['f']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect # skip the Echo Reference pipeline @@ -222,4 +223,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/simultaneous-playback-capture.sh b/test-case/simultaneous-playback-capture.sh index d1e3189f..e59f4836 100755 --- a/test-case/simultaneous-playback-capture.sh +++ b/test-case/simultaneous-playback-capture.sh @@ -41,6 +41,7 @@ wait_time=${OPT_VAL['w']} loop_cnt=${OPT_VAL['l']} start_test +save_alsa_state # get 'both' pcm, it means pcm have same id with different type declare -A tmp_id_lst @@ -120,4 +121,3 @@ do # check kernel log for each iteration to catch issues sof-kernel-log-check.sh "$KERNEL_CHECKPOINT" || die "Caught error in kernel log" done - diff --git a/test-case/test-speaker.sh b/test-case/test-speaker.sh index 6e0df8ab..7ddab0ac 100755 --- a/test-case/test-speaker.sh +++ b/test-case/test-speaker.sh @@ -32,6 +32,7 @@ func_opt_parse_option "$@" tplg=${OPT_VAL['t']} start_test +save_alsa_state logger_disabled || func_lib_start_log_collect func_pipeline_export "$tplg" "type:playback" diff --git a/test-case/verify-bootsequence.sh b/test-case/verify-bootsequence.sh index 5fd77b3d..f58d71e3 100755 --- a/test-case/verify-bootsequence.sh +++ b/test-case/verify-bootsequence.sh @@ -33,6 +33,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state main() { diff --git a/test-case/verify-pcm-list.sh b/test-case/verify-pcm-list.sh index 88abb8d4..1197949f 100755 --- a/test-case/verify-pcm-list.sh +++ b/test-case/verify-pcm-list.sh @@ -27,6 +27,7 @@ func_opt_parse_option "$@" tplg=${OPT_VAL['t']} start_test +save_alsa_state tplg_path=$(func_lib_get_tplg_path "$tplg") || die "No available topology for this test case" diff --git a/test-case/verify-sof-firmware-load.sh b/test-case/verify-sof-firmware-load.sh index d6866a44..555b59d7 100755 --- a/test-case/verify-sof-firmware-load.sh +++ b/test-case/verify-sof-firmware-load.sh @@ -22,6 +22,7 @@ func_opt_parse_option "$@" disable_kernel_check_point start_test +save_alsa_state cmd="journalctl_cmd" diff --git a/test-case/verify-ucm-config.sh b/test-case/verify-ucm-config.sh index 1d7e7f09..ae9154c8 100755 --- a/test-case/verify-ucm-config.sh +++ b/test-case/verify-ucm-config.sh @@ -28,6 +28,7 @@ func_opt_parse_option "$@" setup_kernel_check_point start_test +save_alsa_state declare -A verb_array diff --git a/test-case/volume-basic-test.sh b/test-case/volume-basic-test.sh index 1f013b2c..5e3962f7 100755 --- a/test-case/volume-basic-test.sh +++ b/test-case/volume-basic-test.sh @@ -38,6 +38,7 @@ tplg=${OPT_VAL['t']} maxloop=${OPT_VAL['l']} start_test +save_alsa_state func_error_exit() {