Repository navigation
refine alsabat test script - #401
keqiaozhang wants to merge 3 commits into
Conversation
marc-hb
left a comment
There was a problem hiding this comment.
Thanks for a shellcheck-clean PR! Saves a lot of review time.
Any idea about the many check-alsabat-headset-playback.sh failures in https://sof-ci.01.org/softestpr/PR401/build216/devicetest/ ? This doesn't look great in an alsabat PR :-(
I think you can write a much less vague PR title and summary than "refine", just summarize the commit messages.
| uname -r |grep "nocodec" >> /dev/null && | ||
| echo "nocodec" | ||
| } | ||
|
|
There was a problem hiding this comment.
Avoid strings when they're not needed.
nocodec_mode()
{
uname -r | grep -q "nocodec"
}
...
if nocodec_mode; then
...
``There was a problem hiding this comment.
If running uname -r were time-consuming (it's not!) then you could want to save and re-use the result in a pseudo-boolean variable with this longer code.
I repeat this is NOT needed here, just an example for other cases.
codec_mode() # avoids one negation
{
if time_consuming_uname -r | grep -q "nocodec"; then
printf 'false'
else
printf 'true'
fi
}
...
codec_m=$(codec_mode)
...
if "$codec_m"; then # (this runs the $codec_m command)
..
fi
...
"$codec_m" || ...
There was a problem hiding this comment.
I do not see any update for this. but I have same idea with this.
| if [ "$codec_mode" != "nocodec" ]; then | ||
| # USB sound card only supports 1 channel S16_LE format. | ||
| format_c=S16_LE | ||
| channel_c=1 |
There was a problem hiding this comment.
It's a bit strange to run multiple times the same format on nocodec mode. Can you override and reduce the $fmts list instead before the loop? This will make the loop not care about special cases and simpler.
There was a problem hiding this comment.
nocodec tplgs also support different formats like s16_le/s24_le and s32_le, not passthrough mode. so we can check each format in the loop.
There was a problem hiding this comment.
Do we real need alsabat for all fmts?
There was a problem hiding this comment.
Checking all formats available is good idea. but S24_LE is always ignored, isn't it?
There was a problem hiding this comment.
Yes,S24_4LE is not supported by alsabat
| find /tmp -maxdepth 1 -type f -name "bat.wav.*" -size +0 -exec cp {} "$LOG_ROOT/" \; | ||
| exit 1 | ||
| } | ||
| timeout 5 tail --pid=$alsabat_P -f /dev/null || die "Failed to stop alsabat playback" |
There was a problem hiding this comment.
The timeout tail trick seems to work but it's not intuitive to use the tail command without using its main feature. We already discussed an alternative in this other review: #316 (comment)
There was a problem hiding this comment.
The "Failed to stop alsabat" message is misleading, it sounds like kill failed. You mean: "alsabat -P failed to stop"
|
|
||
| dlogc "alsabat -C $pcm_c -F $frequency -f $format_c -c $channel_c -r $rate" | ||
| alsabat -C "$pcm_c" -F "$frequency" -f "$format_c" -c "$channel_c" -r "$rate" || { | ||
| find /tmp -maxdepth 1 -type f -name "bat.wav.*" -size +0 -exec cp {} "$LOG_ROOT/" \; |
There was a problem hiding this comment.
Sometimes it's good to have a function with a single command only to give a better and clearer name to that command. I think "upload_wav_file" was a very readable name.
PS: same with once-off constants: inlining them makes the code shorter but not always easier to read. It depends.
There was a problem hiding this comment.
You probably want :
alsabat ... || {
find ... || true
exit 1
}... because of set -e. When find fails, it fails with an undocumented return value (!) which could cause serious issues like #385
There was a problem hiding this comment.
Good suggestion, I have added a new function in lib.sh to upload wav files.
16c910f to
cfcf979
Compare
| if [ "$codec_mode" != "nocodec" ]; then | ||
| # USB sound card only supports 1 channel S16_LE format. | ||
| format_c=S16_LE | ||
| channel_c=1 |
There was a problem hiding this comment.
Do we real need alsabat for all fmts?
| local file=$2 | ||
|
|
||
| find "$dir" -maxdepth 1 -type f -name "$file" -size +0 -exec cp {} "$LOG_ROOT/" \; | ||
| return 0 |
There was a problem hiding this comment.
The return 0 will become a no-op when this script is converted to set -e.
I recommend you remove it and you invoke the function like this below:
func_upload_wav_file "/tmp" "bat.wav.*" || trueThis gives the caller of the function the choice.
(Cc: @RuiqingX )
| func_upload_wav_file "/tmp" "bat.wav.*" | ||
| exit 1 | ||
| } | ||
| wait $alsabatPID || die "alsabat -P failed to stop" |
There was a problem hiding this comment.
It's a bit more complicated, sorry I should have spotted this the first time. To be correct this requires two different error messages. Something like this:
wait $alsabatPID && ret=$?
if [ $ret = 124 ]; then
die "alsabat -P failed to stop - we timed it out"
elif [ $ret != 0 ] ; then
die "alsabat -P failed, returned $ret"
fiUntested code, please double-check in man timeout and test by this code by temporarily setting a very short timeout or wrong parameters.
There was a problem hiding this comment.
Right, if the command times out, and --preserve-status is not set, then exit with status 124.
There was a problem hiding this comment.
Untested code, please double-check in man timeout and test by this code by temporarily setting a very short timeout or wrong parameters.
With a clearer, Monday morning brain I see the untested code I gave you was wrong: ret never gets initialized when wait fails because of short circuit evaluation. I'm afraid this means you didn't inject any one-line error in the alsabat command, didn't test it locally and never saw these messages printed. This is worrying.
There was a problem hiding this comment.
@marc-hb , I did performed the negative tests to verify this part of code, tried with wrong channel count "3" in alsabat command and returned 1. if alsabat -P does not stop within the specified time, it will return 124. so which scenario you are talking above?
There was a problem hiding this comment.
I mean this:
ret=0
(exit 124) && ret=$?
echo $ret
=> 0There was a problem hiding this comment.
I think we are overaction here. just put the alsabat -P in background and use wait to check the exit code, if exit code is non-zero, then exit with "alsabat -P failure".
There was a problem hiding this comment.
AFAIK @keqiaozhang didn't recommend to remove the timeout command, he only recommended to handle timeout errors exactly like non-timeout errors.
Question for people with alsabat experience: can alsabat get stuck when something goes wrong?
| wait $alsabatPID || die "alsabat -P failed to stop" | ||
| done | ||
|
|
||
| exit 0 No newline at end of file |
There was a problem hiding this comment.
missing newline. There's probably a setting in your editor that you can change to avoid this.
| [[ $(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" | ||
| [[ $(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" |
There was a problem hiding this comment.
It's not something you're changing but it looks like this code was wrong. Can you take the opportunity to try to fix it and change it to:
aplay -Dplug"$pcm_p" -d 1 /dev/zero -q || die "Failed to play on PCM: $pcm_p"
There was a problem hiding this comment.
You are right, die will never be executed.
3350b5d to
5a04258
Compare
| [[ $(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" | ||
| 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" |
There was a problem hiding this comment.
this looks like an unrelated cleanup?
There was a problem hiding this comment.
I requested this (serious!) bug fix, see earlier comments. Agreed it should ideally be in a different commit.
There was a problem hiding this comment.
i have separated it as a new commit.
| else | ||
| # USB sound card only supports 1 channel S16_LE format. | ||
| format_c=S16_LE | ||
| channel_c=1 |
There was a problem hiding this comment.
You guys need to buy better USB cards, this is not acceptable for channel swap tests.
There was a problem hiding this comment.
Same idea here, we are looking for new cards now.
There was a problem hiding this comment.
Internal issue 601 just filed about new USB cards, thanks @singalsu.
There was a problem hiding this comment.
Thank you all. Let's hold this PR. Now we are trying to find a new USB cards w/ stereo capture support, then we can remove the plug completely.
| exit 1 | ||
| } | ||
| wait $alsabatPID && ret=$? | ||
| if [ $ret == 124 ]; then |
There was a problem hiding this comment.
The meaning of 124 is (again) in the man timeout page, in a previous review command and much better it is on the very next line: "alsabat -P failed to stop, we timed it out."
| fi | ||
|
|
||
| dlogc "alsabat -P $pcm_p --standalone -n $frames -F $frequency -c $channel -r $rate -f $format" | ||
| timeout -k 2 6 alsabat -P "$pcm_p" --standalone -n "$frames" -F "$frequency" -c "$channel" \ |
There was a problem hiding this comment.
what does 2 6 mean? seriously add comments on what this does.
There was a problem hiding this comment.
The meanings of 2 and 6 are at the top of the man timeout page. I don't think we need to copy/paste into this script the start of the man page of every unusual command but maybe we can have the --long options like this:
timeout --kill-after 2 6 alsabat ...
| dlogc "alsabat -P $pcm_p --standalone -n $frames -F $frequency -c $channel -r $rate -f $format" | ||
| timeout -k 2 6 alsabat -P "$pcm_p" --standalone -n "$frames" -F "$frequency" -c "$channel" \ | ||
| -r "$rate" -f "$format" & alsabatPID=$! | ||
| # playback may have low latency, add one second delay to aviod recording zero at beginning. |
There was a problem hiding this comment.
Still concerned about the lack of negative wait testing mentioned at
#401 (comment)
| exit 1 | ||
| } | ||
| wait $alsabatPID && ret=$? | ||
| if [ $ret == 124 ]; then |
There was a problem hiding this comment.
The meaning of 124 is (again) in the man timeout page, in a previous review command and much better it is on the very next line: "alsabat -P failed to stop, we timed it out."
| fi | ||
|
|
||
| dlogc "alsabat -P $pcm_p --standalone -n $frames -F $frequency -c $channel -r $rate -f $format" | ||
| timeout -k 2 6 alsabat -P "$pcm_p" --standalone -n "$frames" -F "$frequency" -c "$channel" \ |
There was a problem hiding this comment.
The meanings of 2 and 6 are at the top of the man timeout page. I don't think we need to copy/paste into this script the start of the man page of every unusual command but maybe we can have the --long options like this:
timeout --kill-after 2 6 alsabat ...
| [[ $(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" | ||
| 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" |
There was a problem hiding this comment.
I requested this (serious!) bug fix, see earlier comments. Agreed it should ideally be in a different commit.
add 2 functions to lib.sh. The first is to check whether sof is running in nocodec mode. The second is to add a function to upload wav files. Signed-off-by: Zhang Keqiao <keqiao.zhang@linux.intel.com>
5a04258 to
b2313f2
Compare
remove use of plughw to run alsabat test at hw level driectly without any conversions done by alsa-lib and refine the script. Signed-off-by: Zhang Keqiao <keqiao.zhang@linux.intel.com>
Use double quote to prevent globbing and fix the logic issue or die will never be executed. Signed-off-by: Zhang Keqiao <keqiao.zhang@linux.intel.com>
xiulipan
left a comment
There was a problem hiding this comment.
Some update is needed. Please check
| return 0 | ||
| } | ||
|
|
||
| func_nocodec_mode() |
There was a problem hiding this comment.
Can we dump the result at first and only use the variable later? Three is no need to check this mode multiple time
There was a problem hiding this comment.
Can we dump the result at first and only use the variable later?
This would be premature optimization. This command is only forking two additional and small processes per alsabat test, that's negligible.
| uname -r |grep "nocodec" >> /dev/null && | ||
| echo "nocodec" | ||
| } | ||
|
|
There was a problem hiding this comment.
I do not see any update for this. but I have same idea with this.
| return 0 | ||
| } | ||
|
|
||
| func_nocodec_mode() |
There was a problem hiding this comment.
Can we dump the result at first and only use the variable later?
This would be premature optimization. This command is only forking two additional and small processes per alsabat test, that's negligible.
| func_upload_wav_file() | ||
| { | ||
| local dir=$1 | ||
| local file=$2 |
There was a problem hiding this comment.
While double quotes are technically not required for assignments it's safer and good role modelling to just always quote.
| exit 2 | ||
| fi | ||
|
|
||
| pcmid_p=${pcm_p:-1} |
There was a problem hiding this comment.
Same as above, please double quote for consistency.
| # playback may have low latency, add one second delay to aviod recording zero at beginning. | ||
| sleep 1 | ||
|
|
||
| if func_nocodec_mode; then |
There was a problem hiding this comment.
if nocodec_mode; then would read like plain English.
| } | ||
| # check the alsabat -P exit code | ||
| if ! wait $alsabatPID; then | ||
| die "alsabat -P failure" |
There was a problem hiding this comment.
No need for the ! negation
wait $alsabatPID || die "alsabat $alsabatPID failed"| func_upload_wav_file "/tmp" "bat.wav.*" | ||
| exit 1 | ||
| } | ||
| wait $alsabatPID || die "alsabat -P failed to stop" |
There was a problem hiding this comment.
AFAIK @keqiaozhang didn't recommend to remove the timeout command, he only recommended to handle timeout errors exactly like non-timeout errors.
Question for people with alsabat experience: can alsabat get stuck when something goes wrong?
xiulipan
left a comment
There was a problem hiding this comment.
@keqiaozhang The PR is almost good, please fix some typo and address the advice to use a variable instead of call func_nocodec_mode multiple times
|
@keqiaozhang Ping for update or close. |
I just received the new USB card, will try with the new card and refine this patch soon. |
|
Submitted a new one #554. |
No description provided.