@@ -752,17 +752,87 @@ 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+ # shellcheck disable=SC2154
804+ if ! sox -n -r " $rate " -c " $channel " noise.wav synth " $duration " white; then
805+ printf ' %s' " Error: sox command failed." >&2
806+ return 1
807+ fi
808+ dlogc " tinyplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS -D $card_nr -d $dev_nr -i wav noise.wav"
809+ # shellcheck disable=SC2086
810+ tinyplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS -D " $card_nr " -d " $dev_nr " -i wav noise.wav
811+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
812+ dlogc " aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS $* "
813+ # shellcheck disable=SC2086
814+ aplay $SOF_ALSA_OPTS $SOF_APLAY_OPTS " $@ "
815+ else
816+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
817+ fi
760818}
819+
761820arecord_opts ()
762821{
763- dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
764- # shellcheck disable=SC2086
765- arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
822+
823+ if [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
824+ # shellcheck disable=SC2154
825+ extract_format_number " $fmt_elem "
826+ dlogc " tinycap $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $file -D $card_nr -d $dev_nr -c $channel -t $duration -r $rate -b $format "
827+ # shellcheck disable=SC2086
828+ tinycap $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $file " -D " $card_nr " -d " $dev_nr " -c " $channel " -t " $duration " -r " $rate " -b " $format "
829+ elif [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
830+ dlogc " arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS $* "
831+ # shellcheck disable=SC2086
832+ arecord $SOF_ALSA_OPTS $SOF_ARECORD_OPTS " $@ "
833+ else
834+ printf ' %s' " Unknown alsa tool: $SOF_ALSA_TOOL "
835+ fi
766836}
767837
768838die ()
@@ -952,7 +1022,7 @@ is_ipc4()
9521022logger_disabled ()
9531023{
9541024 # Disable logging when available...
955- if [ ${OPT_VAL['s']} -eq 0 ]; then
1025+ if [ " ${OPT_VAL['s']} " -eq 0 ]; then
9561026 return 0
9571027 fi
9581028
@@ -1063,15 +1133,31 @@ set_alsa_settings()
10631133reset_sof_volume ()
10641134{
10651135 # 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
1136+ if [[ " $SOF_ALSA_TOOL " = " alsa" ]]; then
1137+ amixer -Dhw:0 scontrols | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1138+
1139+ while read -r mixer_name
1140+ do
1141+ if is_ipc4; then
1142+ amixer -Dhw:0 -- sset " $mixer_name " 100%
1143+ else
1144+ amixer -Dhw:0 -- sset " $mixer_name " 0dB
1145+ fi
1146+ done
1147+ elif [[ " $SOF_ALSA_TOOL " = " tinyalsa" ]]; then
1148+ tinymix -D0 controls | sed -e " s/^.*'\(.*\)'.*/\1/" | grep -E ' PGA|gain' |
1149+
1150+ while read -r mixer_name
1151+ do
1152+ if is_ipc4; then
1153+ tinymix -D0 set " $mixer_name " 100%
1154+ else
1155+ tinymix -D0 set " $mixer_name " 0dB
1156+ fi
1157+ done
1158+ else
1159+ echo " Unknown alsa tool $SOF_ALSA_TOOL "
1160+ fi
10751161}
10761162
10771163DO_PERF_ANALYSIS=0
0 commit comments