@@ -752,17 +752,83 @@ 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 tiny asla (tinycap) we need to convert PCM sample fomrat to bites
775+ # suporrted by tiny alsa -b parameter.
776+ extract_format_number () {
777+ # (e.g., extracting '16' from 'S16_LE')
778+ format=$( printf ' %s' " $1 " | grep ' [0-9]\+' -o)
779+ }
780+
781+ # Initialize the parameters using for audio testing.
782+ # shellcheck disable=SC2034
783+ initialize_audio_params ()
784+ {
785+ local idx=" $1 "
786+
787+ channel=$( func_pipeline_parse_value " $idx " channel)
788+ rate=$( func_pipeline_parse_value " $idx " rate)
789+ fmts=$( func_pipeline_parse_value " $idx " fmt)
790+ dev=$( func_pipeline_parse_value " $idx " dev)
791+ pcm=$( func_pipeline_parse_value " $idx " pcm)
792+ type=$( func_pipeline_parse_value " $idx " type)
793+ snd=$( func_pipeline_parse_value " $idx " snd)
794+
795+ : " ${SOF_ALSA_TOOL:= " alsa" } "
796+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
797+ parse_audio_device " $dev "
798+ fi
799+ }
800+
755801aplay_opts ()
756802{
757- dlogc " aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
758- # shellcheck disable=SC2086
759- aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS " $@ "
803+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
804+ dlogc " tinyplay $* "
805+ # shellcheck disable=SC2154
806+ sox -n -r " $rate " -c " $channel " noise.wav synth " $duration " white
807+ tinyplay -D " $card_nr " -d " $dev_nr " -i wav noise.wav
808+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
809+ dlogc " aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
810+ # shellcheck disable=SC2086
811+ aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS " $@ "
812+ else
813+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
814+ fi
760815}
816+
761817arecord_opts ()
762818{
763- dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
764- # shellcheck disable=SC2086
765- arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
819+
820+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
821+ dlogc " tinycap $* "
822+ # shellcheck disable=SC2154
823+ extract_format_number " $fmt_elem "
824+ tinycap " $file " -D " $card_nr " -d " $dev_nr " -c " $channel " -t " $duration " -r " $rate " -b " $format "
825+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
826+ dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
827+ # shellcheck disable=SC2086
828+ arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
829+ else
830+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
831+ fi
766832}
767833
768834die ()
@@ -952,7 +1018,7 @@ is_ipc4()
9521018logger_disabled ()
9531019{
9541020 # Disable logging when available...
955- if [ ${OPT_VAL['s']} -eq 0 ]; then
1021+ if [ " ${OPT_VAL['s']} " -eq 0 ]; then
9561022 return 0
9571023 fi
9581024
@@ -1063,15 +1129,31 @@ set_alsa_settings()
10631129reset_sof_volume ()
10641130{
10651131 # 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
1132+ if [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
1133+ amixer -Dhw:0 scontrols | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1134+
1135+ while read -r mixer_name
1136+ do
1137+ if is_ipc4; then
1138+ amixer -Dhw:0 -- sset " $mixer_name " 100%
1139+ else
1140+ amixer -Dhw:0 -- sset " $mixer_name " 0dB
1141+ fi
1142+ done
1143+ elif [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
1144+ tinymix -D0 controls | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1145+
1146+ while read -r mixer_name
1147+ do
1148+ if is_ipc4; then
1149+ tinymix -D0 set " $mixer_name " 100%
1150+ else
1151+ tinymix -D0 set " $mixer_name " 0dB
1152+ fi
1153+ done
1154+ else
1155+ echo " Unknown alsa tool $SOF_ALSA_TOOL "
1156+ fi
10751157}
10761158
10771159DO_PERF_ANALYSIS=0
0 commit comments