#!/bin/sh
# mictest - record from the on-board mic (RK3308 internal codec)

#   mictest                 10s mono capture from the mic -> /tmp/mictest.wav
#   mictest 30              custom duration (seconds)
#   mictest 10 all          all 8 ADC channels -> /tmp/mictest8.wav


die() { echo "mictest: $*" >&2; exit 1; }

DUR="${1:-10}"
case "$DUR" in *[!0-9]*) die "duration must be in seconds: $DUR" ;; esac

# Enable the on-board mic (ADC channel 8). The mixer differs by codec driver:
#   mainline rk3308 codec (buildroot): a single 'MIC8' capture control
#   Rockchip vendor acodec (Armbian):  'ADC MIC Group 3 Right' (=ch8) + MICBIAS
if amixer -c 0 sget 'MIC8' >/dev/null 2>&1; then
	amixer -q -c 0 sset 'MIC8' 100% cap
elif amixer -c 0 sget 'ADC MIC Group 3 Right' >/dev/null 2>&1; then
	amixer -q -c 0 sset 'ADC Main MICBIAS' on 2>/dev/null
	amixer -q -c 0 sset 'ADC MICBIAS2' on 2>/dev/null
	amixer -q -c 0 sset 'ADC MIC Group 3 Right' 100% 2>/dev/null
	amixer -q -c 0 sset 'ADC MIC Group 3 Right' cap 2>/dev/null
	amixer -q -c 0 sset 'ADC ALC Group 3 Right' 70% 2>/dev/null
else
	die "no codec mixer - wrong image?"
fi

if [ "${2:-}" = all ]; then
	OUT=$(mktemp /tmp/mictest8.XXXXXX.wav) || die "mktemp failed"
	echo "recording all 8 ADC channels for ${DUR}s -> $OUT (mic = channel 8)"
	arecord -D mics -r 48000 -f S16_LE -c 8 -d "$DUR" "$OUT" || die "arecord failed"
else
	OUT=$(mktemp /tmp/mictest.XXXXXX.wav) || die "mktemp failed"
	echo "recording the on-board mic for ${DUR}s -> $OUT"
	arecord -D mic -r 48000 -f S16_LE -c 1 -d "$DUR" "$OUT" || die "arecord failed"
fi

SIZE=$(wc -c < "$OUT")
echo "done: $OUT ($SIZE bytes)"
