- meow_audiod:启动门控(/tmp/meow_boot_mode 非 meow exit 0)、IO/播放/路由三线程、
ring ~200ms、ALSA UAPI 独占直开、切率 mute-重配-恢复、抢占(后开赢+PREEMPTED)、
socket EOF 回收、xrun PREPARE 恢复;meow_route 轮询逻辑并入路由线程
- meow_audio CLI:status/tone/route/vol;services.d/audiod.conf(trigger=manual,on-fail)
- SDK meow_ui_audio.c 编进 meow_ui.a:懒连接/读线程分发 PREEMPTED 回调/EPIPE 标死/
无 audiod 返回 MEOW_ERR_NOENT 不隐式直开(MEOW_AUDIO_DIRECT=1 仅调试)
- launcher:确认 MeowOS 模式后 meow_svcd start audiod(double-fork best-effort 不阻塞)
- meow_route 退役:S89 预置换 audiod.conf + 清理旧 meow_route.conf(防拉起已删二进制
重启循环);fw_content.conf 删 meow_route、加 meow_audiod+meow_audio(md5 打包时填)
- 真机定位并修复 ALSA UAPI 两大坑(即 ncm 播放无声根因):
① hw_params 须全放行初始化(mask 全 1/interval [0,UINT_MAX]),memset 0 interval
等价只能取 0 → refine 必空 → HW_PARAMS 恒 EINVAL
② access/format mask 先清零再单点(pmask 只 OR),全 1 被 choose 成 MMAP_INTERLEAVED
→ write() 恒 EINVAL
- 附带修复:dev_write fd<0 防日志风暴丢 PCM 限频日志;SDK state 解析 app_id 截空白;
meow_ui.h 文档负错误码表述修正
- 验证:宿主 FILE sink 全 IPC 链+抢占+tone WAV 20/20,SDK 客户端 13/13;
qemu-mipsel 同过;真机 tone 44.1k/96k 切率 written=played、underrun=0、日志完整
- meow_ui.a 53a3edd2 → ncm 重链 d2031829(已热更到卡);launcher a2f932a1
203 lines
7.4 KiB
Bash
Executable File
203 lines
7.4 KiB
Bash
Executable File
#!/bin/sh
|
||
#
|
||
# S89meow_svcd - MeowOS 服务管理器协同启动 + 主机名应用 + 板载服务预置
|
||
#
|
||
# 位置:S70meow_sysui 之后、S90meow_bootmenu 之前(S70 < S84 < S89 < S90)。
|
||
# * rcS 顺序执行 /etc/init.d/S??*,而 S90meow_bootmenu 里 `exec /usr/bin/meow_bootmenu
|
||
# --fork` 会阻塞 rcS(选单后 exec meow_launcherd 或 fork 播放器监督),故任何 S90
|
||
# 之后的 init.d(如 S91/S92)**都不会执行**——svcd 必须排在 S90 之前。
|
||
# * 本脚本只装「稳定框架/KB级设置」:主机名 + 板载服务配置
|
||
# (/usr/data/meow/services.d/,Data 区,首启预置 mdnsd.conf + meow_svc_perf.conf +
|
||
# meow_svc_power.conf —— 后者为框架专项服务,trigger=boot 恒存在即启动)。
|
||
# * **svcd 拉起权**:若 meow_sysui(系统进程总监)已运行 → svcd 由 sysui 监管拉起
|
||
# (sysui.d/svcd.conf),本脚本仅在其已运行时 `meow_svcd reload` 让 svcd 补载 mdnsd.conf,
|
||
# 不重复拉起、不重挂(避免与 sysui 双重监护 svcd)。仅当 **sysui 未运行**时才回退到
|
||
# 现网的「重挂循环」自监护(旧固件/无 sysui 场景,向后兼容)。
|
||
#
|
||
# 红线:不 killall、不碰播放器信号、不刷机。svcd 以 -f 前台被 sysui(或重挂循环)拉起;
|
||
# 服务本身(mdnsd)由 svcd 按 restart=on-fail 托管。
|
||
#
|
||
case "$1" in
|
||
start)
|
||
echo -n "Starting meow_svcd (S89): "
|
||
|
||
# 1) 应用主机名:读板载设置 system.hostname(settings.conf),缺省 meowos。
|
||
# 须早于 meow_mdns 启动(mdnsd 默认用 gethostname() 公布 <host>.local)。
|
||
host="meowos"
|
||
if [ -f /usr/data/meow/settings.conf ]; then
|
||
v=$(awk -F= '$1 ~ /^[[:space:]]*system\.hostname[[:space:]]*$/ {gsub(/[[:space:]]/,"",$2); print $2; exit}' /usr/data/meow/settings.conf)
|
||
[ -n "$v" ] && host="$v"
|
||
fi
|
||
# 仅允许 RFC1035 首标签字符(A-Za-z0-9 和 '-'/'.'/'_'),否则回退 meowos
|
||
case "$host" in
|
||
''|*[!A-Za-z0-9_.-]*) host="meowos" ;;
|
||
esac
|
||
sethostname "$host" 2>/dev/null || hostname "$host" 2>/dev/null
|
||
echo -n "host=$host "
|
||
|
||
# 2) 首启预置板载 mdnsd.conf(Data 区可写才建;已存在不覆盖)
|
||
if [ -d /usr/data/meow ] && [ -w /usr/data/meow ]; then
|
||
mkdir -p /usr/data/meow/services.d
|
||
if [ -f /usr/data/meow/services.d/mdnsd.conf ]; then
|
||
echo -n "mdnsd.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/mdnsd.conf <<'EOF'
|
||
exec=/usr/bin/meow_mdns
|
||
args=
|
||
enabled=1
|
||
restart=on-fail
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=boot
|
||
cap=
|
||
EOF
|
||
chmod 644 /usr/data/meow/services.d/mdnsd.conf
|
||
echo -n "provisioned mdnsd.conf "
|
||
fi
|
||
else
|
||
echo -n "skip mdnsd.conf (/usr/data/meow not writable) "
|
||
fi
|
||
|
||
# 2b) 首启预置板载**专项服务**配置(性能/电源;trigger=boot 恒存在即启动,拔卡保留)。
|
||
# perf=on-fail(纯读组,崩即拉起);power=always(系统动作服务应随时可用)。
|
||
if [ -d /usr/data/meow ] && [ -w /usr/data/meow ]; then
|
||
mkdir -p /usr/data/meow/services.d
|
||
if [ -f /usr/data/meow/services.d/meow_svc_perf.conf ]; then
|
||
echo -n "perf.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/meow_svc_perf.conf <<'EOF'
|
||
exec=/usr/bin/meow_svc_perf
|
||
args=
|
||
enabled=1
|
||
restart=on-fail
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=boot
|
||
cap=
|
||
EOF
|
||
chmod 644 /usr/data/meow/services.d/meow_svc_perf.conf
|
||
echo -n "provisioned perf.conf "
|
||
fi
|
||
if [ -f /usr/data/meow/services.d/meow_svc_power.conf ]; then
|
||
echo -n "power.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/meow_svc_power.conf <<'EOF'
|
||
exec=/usr/bin/meow_svc_power
|
||
args=
|
||
enabled=1
|
||
restart=always
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=boot
|
||
cap=
|
||
EOF
|
||
chmod 644 /usr/data/meow/services.d/meow_svc_power.conf
|
||
echo -n "provisioned power.conf "
|
||
fi
|
||
if [ -f /usr/data/meow/services.d/meow_crash.conf ]; then
|
||
echo -n "crash.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/meow_crash.conf <<'EOF'
|
||
exec=/usr/bin/meow_crash
|
||
args=
|
||
enabled=1
|
||
restart=on-fail
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=boot
|
||
cap=
|
||
EOF
|
||
chmod 644 /usr/data/meow/services.d/meow_crash.conf
|
||
echo -n "provisioned crash.conf "
|
||
fi
|
||
if [ -f /usr/data/meow/services.d/audiod.conf ]; then
|
||
echo -n "audiod.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/audiod.conf <<'EOF2'
|
||
exec=/usr/bin/meow_audiod
|
||
args=
|
||
enabled=1
|
||
restart=on-fail
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=manual
|
||
cap=
|
||
EOF2
|
||
chmod 644 /usr/data/meow/services.d/audiod.conf
|
||
echo -n "provisioned audiod.conf "
|
||
fi
|
||
# meow_route 退役(并入 meow_audiod,AUDIOD_DESIGN.md §5):清理旧固件遗留的
|
||
# meow_route.conf(trigger=boot 会拉起已被固件移除的 /usr/bin/meow_route → 重启循环)。
|
||
if [ -f /usr/data/meow/services.d/meow_route.conf ]; then
|
||
if [ -x /usr/bin/meow_svcd ]; then
|
||
/usr/bin/meow_svcd stop meow_route 2>/dev/null
|
||
fi
|
||
rm -f /usr/data/meow/services.d/meow_route.conf
|
||
echo -n "removed stale meow_route.conf "
|
||
fi
|
||
if [ -f /usr/data/meow/services.d/meow_amsd.conf ]; then
|
||
echo -n "amsd.conf exists "
|
||
else
|
||
cat > /usr/data/meow/services.d/meow_amsd.conf <<'EOF'
|
||
exec=/usr/bin/meow_amsd
|
||
args=
|
||
enabled=1
|
||
restart=on-fail
|
||
backoff_ms=2000
|
||
max_restart=5
|
||
trigger=boot
|
||
cap=
|
||
EOF
|
||
chmod 644 /usr/data/meow/services.d/meow_amsd.conf
|
||
echo -n "provisioned amsd.conf "
|
||
fi
|
||
else
|
||
echo -n "skip svc confs (/usr/data/meow not writable) "
|
||
fi
|
||
|
||
# 3) svcd 拉起权判归:sysui 运行 → 交给 sysui 监管;否则回退重挂循环。
|
||
rm -f /tmp/meow_svcd.stop
|
||
sysui_alive=0
|
||
if [ -x /usr/bin/meow_sysui ] && ps | grep -q "[m]eow_sysui"; then
|
||
sysui_alive=1
|
||
fi
|
||
if [ "$sysui_alive" = "1" ]; then
|
||
# svcd 由 meow_sysui 监管拉起;此处仅补载刚预置的 mdnsd.conf(若 svcd 已在跑)
|
||
if [ -x /usr/bin/meow_svcd ]; then
|
||
if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
|
||
/usr/bin/meow_svcd reload 2>/dev/null
|
||
echo -n "supervised by sysui (svcd running, reload) "
|
||
else
|
||
# svcd 未在跑:交给 sysui 按兜底(有限次重试)拉起,此处不干预,防双重拉起
|
||
echo -n "defer to meow_sysui (svcd down) "
|
||
fi
|
||
else
|
||
echo -n "MISSING /usr/bin/meow_svcd "
|
||
fi
|
||
elif [ -x /usr/bin/meow_svcd ]; then
|
||
if [ -f /tmp/meow_svcd.pid ] && kill -0 "$(cat /tmp/meow_svcd.pid 2>/dev/null)" 2>/dev/null; then
|
||
echo "already running"
|
||
else
|
||
( while [ ! -f /tmp/meow_svcd.stop ]; do /usr/bin/meow_svcd -f; sleep 1; done ) &
|
||
echo "started (supervisor pid $!)"
|
||
fi
|
||
else
|
||
echo "MISSING /usr/bin/meow_svcd"
|
||
fi
|
||
;;
|
||
stop)
|
||
echo -n "Stopping meow_svcd: "
|
||
touch /tmp/meow_svcd.stop
|
||
for p in $(ps | grep "[m]eow_svcd" | awk '{print $1}'); do kill "$p" 2>/dev/null; done
|
||
echo "OK"
|
||
;;
|
||
restart|reload)
|
||
;;
|
||
*)
|
||
echo "Usage: $0 {start|stop}"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
exit 0
|