Skip to content

Commit

Permalink
Tools: Testbench: Add useful script for run and profile
Browse files Browse the repository at this point in the history
This patch adds scripts sof-testbench-helper.sh and
sof-testbench-build-profile.sh to ease audio module
developer's frequent tasks.

Signed-off-by: Seppo Ingalsuo <[email protected]>
  • Loading branch information
singalsu committed Oct 29, 2024
1 parent fd1cdc8 commit a769426
Show file tree
Hide file tree
Showing 2 changed files with 257 additions and 0 deletions.
73 changes: 73 additions & 0 deletions scripts/sof-testbench-build-profile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/bin/bash
# SPDX-License-Identifier: BSD-3-Clause

set -e

usage() {
echo "Usage: $0 <options>"
echo " -d <directory> directory to place code profiling reports"
echo " -h shows this text"
echo " -p <platform> sets platform for scripts/rebuild-testbench.sh"
echo
}

MODULES_S32="asrc dcblock drc drc_multiband eqfir eqiir gain src tdfb"
MODULES_S24="aria"

if [ -z "${SOF_WORKSPACE}" ]; then
echo "Error: environment variable SOF_WORKSPACE need to be set to top level sof directory"
exit 1
fi

PLATFORM=none
PDIR=$SOF_WORKSPACE/sof/tools/testbench/profile

while getopts "hp:d:" opt; do
case "${opt}" in
d)
PDIR=${OPTARG}
;;
h)
usage
exit
;;
p)
PLATFORM=${OPTARG}
;;
*)
usage
exit
;;
esac
done
shift $((OPTIND-1))

# Build
SCRIPTS=$SOF_WORKSPACE/sof/scripts
mkdir -p "$PDIR"
"$SCRIPTS"/rebuild-testbench.sh -p "$PLATFORM"

echo "Profiler reports are stored to $PDIR"

# Run sof-hda-generic.tplg playback
echo "Profiling sof-hda-generic.tplg ..."
sof-testbench-helper.sh -x -t production/sof-hda-generic.tplg -n 1,2 \
-p "$PDIR/profile-$PLATFORM-generic.txt" > "$PDIR/log-$PLATFORM-generic.txt"

# Run sof-hda-benchmark-generic.tplg playback
echo "Profiling sof-hda-benchmark-generic.tplg ..."
sof-testbench-helper.sh -x -t development/sof-hda-benchmark-generic.tplg -n 1,2,3 \
-p "$PDIR/profile-$PLATFORM-benchmark.txt" > "$PDIR/log-$PLATFORM-benchmark.txt"

# Profile modules
for mod in $MODULES_S32
do
echo "Profiling $mod ..."
sof-testbench-helper.sh -x -m "$mod" -p "$PDIR/profile-$PLATFORM-$mod.txt" > "$PDIR/log-$PLATFORM-$mod.txt"
done

for mod in $MODULES_S24
do
echo "Profiling $mod ..."
sof-testbench-helper.sh -b 24 -x -m "$mod" -p "$PDIR/profile-$PLATFORM-$mod.txt" > "$PDIR/log-$PLATFORM-$mod.txt"
done
184 changes: 184 additions & 0 deletions scripts/sof-testbench-helper.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
#!/bin/bash
# SPDX-License-Identifier: BSD-3-Clause

set -e

usage() {
echo "Usage: $0 <options>"
echo "Options"
echo " -b <bits>, default 32"
echo " -c <channels>, default 2"
echo " -h shows this text"
echo " -i <input wav>, default /usr/share/sounds/alsa/Front_Center.wav"
echo " -k keep temporary files in /tmp"
echo " -m <module>, default gain"
echo " -n <pipelines>, default 1,2"
echo " -o <output wav>, default none"
echo " -p <profiling result text>, use with -x, default none"
echo " -r <rate>, default 48000"
echo " -t <force topology>, default none, e.g. production/sof-hda-generic.tplg"
echo " -v runs with valgrind, not available with -x"
echo " -x runs testbench with xt-run simulator"
echo
echo "Example: run DRC with xt-run with profiling (slow)"
echo "$0 -x -m drc -p profile-drc32.txt"
echo
echo "Example: process with native build DRC file Front_Center.wav (fast)"
echo "$0 -m drc -i /usr/share/sounds/alsa/Front_Center.wav -o ~/tmp/Front_Center_with_DRC.wav"
echo
echo "Example: check component eqiir with valgrind"
echo "$0 -v -m eqiir"
echo
}

if [ -z "${SOF_WORKSPACE}" ]; then
echo "Error: environment variable SOF_WORKSPACE need to be set to top level sof directory"
exit 1
fi

OUTWAV=
CLIP=/usr/share/sounds/alsa/Front_Center.wav
MODULE=gain
BITS=32
RATE_IN=48000
RATE_OUT=48000
CHANNELS_IN=2
CHANNELS_OUT=2
PIPELINES="1,2"
INFILE1=$(mktemp --tmpdir=/tmp in-XXXX.raw)
OUTFILE1=$(mktemp --tmpdir=/tmp out-XXXX.raw)
TRACEFILE=$(mktemp --tmpdir=/tmp trace-XXXX.txt)
PROFILEOUT=$(mktemp --tmpdir=/tmp profile-XXXX.out)
KEEP_TMP=false
XTRUN=false
PROFILE=false
TPLG0=
VALGRIND=

while getopts "b:c:hi:km:n:o:p:r:t:vx" opt; do
case "${opt}" in
b)
BITS=${OPTARG}
;;
c)
CHANNELS_IN=${OPTARG}
CHANNELS_OUT=${OPTARG}
;;
h)
usage
exit
;;
i)
CLIP=${OPTARG}
;;
k)
KEEP_TMP=true
;;
m)
MODULE=${OPTARG}
;;
n)
PIPELINES=${OPTARG}
;;
o)
OUTWAV=${OPTARG}
;;
p)
PROFILETXT=${OPTARG}
PROFILE=true
;;
r)
RATE_IN=${OPTARG}
RATE_OUT=${OPTARG}
;;
t)
TPLG0=${OPTARG}
;;
v)
VALGRIND=valgrind
;;
x)
XTRUN=true
;;
*)
usage
exit
;;
esac
done
shift $((OPTIND-1))

echo Converting clip "$CLIP" to raw input
if [[ "$BITS" == "24" ]]; then
# Sox does not support S24_4LE format
# Note gain 0.00390615 is empically find just a bit lower gain than
# 1/256 = 0.00390625 that doesn't cause sox rounding to exceed
# INT24_MIN .. INT24_MAX range.
sox --encoding signed-integer "$CLIP" -L -r "$RATE_IN" -c "$CHANNELS_IN" -b 32 "$INFILE1" vol 0.00390615
else
sox --encoding signed-integer "$CLIP" -L -r "$RATE_IN" -c "$CHANNELS_IN" -b "$BITS" "$INFILE1"
fi

TB4="$SOF_WORKSPACE/sof/tools/testbench/build_testbench/install/bin/sof-testbench4"
XTB4="$SOF_WORKSPACE/sof/tools/testbench/build_xt_testbench/sof-testbench4"
XTB4_SETUP="$SOF_WORKSPACE/sof/tools/testbench/build_xt_testbench/xtrun_env.sh"
if [ -z "$TPLG0" ]; then
TPLG="$SOF_WORKSPACE/sof/tools/build_tools/topology/topology2/development/sof-hda-benchmark-${MODULE}${BITS}.tplg"
else
TPLG="$SOF_WORKSPACE/sof/tools/build_tools/topology/topology2/$TPLG0"
fi
FMT="S${BITS}_LE"
OPTS="-r $RATE_IN -R $RATE_OUT -c $CHANNELS_IN -c $CHANNELS_OUT -b $FMT -p $PIPELINES -t $TPLG -i $INFILE1 -o $OUTFILE1"

if [ ! -f "$TPLG" ]; then
echo "Error: Topology $TPLG is not found"
echo "Build with scripts/build-tools.sh -Y"
exit 1
fi

if [[ "$XTRUN" == true ]]; then
if [ ! -x "$XTB4" ]; then
echo "Error: No executable found from $XTB4"
echo "Build with scripts/rebuild-testbench.sh -p <platform>"
exit 1
fi
echo "Running xtensa testbench"
echo " topology: $TPLG"
echo " input: $INFILE1, output: $OUTFILE1, trace: $TRACEFILE, profile: $PROFILETXT"
source "$XTB4_SETUP"
if [[ $PROFILE == true ]]; then
"$XTENSA_PATH"/xt-run --profile="$PROFILEOUT" "$XTB4" $OPTS 2> "$TRACEFILE"
"$XTENSA_PATH"/xt-gprof "$XTB4" "$PROFILEOUT" > "$PROFILETXT"
else
"$XTENSA_PATH"/xt-run "$XTB4" $OPTS 2> "$TRACEFILE"
fi
else
if [ ! -x "$TB4" ]; then
echo "Error: No executable found from $TB4"
exit 1
fi
echo "Running testbench"
echo " topology: $TPLG"
echo " input: $INFILE1, output: $OUTFILE1, trace: $TRACEFILE"
$VALGRIND "$TB4" $OPTS 2> "$TRACEFILE" || {
cat "$TRACEFILE"
exit $?
}
if [ -n "$VALGRIND" ]; then
cat "$TRACEFILE"
fi
fi

if [ -n "$OUTWAV" ]; then
echo Converting raw output to "$OUTWAV"
if [[ "$BITS" == "24" ]]; then
sox --encoding signed-integer -L -r "$RATE_OUT" -c "$CHANNELS_OUT" -b 32 "$OUTFILE1" "$OUTWAV" vol 256
else
sox --encoding signed-integer -L -r "$RATE_OUT" -c "$CHANNELS_OUT" -b "$BITS" "$OUTFILE1" "$OUTWAV"
fi
fi

if [[ "$KEEP_TMP" == false ]]; then
echo Deleting temporary files
rm -f "$INFILE1" "$OUTFILE1" "$TRACEFILE" "$PROFILEOUT"
fi

0 comments on commit a769426

Please sign in to comment.