-
Notifications
You must be signed in to change notification settings - Fork 61
Expand file tree
/
Copy pathcheck-alsabat.sh
More file actions
executable file
·201 lines (159 loc) · 5.93 KB
/
check-alsabat.sh
File metadata and controls
executable file
·201 lines (159 loc) · 5.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#!/usr/bin/env bash
##
## Case Name: check alsabat
##
## Preconditions:
## This test case requires physical loopback between playback and capture.
## playback <=====> capture
## nocodec : no need to use hw loopback cable, It support DSP loopback by quirk
##
## Description:
## Run two alsabat instances concurrently, one on each specified PCM: playback
## and capture.
##
## Warning: as of January 2024, "man alsabat" is incomplete and
## documents only the "single instance" mode where a single alsabat
## process performs both playback and capture.
##
## Case step:
## 1. Specify the pcm IDs for playback and catpure
## 3. run alsabat test
##
## Expect result:
## The return value of alsabat is 0
##
# remove the existing alsabat wav files
rm -f /tmp/bat.wav.*
# shellcheck source=case-lib/lib.sh
source "$(dirname "${BASH_SOURCE[0]}")"/../case-lib/lib.sh
OPT_NAME['p']='pcm_p' OPT_DESC['p']='pcm for playback. Example: hw:0,0'
OPT_HAS_ARG['p']=1 OPT_VAL['p']=''
OPT_NAME['C']='channel_c' OPT_DESC['C']='channel number for capture.'
OPT_HAS_ARG['C']=1 OPT_VAL['C']='1'
OPT_NAME['N']='channel_p' OPT_DESC['N']='channel number for playback.'
OPT_HAS_ARG['N']=1 OPT_VAL['N']='2'
OPT_NAME['r']='rate' OPT_DESC['r']='sample rate'
OPT_HAS_ARG['r']=1 OPT_VAL['r']=48000
OPT_NAME['c']='pcm_c' OPT_DESC['c']='pcm for capture. Example: hw:1,0'
OPT_HAS_ARG['c']=1 OPT_VAL['c']=''
OPT_NAME['f']='format' OPT_DESC['f']='target format'
OPT_HAS_ARG['f']=1 OPT_VAL['f']="S16_LE"
OPT_NAME['F']='frequency' OPT_DESC['F']='target frequency'
OPT_HAS_ARG['F']=1 OPT_VAL['F']=821
OPT_NAME['k']='sigmak' OPT_DESC['k']='sigma k value'
OPT_HAS_ARG['k']=1 OPT_VAL['k']=2.1
OPT_NAME['n']='frames' OPT_DESC['n']='test frames'
OPT_HAS_ARG['n']=1 OPT_VAL['n']=240000
OPT_NAME['s']='sof-logger' OPT_DESC['s']="Open sof-logger trace the data will store at $LOG_ROOT"
OPT_HAS_ARG['s']=0 OPT_VAL['s']=1
func_opt_parse_option "$@"
pcm_p=${OPT_VAL['p']}
pcm_c=${OPT_VAL['c']}
rate=${OPT_VAL['r']}
channel_c=${OPT_VAL['C']}
channel_p=${OPT_VAL['N']}
format=${OPT_VAL['f']}
frequency=${OPT_VAL['F']}
sigmak=${OPT_VAL['k']}
frames=${OPT_VAL['n']}
start_test
if [ "$pcm_p" = "" ]||[ "$pcm_c" = "" ];
then
dloge "No playback or capture PCM is specified. Skip the alsabat test"
exit 2
fi
check_locale_for_alsabat
logger_disabled || func_lib_start_log_collect
set_alsa
function __upload_wav_file
{
# upload the alsabat wav file
for file in /tmp/bat.wav.*
do
# alsabat has a bug where it creates an empty record in playback
# mode
if test -s "$file"; then
cp "$file" "$LOG_ROOT/"
fi
done
}
# Set default pipewire sink and source
set_pcms_in_pipewire()
{
set_default_pipewire_sink_for_alsa_pcm "$pcm_p"
set_default_pipewire_source_for_alsa_pcm "$pcm_c"
}
check_the_pcms()
{
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}"
}
check_the_pcms_with_pipewire()
{
aplay -D pipewire -d 1 /dev/zero -q || die "Failed to play on pipewire"
arecord -D pipewire -d 1 /dev/null -q || die "Failed to capture on pipewire"
}
run_test_on_pipewire()
{
# Set correct sink and source in pipewire
set_pcms_in_pipewire
# check the PCMs before alsabat test
check_the_pcms_with_pipewire
# alsabat tests
dlogc "alsabat -P pipewire --standalone -n $frames -r $rate -c $channel_p -f $format -F $frequency -k $sigmak"
alsabat -P pipewire --standalone -n "${frames}" -c "${channel_p}" -r "${rate}" -f "${format}" -F "${frequency}" -k "${sigmak}" & playPID=$!
dlogc "alsabat -C pipewire --standalone -n $frames -c $channel_p -r $rate -f $format -F $frequency -k $sigmak"
alsabat -C pipewire --standalone -n "${frames}" -c "${channel_p}" -r "${rate}" -f "${format}" -F "${frequency}" -k "${sigmak}" || {
# upload failed wav file
__upload_wav_file
exit 1
}
}
run_test_on_alsa_direct_mode()
{
# check the PCMs before alsabat test
check_the_pcms
# alsabat test
# BT offload PCMs also support mono playback.
dlogc "alsabat -P$pcm_p --standalone -n $frames -r $rate -c $channel_p -f $format -F $frequency -k $sigmak"
alsabat "-P${pcm_p}" --standalone -n "${frames}" -c "${channel_p}" -r "${rate}" -f "${format}" -F "${frequency}" -k "${sigmak}" & playPID=$!
# playback may have low latency, add one second delay to aviod recording zero at beginning.
sleep 1
# Select the first card
first_card_name=$(aplay -l | awk '/^card ([0-9]+)/ {print $3; exit}')
# dump amixer contents always.
# Good case amixer settings is for reference, bad case for debugging.
amixer -c "${first_card_name}" contents > "$LOG_ROOT"/amixer_settings.txt
# We use different USB sound cards in CI, part of them only support 1 channel for capture,
# so make the channel as an option and config it in alsabat-playback.csv
dlogc "alsabat -C$pcm_c -c $channel_c -r $rate -f $format -F $frequency -k $sigmak"
alsabat "-C${pcm_c}" -c "${channel_c}" -r "${rate}" -f "${format}" -F "${frequency}" -k "${sigmak}" || {
# upload failed wav file
__upload_wav_file
exit 1
}
wait $playPID
}
main()
{
start_test
if [ "$SOF_TEST_PIPEWIRE" == true ] && [[ "$TPLG" == *rt712* ]]; then
skip_test "Skipping: test not supported for RT712 configuration"
fi
if [ "$pcm_p" = "" ]||[ "$pcm_c" = "" ];
then
dloge "No playback or capture PCM is specified. Skip the alsabat test"
exit 2
fi
check_locale_for_alsabat
logger_disabled || func_lib_start_log_collect
set_alsa
if [ "$SOF_TEST_PIPEWIRE" == true ]; then
run_test_on_pipewire
else
run_test_on_alsa_direct_mode
fi
}
{
main "$@"; exit "$?"
}