From 9a4ea10c6463bd1ceac5f81d7a562b7b8efe83c1 Mon Sep 17 00:00:00 2001 From: MeowOS Date: Tue, 1 Sep 2026 14:25:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(audiod):=20DAC=20=E5=AE=9E=E6=97=B6?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=20=E2=80=94=20=E6=95=B0=E5=AD=97=E5=9F=9F?= =?UTF-8?q?=E7=94=B5=E5=B9=B3=E8=A1=A8(100ms=E7=AA=97=E5=8F=A3=E6=95=B4?= =?UTF-8?q?=E6=95=B0RMS/peak,deci-dBFS)+1s=E7=9B=91=E6=8E=A7=E6=97=A5?= =?UTF-8?q?=E5=BF=97(TF=20audio=5Fmonitor=5F.log,=E6=B5=81?= =?UTF-8?q?=E5=81=9C=E5=8D=B3=E5=81=9C)+CLI=20monitor=20=E7=94=B5=E5=B9=B3?= =?UTF-8?q?=E6=9D=A1;STATE=20=E8=A1=A5=20rms/peak/lvlseq=20=E9=94=AE(ABI?= =?UTF-8?q?=E5=85=BC=E5=AE=B9)=E3=80=82=E5=AE=BF=E4=B8=BB47/47,qemu+?= =?UTF-8?q?=E7=9C=9F=E6=9C=BA0.7.91=20tone=E9=AA=8C=E8=AF=81(1kHz=200.3?= =?UTF-8?q?=E5=B9=85:rms=3D-13.9=20peak=3D-10.8dBFS,hwrate~44.1k=E5=81=A5?= =?UTF-8?q?=E5=BA=B7)=E3=80=82audiod=20ab193a2b=20meow=5Faudio=20891ab264?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- patch_v2/meow_audiod/meow_audio | Bin 79840 -> 84560 bytes patch_v2/meow_audiod/meow_audio.c | 96 +++++++++++- patch_v2/meow_audiod/meow_audio_host | Bin 72168 -> 72592 bytes patch_v2/meow_audiod/meow_audiod | Bin 149500 -> 153324 bytes patch_v2/meow_audiod/meow_audiod.c | 189 +++++++++++++++++++++++- patch_v2/meow_audiod/meow_audiod_host | Bin 76656 -> 77216 bytes patch_v2/meow_audiod/test_audiod_host | Bin 72520 -> 72672 bytes patch_v2/meow_audiod/test_audiod_host.c | 93 ++++++++++++ scripts/build/fw_content.conf | 4 +- 9 files changed, 377 insertions(+), 5 deletions(-) diff --git a/patch_v2/meow_audiod/meow_audio b/patch_v2/meow_audiod/meow_audio index 790948f713525b697e78336116cb9dec6d0a1a3e..6dd13a7f78994968d45fbcac9d58e2c4fbedb4e3 100755 GIT binary patch delta 19547 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 DFhyw_ delta 15363 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 UT4l;p9I 手动切路由(0=auto 2=3.5 3=4.4;调试/面板) * meow_audio vol [0-100] 设置音量(无参=查询;v1 透传写 DAC numid=1/2 + settings.conf) + * meow_audio monitor [秒] 终端实时电平表(rms/peak dBFS + 文本电平条,200ms 刷新) * * 传输:AF_UNIX SOCK_STREAM 到 audiod socket(env MEOW_AUDIO_SOCK / --sock 覆盖,宿主/qemu)。 * 帧格式复用 meow_ipc.h 16B 头 + m_audio_* 负载。无 audiod → 连接失败/超时 → 打印友好错误并退出。 @@ -23,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -163,6 +165,93 @@ static int cmd_status(void) return 0; } +/* ---- monitor:终端实时电平表(200ms 刷新,文本电平条;数据源=MSG_AUDIO_STATE 的 rms/peak 键) ---- */ +static volatile sig_atomic_t g_mon_stop = 0; +static void on_mon_sig(int sig) { (void)sig; g_mon_stop = 1; } + +/* 从 STATE 文本取整型字段(key 含 '=',如 "rms=";缺省 def) */ +static int txt_get_int(const char *t, const char *key, int def) +{ + const char *p = strstr(t, key); + return p ? atoi(p + strlen(key)) : def; +} +static void txt_get_str(const char *t, const char *key, char *out, size_t n) +{ + const char *p = strstr(t, key); + if (!p) { snprintf(out, n, "-"); return; } + p += strlen(key); + size_t k = 0; + while (p[k] && p[k] != ' ' && p[k] != '\n' && p[k] != '\t' && k < n - 1) { out[k] = p[k]; k++; } + out[k] = 0; +} +/* deci-dB → "-13.1"(地板显 "-inf") */ +static void fmt_db10(char *out, size_t n, int v) +{ + if (v <= -990) { snprintf(out, n, " -inf"); return; } + int neg = v < 0; + int a = neg ? -v : v; + snprintf(out, n, "%s%3d.%d", neg ? "-" : " ", a / 10, a % 10); +} +/* 文本电平条:-60..0 dBFS → 0..30 格 */ +static void print_bar(int db10) +{ + int cells = 0; + if (db10 > -600) cells = (db10 + 600) * 30 / 600; + if (cells > 30) cells = 30; + putchar('['); + for (int i = 0; i < 30; i++) putchar(i < cells ? '#' : '-'); + putchar(']'); +} + +static int cmd_monitor(int secs) +{ + if (g_fd < 0) { fprintf(stderr, "meow_audio: no audiod (%s) — 音频服务不可用\n", g_sock); return 1; } + signal(SIGINT, on_mon_sig); + signal(SIGTERM, on_mon_sig); + printf("monitor: 5Hz 刷新,%s(Ctrl-C 退出)\n", secs > 0 ? "定时自动停" : "持续监视"); + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + uint64_t t0 = (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; + uint8_t rbuf[MEOW_IPC_MAX]; + uint16_t rt; + while (!g_mon_stop) { + int n = req_resp(MSG_AUDIO_QUERY, NULL, 0, &rt, rbuf, sizeof rbuf); + if (n < 0 || rt != MSG_AUDIO_STATE) { + fprintf(stderr, "\nmeow_audio: query failed (audiod died?)\n"); + return 1; + } + rbuf[n < (int)sizeof rbuf - 1 ? n : (int)sizeof rbuf - 1] = 0; + const char *txt = (const char *)rbuf; + int active = txt_get_int(txt, "active=", 0); + int rms = txt_get_int(txt, "rms=", -990); + int pk = txt_get_int(txt, "peak=", -990); + int vol = txt_get_int(txt, "vol=", -1); + int port = txt_get_int(txt, "port=", -1); + int rate = txt_get_int(txt, "rate=", 0); + char app[40]; + txt_get_str(txt, "app=", app, sizeof app); + char rmsb[16], pkb[16]; + fmt_db10(rmsb, sizeof rmsb, rms); + fmt_db10(pkb, sizeof pkb, pk); + if (active) { + printf("\rLIVE rms=%sdBFS peak=%sdBFS ", rmsb, pkb); + print_bar(pk); + printf(" %s %dHz port=%d vol=%d%% ", app, rate, port, vol); + } else { + printf("\rIDLE 无活跃流(等待播放…) "); + } + fflush(stdout); + if (secs > 0) { + clock_gettime(CLOCK_MONOTONIC, &ts); + uint64_t now = (uint64_t)ts.tv_sec * 1000 + (uint64_t)ts.tv_nsec / 1000000; + if (now - t0 >= (uint64_t)secs * 1000) break; + } + usleep(200000); /* 200ms 刷新 */ + } + putchar('\n'); + return 0; +} + static int cmd_route(int port) { m_audio_route_t r; r.port = (uint32_t)port; @@ -284,7 +373,8 @@ static int cmd_tone(int freq, int ms, int rate) static void usage(const char *argv0) { - fprintf(stderr, "usage: %s status | tone [freq] [ms] [rate] | route <0|2|3> | vol [0-100]\n" + fprintf(stderr, "usage: %s status | tone [freq] [ms] [rate] | route <0|2|3> | vol [0-100] | monitor [秒]\n" + " monitor: 终端实时电平表(200ms 刷新+文本电平条;缺省 10s,0=持续到 Ctrl-C)\n" " env: MEOW_AUDIO_SOCK (socket 缺省 %s)\n", argv0, AUD_SOCK_DEFAULT); } @@ -325,6 +415,10 @@ int main(int argc, char **argv) if (freq <= 0 || ms <= 0 || rate <= 0) { fprintf(stderr, "tone: bad params\n"); return 2; } if (g_fd < 0) { fprintf(stderr, "meow_audio: no audiod (%s) — 音频服务不可用\n", g_sock); return 1; } return cmd_tone(freq, ms, rate); + } else if (!strcmp(cmd, "monitor")) { + int secs = (argc >= 3) ? atoi(argv[2]) : 10; + if (secs < 0) secs = 10; + return cmd_monitor(secs); } usage(argv[0]); return 2; diff --git a/patch_v2/meow_audiod/meow_audio_host b/patch_v2/meow_audiod/meow_audio_host index 5cafc0f04aa5d54b3614a87e3e9a04ba50144cfd..61107f1c3bd00897ce39365dc0202f71cc8bed31 100755 GIT binary patch delta 8485 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 aK9`mOMUKp*8pJ*J%uCXkORtTSPy9E|_y2JK diff --git a/patch_v2/meow_audiod/meow_audiod.c b/patch_v2/meow_audiod/meow_audiod.c index 43bc1ca..d62bd76 100644 --- a/patch_v2/meow_audiod/meow_audiod.c +++ b/patch_v2/meow_audiod/meow_audiod.c @@ -171,6 +171,25 @@ static int g_dev_open = 0; static uint32_t g_dev_rate = 0, g_dev_ch = 0, g_dev_fmt = 0; static int g_reconfig_pending = 0; +/* ---- 数字域电平表(DAC 实时监控;CS43198 无模拟电平回读,播放线程看 PCM 样本) ---- + * 播放线程对从 ring 取出的每块 PCM 做纯整数累加(归一到 16bit 域:S24/S32 >>16), + * ~100ms 窗口(rate/10 帧)到点才结算一次 RMS/peak 并发布快照——每帧仅几次整数加乘, + * 不拖慢播放线程;无流时无数据读出即零开销。不用浮点(MIPS 软浮点昂贵)。 */ +#define METER_FLOOR_DB10 (-990) /* 静音地板 -99.0 dBFS */ +static uint64_t g_m_sumsq = 0; /* 窗口内样本平方和(16bit 域) */ +static uint32_t g_m_peak = 0; /* 窗口峰值(0..32768) */ +static uint32_t g_m_frames = 0; /* 窗口已计帧 */ +static uint32_t g_m_win = 0; /* 窗口目标帧数(rate/10;0=未配置/无流) */ +/* 发布快照(g_mu 保护;deci-dB,METER_FLOOR_DB10=静音) */ +static int g_lvl_rms_db10 = METER_FLOOR_DB10; +static int g_lvl_peak_db10 = METER_FLOOR_DB10; +static uint32_t g_lvl_seq = 0; /* 快照代际(每次结算/开流复位递增) */ + +/* ---- 全面监控日志(主线程 1s 节拍写;流活跃才写,流停止即停写,无流零开销) ---- */ +static int g_monfd = -1; +static uint64_t g_mon_prev_played = 0; +static int64_t g_mon_prev_ms = 0; + /* ---- 日志 ---- */ static void logmsg(const char *fmt, ...) { @@ -299,6 +318,73 @@ static const char *fmt_name(int fmt) } static int frame_size(void) { return g_st.ch * fmt_bps(g_st.fmt); } +/* 整数开平方(uint64→uint32,逐位法;替代软浮点 sqrt) */ +static uint32_t isqrt64(uint64_t x) +{ + uint64_t r = 0, bit = 1ULL << 62; + while (bit > x) bit >>= 2; + while (bit) { + if (x >= r + bit) { x -= r + bit; r = (r >> 1) + bit; } + else r >>= 1; + bit >>= 2; + } + return (uint32_t)r; +} + +/* 线性幅度(16bit 域 0..32768)→ deci-dBFS(×10 整数,相对满幅 32768)。 + * log2 = 整数位 + octave 内线性插值;最大误差 ~0.5dB,电平表/日志足够。 */ +static int db10_of_lin(uint32_t v) +{ + if (v == 0) return METER_FLOOR_DB10; + if (v > 32768) v = 32768; + int b = 0; + uint32_t t = v; + while (t >>= 1) b++; /* b = floor(log2(v)) ∈ 0..15 */ + uint32_t frac = v - (1u << b); + /* 20*log10(2)*10 = 60.206 */ + int64_t db10 = (int64_t)60206 * (b - 15) / 1000; + db10 += (int64_t)60206 * (int64_t)frac / ((int64_t)1000 << b); + if (db10 < METER_FLOOR_DB10) db10 = METER_FLOOR_DB10; + return (int)db10; +} + +/* 窗口结算 + 发布快照(调用方已持 g_mu) */ +static void meter_window_end(void) +{ + uint64_t samples = (uint64_t)g_m_frames * (g_st.ch ? g_st.ch : 2); + uint32_t rms = samples ? isqrt64(g_m_sumsq / samples) : 0; + g_lvl_rms_db10 = db10_of_lin(rms); + g_lvl_peak_db10 = db10_of_lin(g_m_peak); + g_lvl_seq++; + g_m_sumsq = 0; g_m_peak = 0; g_m_frames = 0; +} + +/* 喂一块 PCM 进电平表(调用方已持 g_mu,播放线程 ring_read 后紧跟调用)。 + * 逐样本整数累加;**逐帧判窗口边界**(帧循环里一次加+比较,开销可忽略)—— + * 若按块末尾才结算,块越过窗口边界的部分会混进旧窗口(宿主流失真正弦+静音 + * 混合窗口实测 rms 偏差 7dB+)。fmt 为 grant 格式;S24/S32 归一 >>16。 */ +static void meter_feed(const uint8_t *buf, size_t n) +{ + if (!g_m_win) return; + int bps = fmt_bps(g_st.fmt); + int ch = g_st.ch ? (int)g_st.ch : 2; + size_t fs = (size_t)ch * (size_t)bps; + if (fs == 0) return; + size_t frames = n / fs; + for (size_t i = 0; i < frames; i++) { + const uint8_t *p = buf + i * fs; + for (int c = 0; c < ch; c++, p += bps) { + int32_t v; + if (bps == 2) { int16_t s; memcpy(&s, p, 2); v = s; } + else { int32_t s; memcpy(&s, p, 4); v = s >> 16; } + uint32_t a = (v < 0) ? (uint32_t)(-(int64_t)v) : (uint32_t)v; + g_m_sumsq += (uint64_t)a * a; + if (a > g_m_peak) g_m_peak = a; + } + if (++g_m_frames >= g_m_win) meter_window_end(); + } +} + static size_t ring_bytes(void) /* 已缓冲字节 */ { return (g_wpos >= g_rpos) ? (g_wpos - g_rpos) : (g_ring_cap - g_rpos + g_wpos); @@ -936,6 +1022,7 @@ static void *playback_thread(void *arg) size_t fs = (size_t)frame_size(); if (fs > 0) want = (want / fs) * fs; size_t n = ring_read_locked(buf, want); + if (n) meter_feed(buf, n); /* 电平表:整数累加,窗口到点才结算 */ pthread_mutex_unlock(&g_mu); if (n == 0) continue; dev_write(buf, n); @@ -1044,6 +1131,12 @@ static void dispatch(struct client *c, uint16_t type, uint32_t req_id, const uin g_drop_frames = 0; /* 每流计数(txdrop 为全局客户端级,不随流清) */ g_stall = 0; g_dev_bytes = 0; /* 测试钩子计数随新流归零 */ + /* 电平表复位 + 窗口目标(~100ms) */ + g_m_win = g_st.rate / 10; + if (!g_m_win) g_m_win = 1; + g_m_sumsq = 0; g_m_peak = 0; g_m_frames = 0; + g_lvl_rms_db10 = g_lvl_peak_db10 = METER_FLOOR_DB10; + g_lvl_seq++; /* 重建 ring + 标记重配 */ ring_rebuild(); _audio_mark_reconfig_needed(); @@ -1105,7 +1198,7 @@ static void dispatch(struct client *c, uint16_t type, uint32_t req_id, const uin snprintf(txt, sizeof txt, "active=%d app=%s sid=%u rate=%u ch=%u fmt=%s " "written=%llu played=%llu underrun=%u dropped=%llu stall=%u txdrop=%u paused=%d " - "route_mode=%s port=%d vol=%d\n", + "route_mode=%s port=%d vol=%d rms=%d peak=%d lvlseq=%u\n", g_st.active ? 1 : 0, g_st.active ? g_st.app_id : "-", (unsigned)g_st.sid, (unsigned)g_st.rate, (unsigned)g_st.ch, @@ -1117,7 +1210,8 @@ static void dispatch(struct client *c, uint16_t type, uint32_t req_id, const uin (unsigned)g_stall, (unsigned)g_txdrop, g_paused, g_route_manual == -1 ? "auto" : "manual", (g_route_manual != -1 ? g_route_manual : rb), - vol); + vol, + g_lvl_rms_db10, g_lvl_peak_db10, (unsigned)g_lvl_seq); send_frame(c->fd, MSG_AUDIO_STATE, req_id, txt, (uint32_t)strlen(txt) + 1); break; } @@ -1310,6 +1404,95 @@ static void *route_thread(void *arg) return NULL; } +/* ---- 全面监控日志(§8 扩展:流活跃时每 1s 一行;主线程节拍驱动,不碰播放线程) ---- */ +/* deci-dB → "-13.1" 文本(静音地板显 "-inf") */ +static void fmt_db10(char *out, size_t n, int v) +{ + if (v <= METER_FLOOR_DB10) { snprintf(out, n, "-inf"); return; } + int neg = v < 0; + int a = neg ? -v : v; + snprintf(out, n, "%s%d.%d", neg ? "-" : "", a / 10, a % 10); +} + +static void mon_close(void) +{ + if (g_monfd >= 0) { close(g_monfd); g_monfd = -1; } +} + +/* 主线程 1s 节拍调用。流活跃 → 懒打开 TF 卡 MeowOS/logs/audio_monitor_.log + * (无卡降级 /tmp)并写一行(时间戳+app+参数+rms/peak dBFS+帧计数+underrun/stall/ + * dropped/txdrop+路由口+FPGA 状态+音量%+hw 消费速率帧/s);流停止即停写关文件。 + * 快照先取后写:文件 IO 不持 g_mu。 */ +static void mon_tick(void) +{ + pthread_mutex_lock(&g_mu); + int active = g_st.active; + char app[MEOW_APP_ID_MAX]; snprintf(app, sizeof app, "%s", g_st.app_id); + uint32_t sid = g_st.sid, rate = g_st.rate; + unsigned ch = g_st.ch, fmt = g_st.fmt; + uint64_t wr = g_written_frames, pl = g_played_frames, dr = g_drop_frames; + unsigned ur = g_underrun, st = g_stall, tx = g_txdrop; + int paused = g_paused, vol = g_vol_pct, rmanual = g_route_manual, rcur = g_route_cur; + int rms = g_lvl_rms_db10, pk = g_lvl_peak_db10; + pthread_mutex_unlock(&g_mu); + + if (!active) { /* 流停止即停写 */ + if (g_monfd >= 0) { + mon_close(); + logmsg("monitor log closed (stream ended)"); + } + g_mon_prev_ms = 0; + return; + } + struct timespec tp; + clock_gettime(CLOCK_MONOTONIC, &tp); + int64_t now_ms = (int64_t)tp.tv_sec * 1000 + tp.tv_nsec / 1000000; + if (g_monfd < 0) { /* 懒打开(流开始才建文件) */ + char ts[64]; + get_bootts(ts, sizeof ts); + char path[368]; + if (access(LOG_DIR_CARD, W_OK) == 0) + snprintf(path, sizeof path, "%s/audio_monitor_%s.log", LOG_DIR_CARD, ts); + else + snprintf(path, sizeof path, "/tmp/audio_monitor_%s.log", ts); + g_monfd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644); + if (g_monfd < 0) return; /* 打不开就静默降级(下拍再试) */ + logmsg("monitor log -> %s", path); + const char *hdr = "# meow_audiod monitor: time | app sid rate/ch/fmt | rms/peak dBFS | written played underrun stall dropped txdrop | route fpga vol hwrate\n"; + if (write(g_monfd, hdr, strlen(hdr)) < 0) { } + g_mon_prev_played = pl; + g_mon_prev_ms = now_ms; + } + int64_t dt = now_ms - g_mon_prev_ms; + uint64_t hwrate = (dt > 0 && pl >= g_mon_prev_played) + ? (pl - g_mon_prev_played) * 1000 / (uint64_t)dt : 0; + g_mon_prev_played = pl; + g_mon_prev_ms = now_ms; + struct tm tm; + time_t now = time(NULL); + localtime_r(&now, &tm); + char tbuf[32]; + strftime(tbuf, sizeof tbuf, "%Y-%m-%d %H:%M:%S", &tm); + char rmsb[16], pkb[16]; + fmt_db10(rmsb, sizeof rmsb, rms); + fmt_db10(pkb, sizeof pkb, pk); + int port = (rmanual != -1) ? rmanual : rcur; + char line[512]; + int n = snprintf(line, sizeof line, + "%s app=%s sid=%u %uHz/%uch/%s rms=%sdBFS peak=%sdBFS " + "written=%llu played=%llu underrun=%u stall=%u dropped=%llu txdrop=%u " + "route=%d(%s) fpga=%s vol=%d%% hwrate=%lluf/s%s\n", + tbuf, app, (unsigned)sid, (unsigned)rate, ch, fmt_name((int)fmt), + rmsb, pkb, + (unsigned long long)wr, (unsigned long long)pl, + ur, st, (unsigned long long)dr, tx, + port, port_name(port), + rcur >= 0 ? "armed" : "unknown", + vol, (unsigned long long)hwrate, + paused ? " paused" : ""); + if (n > 0 && write(g_monfd, line, (size_t)n) < 0) { } +} + static void on_sig(int sig) { (void)sig; @@ -1406,8 +1589,10 @@ int main(int argc, char **argv) logmsg("WATCHDOG: playback thread silent %ds (active=%d written=%llu played=%llu, device wedged?)", play_silent, act, (unsigned long long)wr, (unsigned long long)plf); } + mon_tick(); /* 流活跃才写监控日志(无流零开销) */ } logmsg("meow_audiod shutdown"); + mon_close(); pthread_join(ti, NULL); pthread_join(tp, NULL); pthread_join(tr, NULL); diff --git a/patch_v2/meow_audiod/meow_audiod_host b/patch_v2/meow_audiod/meow_audiod_host index 47164c8889f3e64f5fabf28c25dd5a0a2b56b68b..1e037d8e90614cb3ea2519c8df2a710a22e9e905 100755 GIT binary patch delta 17832 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 delta 14655 zcmaib3w#vS_5Zm$o6XZa$YVDly1PkuB!mzkJhVzCi4{~@Aw)#cW&>EG(Lw-~0J@t% zTiT#y9PDC(5*}?ys%;b~EZP#lS{11=qDAnryFrVh76gPT;0F@RfMZZr7))}wCI^{@7{3@IAR;s3nUk>Uq z`~C~nE-^H3+MNc`K=`@I_;XUf5|3vr_DA0P`?5(D)7S4h^!7&+fARd&YyQ4%t>v#t z*+Wbr-wM4US&jFpL)80H#t+&mEZ;+y-?{CDl&@mN_1k`D&yAT^74z1`WhtE(_e;vT zxq~{-NmMkEXibo)m(EO%oSu=|={V|E&dyHjJWF(PM|jLJw0!kgv~cu{ZoNg=$>jL#4x%{pwv;y0X?-mCAV;O7j)IzB89JzuviEm^%B) zygAcI?-DLw-zU+oXNM_&&@_Js(RT2@8m=n~LB8t{MR@3GwCT(+whM#Uh}KnK)ei=*k@L7V~x8aHSQ)dNAxgh;tG(K7e6$80I=m#*mCcrNyN2 z88oMuMpt32p#rThRGL6@Mxw5cWK+##Dsw|U_xpuP39FV!T0w#T5b16*P_+vK{WS(F$3MlG??#`~N{vA&qpK%@YM#bB{L@RHPacHHk#*-$eUUO59i?i#v()y4J~3*!GdFHc zP|E6ZpK+^moq1kN7SG5En;iL4)9fro?@r27f*1_<>89#9N1k$&aTm04tSOb{DQ`w4 zBZ|Tg%ewGN5+^u9Jo!|^78^V>y4)uv_P|j=?${f(0T|o+m zy({JXgb-wfV|{&xFKJ%?*YI&rvKRdvL?2nGabz;pY zctIRoA(V%pp&Omto`CkXn7KEV>*&H;PYH z9^i3OW*3iPS{_%~D=GH?p9xtO{JiL__S_@~JPA~$TeP)Q`4^OW7up9CIiQegm{E$+ zUe4`wquqpd4+5JN>`9OV!4ukq47BgkW5(C_&P9$77?n;Do%fazN)WgRyyJ;EKjG`m z7O%pA5W<3(iGc_Z#6otFgtmrQ_>q-rK6-t^M2>!8^;M4s9&X-_WO6m*J_R$PCC`L5 zlY-=M-~qh%qb=g#A;br)K3REqgtCn35R7_EOz~Ck!8_uvh`#V@6PU0H2t6uw1+t1x z;2i>rLV&fVHU9?Wgu%i0F~)GvaWHbwt$eju;Q(v~{T$E*SqXTqU!p)bg#s5eOXoM} zTMSR1!3tTLToLG(&1)#1x{8y^^oGBYAHQ9TI~*7qxLA zDYHnQj5|w|+d=aQ)O`*~m+5@Td)1Wun8}_CTG=`92}_QmekrGDF=#kqYRS=1p=mW| zY?O8wxQokf=_KG!&zRPEcJ}nnb91XZBMmb;zg<+*sa3_OwfUKSCzoZRtGXKD~%zcc%KIVNUU5^?_l7z1zT;X*o5B7+yr60S@_0;dTpRx(n|e zpy>cy3*HETK^=oA0DHQ*nAuQ`n2+TQAxENHQ3nES4d~TNyx!7_PQm`OgXPG@Wfh&L zXH<4-l29;LYRd4^3GC35R8y|-PCOBV^sE4*GBV`APKmZ>qP^qwa(Kty6@-^Ws;~OX z3+h9|OA2oSIbG7mK}OfcSYP#T@$S2*Z6_-!>1bm^$KtSeC8-C8JH<5hi{V>Eg8JLS znchR+qEuKet7Y(v2e~XyaH2(IUMN>GF>=GD*v4SFudk)g*T(&!%|b~5UZ;guSZVih zmy!US?upMQM-Uw+`$1P(KuQHXit;Iv747E@dqPFjOKL+=yyeSp)rX2^ikH=cMNeau zPE?;B;S^idzmBl0!;8z@Zm3A&{De_}Y)FqdKOU(#pyEAfmjjCWNOAu3mF8QGg=-pL z_51t|sumOP1MHU^dTwN;D`%17UP6i$Mi6^`9x46bU`&dy`XJz9^;EGv_D>kKqdHYh z8JX$+LzLr-*kLg$SWAUL1ju#3ci7I4e^LG6NN3?~Oobeh$DstO{dnJCp#~W_ov9h8 z)lz4Z`q;<<*Gg0eNMt;~jbiN(D{$H1XVtex+Vkgt#SR-aZoH(`u&T|E$|}tg$}x;2 zfr4mSs+w3bfdh4Fr?x`kAbt1ZvcGj+gaxN(h|beaUp3DK zEl(fpTrEa7AajSjtE-(P8tzBXt4Y4<^rW|QLI`?JRtJ!@xGkgoD%xSRIb)xmQGrZK zCoeABx0MPcWz{9ko=!fg`YTPnZILSF; zhs~-U9d-2;t>{O}8s{5I$}H7g>J;nLiqdp(K)to}2jW3hDRsmZTNM^sraoVqe)YXb zGGQ=a6`@Wq9kMD#JTF+=>A4g*jf#M&*$v;(Oo>t4>c!G2E@-6>Iv%4WVUXNlQ)GyrtI$S1l! zgD$F%j~N>mjN@3W{*(IJn5rTF!tz8Ubm?}ii&vfkJ?6uToz@ddU34NyD_5qFD|Q!rnYyrD(Nj)u!d9Q#bvQL3kpO~ zT;~~Br6P@;-lbUd5f%Y>h#}MAP|^;%s5*VXM@yW%^e`9 z#dcYzR*XycHo&LQung5q5vRj23M~{$2s*to=_Oa9VqqF7w`eLx=3;|kQ5Ueu=$jZe z;5w|W4T+e4Y{dFp-JhhK1+Obn@$fi(0~@}ouLt9K9FKRyr0nAkZ=slmrJg7U#2XY~ zCd`Z=Bxn+{5D%(()VzUm1Tqf}qYOgD773v|wW41adOT4%e3>7d^C++y0)GR)eZ)Jh z4Z+Dr4je@sGmvIcdIlx0qw5p9RQTC>Xog7q#9meCLMHzi24aH}j$rn9$E;OlMF z6w(q4L;a+jfuh~82uG4Z8vvuVt#;JXnFeJ$5O5xx2&>Vz(IQ&w7E722b+a7ku^Rj>kC=N^LyWhO zEl^=q2XB!YgrZZQ&zfX~mz7(iz+4DBhccIyiw08(tYxd7!xk1oQqjjuOi^Zm_8llT z2nzUM$OZ7`sdS?1lu^R3#rtCq8eBoxHzOk) z2dp}(=@~^js@1H(oO>O#vhN45G&6C3+m1)KwC}Odi5*Y)+IA!u?+>D$d+3v@&SS7} z*?oM9adi10;2J6GK%JD;y2p}pV&@ZWZCvYpdQS86dpv?lOOQ`(ve*yw=dEiC;Z!u2 z><5VKtwGTI#gf(9lki>}9nK!y?zxI0e2C71#(bXb0DSO}w!Q9%I%s0C*V4(sFdfMA z(15B)AzTH>$F-ex3*|^T(TUCf)@nSTA(D^~T=28!Gh`v&8edLQ4#2W3*ZRIE5p{q0 zTgO+U;4;roP81$Txs_@>7-{3ptCL1!+oJ5+QHA`;dM4LHW4h$(> zku&s&ejC&4Xiq@>?&zwZ=IZcZ3j7sr3J=DylQR%AqPMj1GQ7ZHdxSgnd~9Z*V1lAR zsDcT;xNI_?`1(%In1U1Ejo7hn!j5$_b}ZCKRnhwBrT^AP@Wk2Kmd=Nua1RVShXV?X z<6FjVT#nQ#Y@w@E1UxnoK>3oZ6E!7!fKkO6)|6L$&l=Y+sU{KhEx5Yo za1Wk{RZhdRUUm(;KX_Vdf)d^7vVO(YyU4gwRp7R+W(*2S)~*d0z-PZkT^S_K{#a$- z6~5{Rfk%{-%`g@F0`EqMryHB>nRI0fE9aF1U!w0{nCiXbIhxYFUAvhnIt1e7Hnb5Z zWfdl)qj>+$!mu2#f=h2h&BMJW2ivkzDhPX*IS3-UPepaE5X#tR&<@%w1mxa-k-r zc4A7De}I-N=&$$Vss{r3-p&G{AD_j7{%BuQaG4zW1~d=aXgpht_|kba0mml?ZwGD) zIq2%}dlg6vWsYg)c!2Pi@xBD^?1vz?iCYPX(|dIYd)*ZD6BtVIE!ATA=62Cgw~IYS zxDRl;=u{mpvzX69osJF3RPtd+Dl(BB`xkjO&uGtv>%zEEn+~GzquK2&h$Ks^Xvo{e z>l7D5kxb)Kx0~i=D(PUr0sHlAYr@{QXrS6sw-EuH!l{d>pAf&AdFtM{o_-k9sH z$x`;9RN9Y0?@W>ddu(#!Yv63w_uW)#S9YTRMf7jvym=4lJMHmvU~~<3+Mmfyp%q*M zN{zuAsAen5XlI<%=o(Emad3{4&`yPuphV~%ED0zT1gs=F5QLSuQx~n}2(Kss8CoAW z2!T$A)QEFV&7Ndxe61YUo|STdx9?3zkhO5ByAlZ!i8EY5WzHn2F*J#4<{-idF3iWI zZr+EfNT7D9ST6&*$(pOIgfaRw;PCg{SXQmUf+9ARliC~7M(XBN>OUV#M*CbftN zXMxn{nG9=&OO1OY9EMgUIG-Y{So|GS(*wnNZa+W4xkfZL;}(H>n{$FHgmWH73Jj^p zNQk;1z7g(6#0g%9=yR8O@c|3hXZOGZ=aD;U3V$`j)jtHkz+OQePymR*Z()IT^=KRV zur-_*4p;L!V_K&9186#Iq|^c8rliaFLwpEB{l_Jm8#FtC=ketYE?m$%y3S*XOaks> zFEo=ZzCPTvbn}hMN>7shWhS^eUfE$m&cjViDG0Ifx^6O=yQ*jhGxpaZqa<-#G``~MaG0)&T|A$#aW!0mRWAI!KEp9-b;gnR*B z@ZpX`ptReIZ(n4sz$xkb!d&8iGt~QiOZ{NRg6MjOaufo}Ab?$*Q(Ey|Fgey#1Vk(@ z6xN79^NSS$T`)?A5brqf7Obky$F8tHmCEu_TYAaTP=_UmDXMPb)vLmH6)ISRPY|gJ&d&ft=ZVM6Dan7`f9mmkODl z$Axc3vdJf99r~`Rr6%^2428-yXJNUP)|o#7UqNP5Q~7=hlrN%)w;Y@5E7-@Jxa$aO zzv|0=c|(rNixcSbKzlg~vU~A~u>}!qN$B{B--qLU6W-l%``X%|tUIo!&8^eYiE%Dp zn~V!UVFoNK2)?Iky;A3nK^xj`&8LWrfUX)L2gW7QcH1Mqv3*y2H@E-(QCs^faqqRU z^{!gEsTB$hnJqVQITMy_T;Xwr&`sB7D-WGl|McT)yzF(XtZMNR1=geO%eN?xLmtN& z2Q~*k$C_`H5!=B;Bd$5t&tri^<6Gl+$E+n`=6w)d3(+efnjQBs#J9kiAzX~<;^T6Z z8xa+oE@?LVH4r{uZM-GjyYWlxEF35^tl!OD7!`m88uQ#ams6*6x#-O2`HDrIQe{qh56t>)(#*U^JZg@f9-GBXY= zh=H@%tYz%FJ8;atbNP<;3vsl)qaJ5MhAtGp5}lY5hjlG^k&CMcmpw-5dE~TyK3qdM zAM#~EXa#n2d>-~B?aOiZxLRqoWpMbHz)e|I-7h*8Qe1v}xcn*HDW`T;F8ae)dl zC2FX^jY0yfs>+um9&CB6bs=sf!d2J~u~dSH)@L|McZo)PzpRl}IkFj-1oDWAK$VJO z00l+G2oZ2*7{#0eMsXyBrQ9xhIY$xxihy??1mNDS?_*Q~5OB)ske3Gc;UWO;^Bo$}FTk%0>FY@~xP@su2p;-2b5WKifeX32CGF$OAv8x{zPKGx_ zP?r1qq41~hOpD~e&4!~jDCKnZSCKa|2}J!MdJ+Spd+SDA8n_Qh?ZTIH{uT7Urw5R) z8lQ{p&Qz(BqGET7jqqX zUW>8^Cn0=FvO6bB$EJdvnyZDRgUALAvjEQ2K(cc&+x_l1k&Q?gDLU_ zE(yP^qQHM{#))7AJ{r%aKqZ!0|6B@4KK}3_b(O=LJnoCHG`|(`;pOGl4+N(cf#bnY zctRJtK3(aD+qp`)7uxrrN^#-b9E|SS*m^~(>GEQyG8!)KhId39P3N=js~8it6g6Dn z-^c@7(GSCnbmVg?1?NygZ3Ysbocprzd*5syG2u}_xbtd93Mvv52V6Ml%HjJP7Xdl2 z&JK$>*TLm$=+$zCgE@%JL7#&6ok|dYM)kWyqv%);+HYXQ#|Yd#mfRDY^JcGaW4F$w z+yg5?ywQ?-z$N9jvfIwWMLd^3f+g$syINV;#_Ld2@Z1h}DFHC!3tztM)rF%JO9hV4 zGBQ3cZcx9d$*rH~Qo{Jcn1K$suZ(@KTd>8YECQ|)f)DW-C`ZTuS!^RDVA~gUve;HOH%X{} zo;_N1+?ltnYF?r6@?ZYt;e8R)O)B^YF6hxi6|q;P0u~myzZ(3u|3f|U)1lrV zy5bmbK0IVCe!ak(e_N@u*$SM4U3VGXOK7uuhhK*4Mf-Z-W?hCmhW0ApGE5w+fO}cS zsXOm+$GhN8E8Lx=hVIG8T>8%2hd%f)nQ2+rRCFGDO--mTvMoom`*ro2`jYr=G%sKV z9BN~ImVH@rY1M}xU>uKP&H|1g~U&2&hi$5}h++I=jbkZ}4m1@G;_#2*#`)#b>wl3x=Yn#+= zSudo0;^_PD9r@Scci#QZb~eKU9@~$oUH6sP)}p!msQTf3MYfmGobtY!+)#2W4uaHy zkD#m5bRixVF*!MS1xxuKLS|T#J(EBD;J=cRNye~itq2kv+Ph6fEvnLRl{m7kyJ5+1 zww-LSCM0y2eq`rmrb6-u2~)=4U4Ua}%#GN#MRV@pq0w15ea| zE1-adys(TH44%~nplrP(iO!h#<)-|hCVs(KgYa3CUN-T$Wd=fDw`fiSUN^vMGH@CF zGfnzgKfpWBZ`5@^H9KmqH3*~lB_@8_bp}4FXtRlbKZ@tIjHeZN7VPi`;zW5i7ZQT9 zurLfguxjv9XyToZ zwJ0_5Q7yhO@nt6dev|%;fzP9k0RuF1z?LZ9-<%?xHzq?I8@`pbiqgvc#;^hJO=_Y=`0CuxY z{Ne%lpPBe21Mm+Uc>isQA}zbcB=QX)YV|iKLdPe~?p0=Y)FWJaum{%+81{mRUpIjM zZzjHD0R3wwe(M1G_YAz3x(5shn*+8Fz<*}qcMZUwHSsSEzzghYY(UQde1eI8S;u?- zJDG#bj#mc^xXQ%$n)s-PMw$4-1Mt_G_}~COH=6ikm*ek7G)*@e8 z|2?9=;-A?%{eSUMg$(*s>K(9$&6E5~t>UUN!Gb6U1I`B@&Yc7CjV3;Ih<{VE80ubW zzE2&nJGJS0*s0t9X|foW_j~;{ol4FB0}~Z?&>Y?|#6KoQ47I!``R_;(SIwy(pr)Zd z*qLiEI({C;Tj`V*eUHMZxi8g4F$UyfMj*evROdeedBWyLfnm>1(HHIitP}G5qf^Bw zG0|TKDshtm?lQp74B#_>Vt`Es*kgcR9mIse-KC~k((|{Y{&69-v2QPbE`cHy@d)$$ z4XI*?80H_HB^-W*#r{|aF|{#7dCWyL8Telr;Ax}#FX&FwyI<82*<)=6&sl%@zO2JW z_i@mtLY09Y{g2-5?@kjAk>P(njWZlL4YFK81FNnv|A&M!|LAn+JxL!eW*Oi<11vSb z;|ADZfX8&1Vz=@3h5^C`_>BQh8^CU`hI?4T4F?P~w?8G2wa$eztqmsO#9P(d%YxE{=w{|UxdwB+L`Snk?-th^;3o!{Zva?=p+YslRzqC3{+9g;__3=7 zitE$6W5VdxT`VpbqaFTcJ9w2Epi&3f_%9`hxCB~fHPyPVK$(X;JNh`S;&{_rirGqy0m#6t11Wxl*LX?|f#c2wN;$$M{@5cNd8p1WqORpL3(qq8{!R#-6a%Ur{V3ptq@5l#9du06->Lj7}FX0X&28`?ddy Zkzz!=%Pg$PUolclu(K{|`lUb_)Oi diff --git a/patch_v2/meow_audiod/test_audiod_host b/patch_v2/meow_audiod/test_audiod_host index 397509967322032ee2c8351a218861473759faf6..500b5133904a47d5989709f375b658676cdea672 100755 GIT binary patch literal 72672 zcmeHudw3Jq`R0-28|G%P0S5>kaY>95i~$3=5o8-@ibV+}O7#EyCwC^`_jy)1q zx6khL>>vBgB;w5Xp6`6;JMa0VHkp{XEbLiEQshbvvGI(yoKYPcyM|>l z8@rs%W@*Sz!B6NVrbT9C;u2|wCNc|BDtDOYC#JKwo=8RQl&12$v67RkG*qNaZH@LX z`D(kM<=ZZ37DalT9KsdlsVGP8QMpQ9u9BA%X%_ciq@sP)Hu?p4equTwd31@Cbm^j$ zey{R&B&HJb=#tcbHC?)`{3z_Ea=F)O8HwrR8q7pWx^#U7<*0rC?v=$A?YzEZe0Fml zMJoD_>dnEAvMV;-#18)HqrL~m&-wYJ>^;hFOm}6p_Lh9O*z2iX>~$~ldVI|-i=57& ztA0gsVaQ*&MC%o@CG6q$-@Yt}+RjOrs$1A}fV`u4_F7ah^-@*#GO)4mKP17UNpSLC z!Y}dq7J#wrQ}~UAe++zXq7lgEB>w+6iJd?a{gp}Z%aY)~O=ADyB=}d7;760-KS+WH zli*SkKi4MFcP7DSCb4rl^dWw7Pe>Mr;nFRk;68vi55`KwSRT6)$OoAVTfw9`l9P6t$ zI^1$l-s%a3t%KRfDFs9Cx;;f8(4G5E6V|@4F5BCb6_cR$Ss~QbB6sM*v3@s;tn@D;g#GXyQofA zi_=l(@j1PoJ7m?>`XH+d%c!HlgMYS;dfg~Dx*7v;#_JEs3=+I!+nt_pz~g2vzt1PT z!qh6Ct{GGYZLbT-as%?@V9@7xc>OMC*yH!H?LkjiX3koFFwDGMWt5by&CZ~k!S6;| zGFH%?i{Fj8q*QEJUs~o^TDW8-6SvEXd3czyDp=H&f$oz3m!js;&Lp{xmP6|d{b#~| zM-W@Io=W)LuiS@aIF&sOj4sOGdr5wZF5k=!@_f=irk1y`Uvf;dXCBcP`y2~j_}lWS z6l3f7en#LMIDR^&IU?|GKAB~}ce(^F)YF@!^i9NpVQ$Jba=N8pQyuM)#3WBOpgwqtkZu-hl{-%Wk+?mew{k0!}asqX&s)e zvwvQP)4p!x;{8SaGHnE8EJKIWu1j25I(&uzk>={~Tpcdy@XK^~z7E&NRgn&#t<%3o zhtpavE}IUYBS56_ zUcZ*7%B7Ia*QvUyycY6Yo%|)pr8;>NYayGj zAFaO*@?4#KJLFQG?1NmZlY@|V>*Q^aAJxfsKz>Ol-vzmUMDCfg8?yNZQGd^rZ$qA| zlfMVKR43m9xmG71guGiP-v{|oo%|r=mvr*Oko$G=qma$3M(h6(Ole*n2(C-*}(uU6~Vh5EmBdvV7v+9$rZx0lAlV3nzTXp6c1oXgTa+>p}# zc__6#=34Yx%wisnGSTSi`_3ROIO}S zY6hm_RIWZ#*^aT+J(YE}na;0(V?FH7OyyqEXAyfJWGieB_+7(uVbjITr>MO2Us!b* zI_%Da_92T&iLkcdF_NkLtC`BT#C>4AvK#kN%e0PrQ4i+TCamf`(HTc)T06%pgTQv} zz1QBq$E=V}OFBE;_fuOJc1Z;+mo1MzX6vFd(e$JAnAT%`XT0(;%Jkh_(mMX#-Mt@; zuU@!1g*6RSm9$dbSdx0!x=iKnuVpG{U03b9J1g=am9wEO*0bZ4>){KP-8~^J*U%eujaS%>-?iJ& z_GYqc$?l*wOoV>hRJNS_F||xUyRthx$cK$HBkedcK{*B+Sg(5ekw4;N&je*EbkCKU zlzz0G>^XBI_RlOS%0TKUf7X6O}LVx=E(`t?MQ# z)EC13F4%uvZ~IQo_I_^rMwA!2k3jcDy>6SPyNh&>AFxZ{VyVuT-vJ+*XHs^(06qA0 zCHG~7hv-Bl2p!`3#1}k%=1)?Fa8GT|Kpt_g`c5(9o}|

wnp-m;(2s52tmUg539l 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.log(宿主无卡降级)。 ---- */ + printf("[T8 level meter + monitor log]\n"); + unlink(TSOCK); unlink(TWAV); + g_audiod_pid = start_audiod(); /* file sink */ + usleep(400000); + struct cli m8; + check(cli_connect(&m8) == 0, "connect M8"); + m_audio_open_ack_t ackM8; + check(do_open(&m8, 44100, 2, AUDIO_FMT_S16, &ackM8) == 0 && ackM8.err == MEOW_OK, "open M8"); + /* 喂 ~270ms 的 440Hz/0.3 幅度正弦(>2 个 100ms 窗口) */ + for (int i = 0; i < 12; i++) + do_write(&m8, pcm, (uint32_t)gen_sine(pcm, sizeof pcm, AUDIO_FMT_S16, 1000, 440, 44100)); + char q8[1024]; + check(do_query(&m8, q8, sizeof q8) == 0 && strstr(q8, "rms=") && strstr(q8, "peak="), + "query exposes rms/peak keys"); + int rms8 = -990, pk8 = -990; + for (int i = 0; i < 20; i++) { /* 最多 2s 等首个窗口结算(播放排空竞态护栏) */ + do_query(&m8, q8, sizeof q8); + rms8 = atoi(strstr(q8, "rms=") + 4); + pk8 = atoi(strstr(q8, "peak=") + 5); + if (rms8 > -990) break; + usleep(100000); + } + printf(" sine 0.3: rms=%d peak=%d (expect rms≈-135 peak≈-105 deci-dB)\n", rms8, pk8); + check(rms8 >= -160 && rms8 <= -110, "sine RMS ≈ -13.5dBFS (±2.5dB)"); + check(pk8 >= -130 && pk8 <= -80, "sine peak ≈ -10.5dBFS (±2.5dB)"); + /* 静音 → 地板(轮询等窗口结算:窗口按块粒度对齐,消除播放排空时序竞态) */ + { + uint8_t zeros[4096]; + memset(zeros, 0, sizeof zeros); + for (int i = 0; i < 8; i++) do_write(&m8, zeros, sizeof zeros); /* ~186ms */ + int floor_ok = 0; + for (int i = 0; i < 20; i++) { /* 最多 2s 等纯零窗口结算 */ + usleep(100000); + do_query(&m8, q8, sizeof q8); + rms8 = atoi(strstr(q8, "rms=") + 4); + pk8 = atoi(strstr(q8, "peak=") + 5); + if (rms8 <= -990 && pk8 <= -990) { floor_ok = 1; break; } + } + printf(" silence: rms=%d peak=%d\n", rms8, pk8); + check(floor_ok, "silence -> -inf floor"); + } + /* monitor CLI 冒烟(流仍活跃:输出含电平字段+电平条) */ + { + unlink("/tmp/meow_mon_cli.out"); + pid_t mp = fork(); + if (mp == 0) { + setenv("MEOW_AUDIO_SOCK", TSOCK, 1); + int fd = open("/tmp/meow_mon_cli.out", O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd >= 0) { dup2(fd, 1); close(fd); } + execl("./meow_audio_host", "meow_audio_host", "monitor", "2", (char *)0); + _exit(127); + } + int mst = 0; + waitpid(mp, &mst, 0); + char mb[4096]; + int ml = 0; + int fd = open("/tmp/meow_mon_cli.out", O_RDONLY); + if (fd >= 0) { ml = (int)read(fd, mb, sizeof mb - 1); close(fd); if (ml > 0) mb[ml] = 0; } + check(ml > 0 && strstr(mb, "rms=") && strstr(mb, "LIVE") && strchr(mb, '['), + "monitor CLI prints live level bar"); + } + /* 监控日志文件:活跃期应已写入(前面耗时已超 2 个 1s 节拍) */ + char bootts[64] = ""; + { + int fd = open("/tmp/meow_bootts", O_RDONLY); + if (fd >= 0) { ssize_t r = read(fd, bootts, 63); close(fd); if (r > 0) bootts[r] = 0; } + } + char monpath[160]; + snprintf(monpath, sizeof monpath, "/tmp/audio_monitor_%s.log", bootts); + char monbuf[4096]; + int monlen = 0; + { + int fd = open(monpath, O_RDONLY); + if (fd >= 0) { monlen = (int)read(fd, monbuf, sizeof monbuf - 1); close(fd); if (monlen > 0) monbuf[monlen] = 0; } + } + check(monlen > 0 && strstr(monbuf, "app=test") && strstr(monbuf, "rms=") && + strstr(monbuf, "hwrate=") && strstr(monbuf, "vol="), + "monitor log file written while stream active"); + /* 流停止即停写 */ + do_ctrl(&m8, MSG_AUDIO_STOP, ackM8.stream_id); + usleep(1400000); + off_t msz1 = -1, msz2 = -1; + { int fd = open(monpath, O_RDONLY); if (fd >= 0) { msz1 = lseek(fd, 0, SEEK_END); close(fd); } } + usleep(1400000); + { int fd = open(monpath, O_RDONLY); if (fd >= 0) { msz2 = lseek(fd, 0, SEEK_END); close(fd); } } + check(msz1 >= 0 && msz1 == msz2, "monitor log stops when stream stops"); + close(m8.fd); + stop_audiod(); + printf("=== SUMMARY: pass=%d fail=%d ===\n", g_pass, g_fail); return g_fail ? 1 : 0; } diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 4d482c3..e2c8503 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -38,8 +38,8 @@ 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|772cc3d836c06b84efb67edde894cc3e|独占音频守护 M2.96(+真静音写255 修炸耳安全事故) -patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|c23b96490842f54324b855fd9c2467a5|audiod 用户侧 CLI(status/tone/route/vol;connect/write 全有界 2s 超时) +patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|ab193a2bd094f2c9f975f0f28ba09cba|独占音频守护 M2.97(+DAC 数字域电平表 rms/peak + 1s 监控日志 audio_monitor_.log) +patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|891ab26475ef9e9931bf9147d265dce4|audiod 用户侧 CLI M2.97(+monitor 实时电平表/文本电平条;status 补 rms/peak) # ---- 开机 init 脚本(etc/init.d,数字决定启动顺序,按文件名自然序)---- patch_v2/meow_sysui/S70meow_sysui|/etc/init.d/S70meow_sysui|e435affcb56499e5229728c6ae2524b9|sysui 自启 M2.85(launcher.conf enabled=1+迁移)