@@ -752,17 +752,85 @@ func_lib_check_pa()
752752# However, 1. arrays would complicate the user interface 2. ALSA does not
753753# seem to need arguments with whitespace or globbing characters.
754754
755+ # SOF_ALSA_TOOL:
756+ # This option is used for selecting tool for testing,
757+ # So far, supported tools are 'alsa' and 'tinyalsa'
758+ # To select appropriate tool, set SOF_ALSA_TOOL to one of above
759+ # before using 'aplay_opts' or 'arecord_opts' function.
760+ # Default is SOF_ALSA_TOOL='alsa'
761+
762+
763+ # Function to extract the card number and device number from $dev option (e.g., hw:0,10)
764+ parse_audio_device () {
765+ # Extract the card number (e.g., "0" from hw:0,10)
766+ card_nr=$( printf ' %s' " $1 " | cut -d ' :' -f2 | cut -d ' ,' -f1)
767+
768+ # Extract the device number (e.g., "10" from hw:0,10)
769+ dev_nr=$( printf ' %s' " $1 " | cut -d ' ,' -f2)
770+ }
771+
772+ # Function to extract the numeric format value from the PCM sample formats
773+ # There is passes PCM sample format while using ALSA tool (arecord)
774+ # While using TinyALSA (tinycap -b) we need to convert PCM sample fomrat to bits.
775+ extract_format_number () {
776+ # (e.g., extracting '16' from 'S16_LE')
777+ format=$( printf ' %s' " $1 " | grep ' [0-9]\+' -o)
778+ }
779+
780+ # Initialize the parameters using for audio testing.
781+ # shellcheck disable=SC2034
782+ initialize_audio_params ()
783+ {
784+ local idx=" $1 "
785+
786+ channel=$( func_pipeline_parse_value " $idx " channel)
787+ rate=$( func_pipeline_parse_value " $idx " rate)
788+ fmts=$( func_pipeline_parse_value " $idx " fmt)
789+ dev=$( func_pipeline_parse_value " $idx " dev)
790+ pcm=$( func_pipeline_parse_value " $idx " pcm)
791+ type=$( func_pipeline_parse_value " $idx " type)
792+ snd=$( func_pipeline_parse_value " $idx " snd)
793+
794+ : " ${SOF_ALSA_TOOL:= " alsa" } "
795+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
796+ parse_audio_device " $dev "
797+ fi
798+ }
799+
755800aplay_opts ()
756801{
757- dlogc " aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
758- # shellcheck disable=SC2086
759- aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS " $@ "
802+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
803+ dlogc " tinyplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
804+ # shellcheck disable=SC2154
805+ if ! sox -n -r " $rate " -c " $channel " noise.wav synth " $duration " white; then
806+ printf ' %s' " Error: sox command failed." >&2
807+ exit 1
808+ fi
809+ tinyplay " $SOF_ALSA_OPTS " " $SOF_APLAY_OPTS " -D " $card_nr " -d " $dev_nr " -i wav noise.wav
810+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
811+ dlogc " aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
812+ # shellcheck disable=SC2086
813+ aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS " $@ "
814+ else
815+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
816+ fi
760817}
818+
761819arecord_opts ()
762820{
763- dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
764- # shellcheck disable=SC2086
765- arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
821+
822+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
823+ dlogc " tinycap $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
824+ # shellcheck disable=SC2154
825+ extract_format_number " $fmt_elem "
826+ tinycap " $SOF_ALSA_OPTS " " $SOF_ARECORD_OPTS " " $file " -D " $card_nr " -d " $dev_nr " -c " $channel " -t " $duration " -r " $rate " -b " $format "
827+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
828+ dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
829+ # shellcheck disable=SC2086
830+ arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
831+ else
832+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
833+ fi
766834}
767835
768836die ()
@@ -952,7 +1020,7 @@ is_ipc4()
9521020logger_disabled ()
9531021{
9541022 # Disable logging when available...
955- if [ ${OPT_VAL['s']} -eq 0 ]; then
1023+ if [ " ${OPT_VAL['s']} " -eq 0 ]; then
9561024 return 0
9571025 fi
9581026
@@ -1063,15 +1131,31 @@ set_alsa_settings()
10631131reset_sof_volume ()
10641132{
10651133 # set all PGA* volume to 0dB
1066- amixer -Dhw:0 scontrols | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1067- while read -r mixer_name
1068- do
1069- if is_ipc4; then
1070- amixer -Dhw:0 -- sset " $mixer_name " 100%
1071- else
1072- amixer -Dhw:0 -- sset " $mixer_name " 0dB
1073- fi
1074- done
1134+ if [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
1135+ amixer -Dhw:0 scontrols | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1136+
1137+ while read -r mixer_name
1138+ do
1139+ if is_ipc4; then
1140+ amixer -Dhw:0 -- sset " $mixer_name " 100%
1141+ else
1142+ amixer -Dhw:0 -- sset " $mixer_name " 0dB
1143+ fi
1144+ done
1145+ elif [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
1146+ tinymix -D0 controls | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1147+
1148+ while read -r mixer_name
1149+ do
1150+ if is_ipc4; then
1151+ tinymix -D0 set " $mixer_name " 100%
1152+ else
1153+ tinymix -D0 set " $mixer_name " 0dB
1154+ fi
1155+ done
1156+ else
1157+ echo " Unknown alsa tool $SOF_ALSA_TOOL "
1158+ fi
10751159}
10761160
10771161DO_PERF_ANALYSIS=0
0 commit comments