diff --git a/patch_v2/meow_audiod/meow_audiod b/patch_v2/meow_audiod/meow_audiod index ce77121..d278a87 100755 Binary files a/patch_v2/meow_audiod/meow_audiod and b/patch_v2/meow_audiod/meow_audiod differ diff --git a/patch_v2/meow_audiod/meow_audiod.c b/patch_v2/meow_audiod/meow_audiod.c index 4858f3b..bd29c53 100644 --- a/patch_v2/meow_audiod/meow_audiod.c +++ b/patch_v2/meow_audiod/meow_audiod.c @@ -676,6 +676,12 @@ static int alsa_hw_params(int fd, unsigned rate, unsigned ch, unsigned fmt) memset(sm, 0, sizeof *sm); pmask(sm, SNDRV_PCM_SUBFORMAT_STD); pivset(&p.intervals[SNDRV_PCM_HW_PARAM_CHANNELS - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL], ch); pivset(&p.intervals[SNDRV_PCM_HW_PARAM_RATE - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL], rate); + /* M2.94 长流停摆根治(真机实证 60s 零 stall):显式收窄周期几何到 tiny_alsa 惯例 + * period=1024 frames × 4。否则驱动默认 buffer 巨大(上限 1048576 帧 ≈23s), + * hbc3000 桥靠周期中断驱动,中断稀缺 → 桥时钟域 wedge → 播 12s 左右停摆。 + * (tonepcm2 几何矩阵实测:1024×4 连续 60s 实时消费零 stall。) */ + pivset(&p.intervals[SNDRV_PCM_HW_PARAM_PERIOD_SIZE - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL], 1024); + pivset(&p.intervals[SNDRV_PCM_HW_PARAM_PERIODS - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL], 4); p.rmask = ~0u; p.info = 0; p.msbits = 0; p.rate_num = 0; p.rate_den = 0; return ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, &p); } diff --git a/patch_v2/tools/tonepcm2.c b/patch_v2/tools/tonepcm2.c index 0972865..81a8e21 100644 --- a/patch_v2/tools/tonepcm2.c +++ b/patch_v2/tools/tonepcm2.c @@ -86,6 +86,17 @@ int main(int argc, char **argv) iv->min = iv->max = 2; iv->integer = 1; iv = &p.intervals[SNDRV_PCM_HW_PARAM_RATE - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]; iv->min = iv->max = 44100; iv->integer = 1; + { /* 几何收窄:TPCM_PERIOD/TPCM_BCOUNT 环境变量(默认 1024x4,对齐 tinyalsa 惯例) */ + unsigned ps = 1024, bc = 4; + const char *e; + if ((e = getenv("TPCM_PERIOD"))) ps = (unsigned)atoi(e); + if ((e = getenv("TPCM_BCOUNT"))) bc = (unsigned)atoi(e); + struct snd_interval *iv2 = &p.intervals[SNDRV_PCM_HW_PARAM_PERIOD_SIZE - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]; + iv2->min = iv2->max = ps; iv2->integer = 1; + iv2 = &p.intervals[SNDRV_PCM_HW_PARAM_PERIODS - SNDRV_PCM_HW_PARAM_FIRST_INTERVAL]; + iv2->min = iv2->max = bc; iv2->integer = 1; + printf("geometry: period=%u count=%u\n", ps, bc); + } if (ioctl(fd, SNDRV_PCM_IOCTL_HW_REFINE, &p) != 0) { printf("REFINE2 fail\n"); close(fd); return 1; } if (getenv("PROBE_ONLY")) { printf("PROBE_ONLY: stop before PARAMS/write\n"); close(fd); return 0; } if (ioctl(fd, SNDRV_PCM_IOCTL_HW_PARAMS, &p) != 0) { printf("HW_PARAMS fail\n"); close(fd); return 1; } diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 38f0db1..f5296a6 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -38,7 +38,7 @@ patch_v2/meow_svc_power/meow_svc_power|/usr/bin/meow_svc_power|39ae3aa255695a97f patch_v2/meow_verify/meow_verify|/usr/bin/meow_verify|6c2e8ed24aebe5caf41e7aed391312d5|II期验签 2B(多公钥+v2签名块 agent-221) patch_v2/meow_crash/meow_crash|/usr/bin/meow_crash|62781084445e82351bcadbdadbe4c7fc|系统级崩溃捕获 (agent-187) patch_v2/meow_svc_perf/meow_svc_perf|/usr/bin/meow_svc_perf|7ea196de9d59ab8cbd1e26edb7762772|性能专项服务 M2.75(net_json 补 network 闭合括号,修 /api/system JSON 解析失败) -patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|86a8b6793d516c90bbd12c2997b30d8f|独占音频守护 M2.91(+开机武装 hbc3000 FPGA 根治 PCM 启动死锁;+长流防卡死护栏 §12:ring有界写/ALSA poll自愈/popen有界收割/tx丢弃/watchdog) +patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|1c1712c6a2fd8a65009330ca901f33eb|独占音频守护 M2.94(+period=1024×4 几何收窄, 根治长流停摆) patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|c23b96490842f54324b855fd9c2467a5|audiod 用户侧 CLI(status/tone/route/vol;connect/write 全有界 2s 超时) # ---- 开机 init 脚本(etc/init.d,数字决定启动顺序,按文件名自然序)----