评审 r1 的 `p2-2items`,两项都是「缺用例 / 缺一句文档」,不改任何已交付行为。 P2-1(连续拖滑块/ramp 中途反向缺回归): - test_vol_gain 新增 G4b:块长 100(< 512 斜坡)× 60 次 100↔10 反向,实测 59 次落在 斜坡中段;断言增益全程 ∈ [q15(10)=4, 32768] 且从不放大、块内逐样本只朝目标单调走、 相邻样本跳变 ≤64 LSB(硬跳变 ~16380)、停手后 cur=4/left=0/bump_left=0。 - test_audiod_host 新增 T20(daemon 侧等价集成用例):经 IPC 连发 60 次 vol, 每次只喂 100 帧(400B),断言 60 次全 ACK、underrun/dropped=0、 落盘 PCM 无硬跳变(max_delta 1020 = 正弦自身斜率)、尾部 RMS 1.49 比头部 6376.58 低 72dB(10% 真的生效)。 P2-2(文档):vol_gain.h 顶部新增「App/SDK 侧契约」段:BT 下 set_volume 同样生效 (走软件增益 + 持久化),AVRCP 钉 127 只为耳机功放满量程而非「音量交给耳机」, pct 只在 [0,100] 有意义(<=0 真静音、>100 按满量程截断),16bit 写路径的 量化下限说明;vol_gain_dac_att_reg 注释补 pct>100 行为。build_audiod.sh 头部补 M55 说明(必须一起编 vol_gain.c、旧 SDK 说法已过期)。 验证:test_audiod_host 134/134 PASS、test_vol_gain 36/36 PASS、test_bt_dev PASS; mipsel 交叉编译 0 warning,产物 md5 6cef4c54a1cb8e0c55f4ad5b6c4a323e(与 r1 完全一致, 证明二进制未变)。
147 lines
9.2 KiB
Bash
Executable File
147 lines
9.2 KiB
Bash
Executable File
#!/bin/bash
|
||
# build_audiod.sh — meow_audiod 交叉编译(mipsel glibc-dynamic)+ 宿主多目标可选。
|
||
#
|
||
# 目标:R3 Pro II / MeowOS(MIPS32 o32,真实 ABI)。audiod 复用 meow_ipc.h(共享协议头,
|
||
# -I../meow_launcherd)。audiod 为 svcd 托管的独立守护;meow_audio 为用户侧 CLI。
|
||
#
|
||
# 【P2 蓝牙链接定案 2026-09-03】设备为 glibc-2.22(ld-2.22.so / libc-2.22.so,非 musl),且
|
||
# libasound 会在运行时 dlopen 单独的 bluealsa pcm 插件(/usr/lib/alsa-lib/libasound_module_pcm_bluealsa.so)
|
||
# ——故 audiod 必须以**动态 glibc** 形态链接设备现有 libasound.so.2:
|
||
# - 用 zig --target=mipsel-linux-gnueabihf.2.22(硬浮点 o32,glibc-2.22 版本引用,设备 libs 齐);
|
||
# libasound 原型在 meow_audiod.c 内联声明(不依赖 asoundlib.h)。
|
||
# - 删 -static:musl-static 无 dlopen(实测 "Dynamic loading not supported",无法加载 bluealsa 插件);
|
||
# musl-dynamic 需设备不存在的 musl ld.so。libasound 链接库来自 libbt/(设备 libasound.so.2 副本)。
|
||
# - meow_audio CLI 无 libasound 依赖,保持 musl-static(zig-mipsel-cc)。
|
||
#
|
||
# 用法:
|
||
# ./build_audiod.sh # 交叉编译 → meow_audiod(mipsel glibc-dynamic,BT 直链 libasound)
|
||
# ./build_audiod.sh cli # 交叉编译 meow_audio CLI → meow_audio(mipsel musl-static)
|
||
# ./build_audiod.sh host # 宿主编译 *_host 并跑 test_audiod_host 回归(FILE sink)
|
||
#
|
||
# M50 蓝牙输出端到端:audiod 不再读写 /usr/data/alsa.conf(那是 HiBy 播放器的数据文件、语法非法、
|
||
# libasound 从不加载),改为 snd_pcm_open("bluealsa:DEV=<mac>,PROFILE=a2dp,CODEC=<token>")
|
||
# 内联参数(对应 /etc/alsa/conf.d/20-bluealsa.conf 的 pcm.bluealsa @args),失败必回落 DAC。
|
||
#
|
||
# M55 蓝牙音量:BT 下 AVRCP 钉在 127(耳机功放满量程),用户音量由 vol_gain.c 的**软件增益**在
|
||
# 写路径执行(与 DAC 同一条曲线、全整数)。故 audiod 目标必须一起编 vol_gain.c(下方已带);
|
||
# host 目标另外单独编 test_vol_gain.c(纯函数回归:曲线/缩放/斜坡/toggle storm)。
|
||
# ⚠️ `meow_audio_set_volume` 在 BT 下同样生效(写增益 + 持久化),SDK 文档里「BT 时音量由 AVRCP
|
||
# 侧控」的旧说法已过期——见 vol_gain.h 顶部的 App/SDK 契约段。
|
||
#
|
||
# 环境变量覆盖:ROOT / REPO 自动推导,ZIG / CC / LIBBT / ASOUND_SRC / CC_HOST 可显式指定。
|
||
set -e
|
||
cd "$(dirname "$0")"
|
||
# ---- 路径解析(M50:全部可被环境变量覆盖,不再硬绑某台机器的目录布局)----
|
||
# ROOT 只用于可选的历史路径(旧 .tools/zig-env、hiby_os_crack 解包树);缺省布局下不依赖它。
|
||
ROOT="${ROOT:-$HOME/Project/R3ProII}"
|
||
REPO="$(cd "$(dirname "$0")/../.." && pwd)" # 仓库根(worktree 亦可)
|
||
# mipsel 静态 CC:显式 CC → 历史 zig 包装脚本 → PATH 里的 zig(裸 zig 要另带 target flags)。
|
||
# ⚠️ CC **只存单个命令词**:`"$CC"` 是按一个命令名展开的,把 "zig cc --target=..." 整串存进去
|
||
# 会变成「找不到名叫 zig cc --target=... 的命令」(评审 P2-1,M51 在 worktree 里必踩)。
|
||
# 多词 flags 走 CC_EXTRA(未加引号展开,故意按空白分词),与下面 ZIG 的写法保持一致。
|
||
CC="${CC:-}"
|
||
CC_EXTRA=""
|
||
if [ -z "$CC" ]; then
|
||
if [ -x "$ROOT/.tools/zig-mipsel-cc" ]; then
|
||
CC="$ROOT/.tools/zig-mipsel-cc" # 历史包装脚本(内部已带 --target)
|
||
elif command -v zig >/dev/null 2>&1; then
|
||
CC="$(command -v zig)"
|
||
CC_EXTRA="cc --target=mipsel-linux-musleabi"
|
||
fi
|
||
fi
|
||
# 交叉编译用的 zig:显式 ZIG → 历史 zig-env → PATH。
|
||
ZIG="${ZIG:-}"
|
||
if [ -z "$ZIG" ]; then
|
||
if [ -x "$ROOT/.tools/zig-env/bin/zig" ]; then ZIG="$ROOT/.tools/zig-env/bin/zig"; else ZIG="$(command -v zig || true)"; fi
|
||
fi
|
||
INC="-I$REPO/patch_v2/meow_launcherd" # 共享协议头(相对仓库根,不再绑 ROOT)
|
||
# 注:$ZIG 只有 audiod 目标用;guard 放在 audiod 段之前(见下),host/cli 不因缺 zig 而中断。
|
||
|
||
if [ "$1" = "host" ]; then
|
||
HOST_CC="${CC_HOST:-cc}"
|
||
# BT 目标直链宿主 libasound(无 asoundlib.h,原型内联于 meow_audiod.c)。删 -ldl:BT 不再用 dlopen。
|
||
# 链接名先用「trivial 探针」决定:有 -l:libasound.so.2(精确版本)就用它,否则退 -lasound。
|
||
# 用探针而**不是**「先编一次、失败再编一次 2>/dev/null」——后者会把成功路径的 warning 一起吞掉。
|
||
AS_LINK="-l:libasound.so.2"
|
||
if ! printf 'int main(void){return 0;}\n' | "$HOST_CC" -x c - -o /dev/null "$AS_LINK" 2>/dev/null; then
|
||
AS_LINK="-lasound"
|
||
fi
|
||
"$HOST_CC" $INC -Os -Wall -Wextra meow_audiod.c bt_dev.c vol_gain.c -o meow_audiod_host -lpthread $AS_LINK
|
||
"$HOST_CC" $INC -Os -Wall -Wextra meow_audio.c -o meow_audio_host -lm
|
||
"$HOST_CC" $INC -Os -Wall -Wextra test_audiod_host.c -o test_audiod_host -lm
|
||
"$HOST_CC" -Os -Wall -Wextra test_bt_dev.c bt_dev.c -o test_bt_dev -lm
|
||
"$HOST_CC" -Os -Wall -Wextra test_vol_gain.c vol_gain.c -o test_vol_gain -lm
|
||
echo "== host builds =="
|
||
ls -la meow_audiod_host meow_audio_host test_audiod_host test_bt_dev test_vol_gain
|
||
file meow_audiod_host meow_audio_host test_audiod_host test_bt_dev test_vol_gain
|
||
echo "== host regression (test_vol_gain: BT 增益表/缩放/斜坡) =="
|
||
./test_vol_gain || { echo "!! test_vol_gain FAILED"; exit 1; }
|
||
echo "== host regression (test_bt_dev: BT DEV auto-detect) =="
|
||
./test_bt_dev || { echo "!! test_bt_dev FAILED"; exit 1; }
|
||
echo "== host regression (test_audiod_host) =="
|
||
./test_audiod_host || { echo "!! host regression FAILED"; exit 1; }
|
||
exit 0
|
||
fi
|
||
|
||
if [ "$1" = "cli" ]; then
|
||
[ -n "$CC" ] || {
|
||
echo "!! mipsel CC 未找到:设置 CC=/path/to/zig 或 CC=/path/to/zig-mipsel-cc(或把 zig 放进 PATH)" >&2
|
||
exit 1; }
|
||
# M43: meow_audio 是 musl-static(当前 zig 链),与其它系统组件同源受损 → 链 time32 修
|
||
# clock_gettime/usleep(monitor 的 100ms 窗口/轮询)。
|
||
"$CC" $CC_EXTRA $INC -Os -Wall -Wextra -static -DMEOW_TIME32_LIBC_OVERRIDES \
|
||
meow_audio.c ../sdk/meow_time32.c -o meow_audio -lm
|
||
echo "== meow_audio (mipsel static CLI) =="
|
||
ls -la meow_audio
|
||
md5sum meow_audio
|
||
file meow_audio
|
||
exit 0
|
||
fi
|
||
|
||
# meow_audiod:mipsel glibc-dynamic,BT 直链 libasound(-Llibbt -lasound)。-lpthread 供播放线程。
|
||
# M43 例外:本目标走 glibc-2.22(time_t 32 位、timespec 8 字节)→ 无 musl time64 头/实现错位;
|
||
# 当前钉在 fw_content.conf 的出货件则是旧工具链静态 musl,其 4403→ENOSYS→4263+宽度转换本身健康。
|
||
# 两种形态都不需要 meow_time32.c(其 __clock_* 接管针对 zig musl 内部符号)。musl-static 的
|
||
# meow_audio CLI 已链 time32。
|
||
# 链接源 libbt/libasound.so.2.0.0(设备固件 libasound.so.2 副本);缺失时从固件树自拷贝(idempotent)。
|
||
# M50:LIBBT / ASOUND_SRC 可被环境变量覆盖;ASOUND_SRC 候选按「显式 → 历史解包树 → 仓内固件基线」
|
||
# 顺序取第一个存在的(旧值 $ROOT/hiby_os_crack/... 在多数 checkout 里不存在,set -e 下会直接卡住构建)。
|
||
# MAIN = 主 checkout 根(在 git worktree 里运行时,devdocs/ 与 fw_apps/ 这类未入库的固件树
|
||
# 只在主 checkout 里;git-common-dir 指向 <main>/.git,其父目录即主 checkout)。普通 checkout 下 == REPO。
|
||
MAIN=""
|
||
_gcd="$(git rev-parse --git-common-dir 2>/dev/null)" && MAIN="$(cd "$_gcd/.." 2>/dev/null && pwd)" || MAIN=""
|
||
[ -n "$ZIG" ] || {
|
||
echo "!! zig not found(audiod 目标需要它):设置 ZIG=/path/to/zig 或把 zig 放进 PATH" >&2
|
||
exit 1; }
|
||
LIBBT="${LIBBT:-libbt}"
|
||
if [ -z "$ASOUND_SRC" ]; then
|
||
tried=""
|
||
for c in "$ROOT/hiby_os_crack/r3proii/squashfs-root-example/usr/lib/libasound.so.2.0.0" \
|
||
"$REPO/devdocs/fw-baseline/squashfs-root/usr/lib/libasound.so.2.0.0" \
|
||
"$REPO/fw_apps/build/squashfs-root/usr/lib/libasound.so.2.0.0" \
|
||
${MAIN:+"$MAIN/devdocs/fw-baseline/squashfs-root/usr/lib/libasound.so.2.0.0"} \
|
||
${MAIN:+"$MAIN/fw_apps/build/squashfs-root/usr/lib/libasound.so.2.0.0"}; do
|
||
[ -f "$c" ] && { ASOUND_SRC="$c"; break; }
|
||
tried="$tried
|
||
- $c"
|
||
done
|
||
fi
|
||
[ -n "$ASOUND_SRC" ] && [ -f "$ASOUND_SRC" ] || {
|
||
echo "!! libasound.so.2.0.0 not found. 试过这些路径:$tried" >&2
|
||
echo " 覆盖方式:ASOUND_SRC=/path/to/libasound.so.2.0.0 $0" >&2
|
||
exit 1; }
|
||
mkdir -p "$LIBBT"
|
||
if [ ! -f "$LIBBT/libasound.so.2.0.0" ]; then cp "$ASOUND_SRC" "$LIBBT/libasound.so.2.0.0"; fi
|
||
ln -sf libasound.so.2.0.0 "$LIBBT/libasound.so"
|
||
ln -sf libasound.so.2.0.0 "$LIBBT/libasound.so.2"
|
||
"$ZIG" cc --target=mipsel-linux-gnueabihf.2.22 $INC -Os -Wall -Wextra meow_audiod.c bt_dev.c vol_gain.c -o meow_audiod \
|
||
-lpthread -L"$LIBBT" -lasound
|
||
echo "== meow_audiod (mipsel glibc-dynamic, BT links libasound.so.2) =="
|
||
ls -la meow_audiod
|
||
md5sum meow_audiod
|
||
file meow_audiod
|
||
echo "-- dynamic NEEDED --"
|
||
readelf -d meow_audiod 2>/dev/null | grep -iE "needed" || true
|
||
echo "-- glibc version refs (max must be <= 2.22) --"
|
||
readelf --version-info meow_audiod 2>/dev/null | grep -oE "GLIBC_2\.[0-9]+" | sort -uV | tail -3 || true
|