From 121d30ec953b5e8ab4f3636dd90280e8f4d77948 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 2 Sep 2026 09:32:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(audiod):=20=E5=AD=A4=E5=84=BF=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E5=9B=9E=E6=94=B6=20=E2=80=94=20=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E5=B4=A9=E6=BA=83/=E8=A2=AB=E6=9D=80(sig=3D9)/?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E9=80=80=E5=87=BA=E5=90=8E=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E5=9B=9E=E6=94=B6,STATE=20=E5=9B=9E=E5=B9=B2?= =?UTF-8?q?=E5=87=80=E6=97=A0=E6=B5=81=E5=9F=BA=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: cli_free(EOF)与 STOP 路径只置 active=0 + 唤醒排空,未清 sid/written/played/underrun/ rms/peak/lvlseq——ncm 被内核 OOM 杀后面板 /api/overview audio 块残留(active=0 但 sid/统计挂着)。 修法: 两段式 session_end_locked(即时置死+清 sid/app_id,保留 rate/ch/fmt 供排空算 frame_size)+ session_clean_locked(播放线程排空完成后彻底归零 rate/ch/fmt/written/played/underrun/drop/stall/ rms/peak/lvlseq)。顺带修 dac_vol_set 一处 -Wmisleading-indentation。 宿主 51/51 PASS(47 既有 + T9 SIGKILL 孤儿回收断言 STATE 全清,模拟子进程崩溃). meow_audiod b122c9b8 交叉0warning --- patch_v2/meow_audiod/meow_audiod | Bin 153324 -> 153484 bytes patch_v2/meow_audiod/meow_audiod.c | 49 +++++++--- patch_v2/meow_audiod/meow_audiod_host | Bin 77216 -> 77256 bytes patch_v2/meow_audiod/test_audiod_host | Bin 72672 -> 72784 bytes patch_v2/meow_audiod/test_audiod_host.c | 113 ++++++++++++++++++++---- 5 files changed, 135 insertions(+), 27 deletions(-) diff --git a/patch_v2/meow_audiod/meow_audiod b/patch_v2/meow_audiod/meow_audiod index 3cb7d08d3f1bbac5d2df381eb7b1e1d7f07b4443..50b8db18e05e8a3db1c009326443ca2f06f8cfb6 100755 GIT binary patch delta 31254 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 O3}IrZo}LI?G6n#%Hy{Q8 delta 31427 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 diff --git a/patch_v2/meow_audiod/meow_audiod.c b/patch_v2/meow_audiod/meow_audiod.c index 43dbc1b..493315d 100644 --- a/patch_v2/meow_audiod/meow_audiod.c +++ b/patch_v2/meow_audiod/meow_audiod.c @@ -111,8 +111,9 @@ static int g_logfd = -1; static volatile sig_atomic_t g_stop = 0; /* ---- 共享态(g_mu 保护 + g_cond 唤醒;g_cond 用 CLOCK_MONOTONIC,main 中初始化) ---- */ -/* 前向声明(供 cli_free/dispatch 使用;定义见下) */ -static void g_sid_reset(void); +/* 前向声明(供 cli_free/dispatch/播放线程使用;定义见下) */ +static void session_end_locked(void); +static void session_clean_locked(void); static void _audio_mark_reconfig_needed(void); static pthread_mutex_t g_mu = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t g_cond; @@ -556,7 +557,8 @@ static void dac_vol_set(int pct) int t = 100 - pct, dac; if (pct <= 0) dac = 255; /* 真静音(DS1039:255=-127.5dB) */ else dac = t * t * 192 / 10000; /* 感知平方锥度:dB 衰减=(1-pct)^2×96dB */ - if (dac > 255) dac = 255; if (dac < 0) dac = 0; /* CS43198=衰减量(0最响255静音)+平方锥度(听感线性) */ + if (dac > 255) dac = 255; + if (dac < 0) dac = 0; /* CS43198=衰减量(0最响255静音)+平方锥度(听感线性) */ amixer_set(1, dac, 1); amixer_set(2, dac, 1); logmsg("DAC vol -> %d%% (L/R=%d)", pct, dac); @@ -1010,6 +1012,7 @@ static void *playback_thread(void *arg) if ((draining && av < (size_t)fs) || paused) { /* 排空完毕(或暂停):若设备仍开且已排空 → 关;否则等待 */ if (draining && g_dev_open) dev_close(); + if (draining) session_clean_locked(); /* 流已死且排空完成:会话统计彻底归零 */ cond_wait_tmo(COND_WAIT_MS); continue; } @@ -1065,18 +1068,44 @@ static void cli_free(struct client *c) c->fd = -1; if (g_st.active && g_st.sid == c->sid) { logmsg("client EOF: stream %u recycled (app=%s)", (unsigned)c->sid, g_st.app_id); - g_st.active = 0; - g_sid_reset(); + session_end_locked(); } } -static void g_sid_reset(void) +/* ---- 流结束/会话回收(客户端死亡或显式 STOP 后,STATE 须回到干净无流基线) ---- + * 两段式: + * - session_end_locked():流结束标记(停止/EOF 即时调用)。置 inactive + 清会话身份 + * (sid/app_id)+ 唤醒播放线程排空 ring。**不清空 ring、不清 rate/ch/fmt**:未播完的缓冲 + * 要写完(排空)才关设备,否则 tone/播放末尾被截断;排空期间 frame_size() 仍依赖 rate/ch/fmt。 + * ring 的重置只发生在 OPEN 授予新流时(ring_rebuild)。 + * - session_clean_locked():会话统计彻底清零(流已结束且 ring 排空完毕的迟后调用)—— + * STATE 归零:rate/ch/fmt=0、written=played=0、underrun/drop/stall=0、rms/peak=-inf、lvlseq=0。 + * 此刻 rate/ch/fmt 已不再被排空引用,可安全清零。txdrop 为全局客户端级(不随流清),不动。 */ +static void session_end_locked(void) { - /* 停止/EOF 只标记流结束 + 唤醒播放线程排空 ring(**不清空 ring**:未播完的缓冲要写完 - * 才关设备,否则 tone/播放末尾被截断)。ring 的重置只发生在 OPEN 授予新流时(ring_rebuild)。 */ + g_st.active = 0; + g_st.sid = 0; + g_st.app_id[0] = 0; g_paused = 0; g_reconfig_pending = 0; pthread_cond_signal(&g_cond); } +static void session_clean_locked(void) +{ + g_st.rate = 0; + g_st.ch = 0; + g_st.fmt = 0; + g_written_frames = 0; + g_played_frames = 0; + g_underrun = 0; + g_drop_frames = 0; + g_stall = 0; + g_m_sumsq = 0; + g_m_peak = 0; + g_m_frames = 0; + g_m_win = 0; + g_lvl_rms_db10 = g_lvl_peak_db10 = METER_FLOOR_DB10; + g_lvl_seq = 0; +} /* 处理一个客户端帧(调用方已持 g_mu) */ static void dispatch(struct client *c, uint16_t type, uint32_t req_id, const uint8_t *pl, uint32_t len) @@ -1176,11 +1205,9 @@ static void dispatch(struct client *c, uint16_t type, uint32_t req_id, const uin pthread_cond_signal(&g_cond); else /* STOP */ { logmsg("STOP sid=%u (app=%s)", (unsigned)sid, g_st.app_id); - g_st.active = 0; - g_st.sid = 0; c->sid = 0; c->state = CLS_OPEN; - g_sid_reset(); + session_end_locked(); } } else if (type == MSG_AUDIO_STOP) { /* 非当前/已 draining 流:仅清客户端绑定 */ diff --git a/patch_v2/meow_audiod/meow_audiod_host b/patch_v2/meow_audiod/meow_audiod_host index 1e037d8e90614cb3ea2519c8df2a710a22e9e905..f2b8f28b90cc907d53bdfcb2ef4979678ed96cd9 100755 GIT binary patch delta 11574 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 delta 11755 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 sYEj-oe*Un`IdkP?EquXfODc;5Z2Zb3&eE= 10 && probe_ok == probe_n, "listener/io alive during long feed"); do_ctrl(&l5, MSG_AUDIO_STOP, ackL5.stream_id); - char expect[64]; - snprintf(expect, sizeof expect, "played=%llu", (unsigned long long)total_frames); - int drained = 0; + /* 排空证明改为「WAV 写满 + STATE 归零」双判据:流结束后 played 已由 session_clean 清零 + * (会话回收契约),不再作排空判据;WAV size==44+fed 才是「帧无丢失」的 ground truth。 */ + long wavsz5 = -1; char q5[1024]; - for (int i = 0; i < 300; i++) { /* 最多 30s 等排空 */ - if (do_query(&l5, q5, sizeof q5) == 0 && strstr(q5, expect)) { drained = 1; break; } + int clean5 = 0; + for (int i = 0; i < 300; i++) { /* 最多 30s 等排空+回填 WAV 头 */ usleep(100000); - } - check(drained, "long stream fully played (played == fed frames)"); - if (drained) - check(strstr(q5, "underrun=0") != NULL && strstr(q5, "dropped=0") != NULL, - "no underrun/drop on long stream"); - usleep(300000); /* 等 dev_close 回填 WAV 头 */ - close(l5.fd); - { + do_query(&l5, q5, sizeof q5); FILE *f = fopen(TWAV, "rb"); - long sz = -1; - if (f) { fseek(f, 0, SEEK_END); sz = ftell(f); fclose(f); } - check(sz == (long)(44 + total_bytes), "long WAV size == 44 + fed bytes"); + if (f) { fseek(f, 0, SEEK_END); wavsz5 = ftell(f); fclose(f); } + if (wavsz5 == (long)(44 + total_bytes) && strstr(q5, "active=0") && strstr(q5, "played=0")) { + clean5 = 1; break; + } } + check(clean5, "long stream fully played (WAV==fed bytes, STATE clean)"); + check(strstr(q5, "underrun=0") != NULL && strstr(q5, "dropped=0") != NULL, + "no underrun/drop on long stream"); + check(wavsz5 == (long)(44 + total_bytes), "long WAV size == 44 + fed bytes"); + close(l5.fd); /* ---- T4:tone 写 WAV(由 CLI 走完整 IPC 链路;mipsel/host CLI 共用) ---- */ printf("[T4 tone -> WAV]\n"); @@ -572,6 +571,88 @@ int main(void) close(m8.fd); stop_audiod(); + /* ---- T9:孤儿会话回收(客户端崩溃/被杀 → 会话完整回收 → STATE 归零)。 + * 复现 ncm 被内核 OOM 杀(sig=9)场景:客户端子进程 OPEN + 写正弦(使 written/played/rms/peak/ + * lvlseq 非零、流活跃),随即 SIGKILL 子进程(内核自动关 socket fd)——audiod 应检测 EOF 并完整 + * 回收:active=0/sid=0/written=0/played=0/underrun=0/rms=peak=-inf/lvlseq=0,STATE 回干净无流基线。 ---- */ + printf("[T9 orphan reclaim (client SIGKILL)]\n"); + unlink(TSOCK); unlink(TWAV); + g_audiod_pid = start_audiod(); /* file sink */ + usleep(400000); + { + int p9[2]; + if (pipe(p9) == 0) { + pid_t kid = fork(); + if (kid == 0) { + /* 子进程 = 客户端:OPEN + 写足够正弦(≥2 窗口,使电平表结算)→ 通知父进程后挂死 */ + close(p9[0]); + setenv("MEOW_AUDIO_SOCK", TSOCK, 1); + struct cli c9; + if (cli_connect(&c9) != 0) _exit(2); + m_audio_open_ack_t ack9; + if (do_open(&c9, 44100, 2, AUDIO_FMT_S16, &ack9) != 0 || ack9.err != MEOW_OK) _exit(3); + uint8_t pc9[4096]; + for (int i = 0; i < 12; i++) { + size_t w9 = gen_sine(pc9, sizeof pc9, AUDIO_FMT_S16, 1000, 440, 44100); + if (do_write(&c9, pc9, (uint32_t)w9) != 0) _exit(4); + } + char ok = 1; + if (write(p9[1], &ok, 1) != 1) _exit(5); + for (;;) pause(); /* 等父进程 SIGKILL(模拟 OOM sig=9) */ + } + close(p9[1]); + char ok = 0; + int got = (int)read(p9[0], &ok, 1); /* 等子进程写完 */ + close(p9[0]); + check(got == 1 && ok == 1, "child client wrote audio (stream active)"); + /* pre-death:流活跃 + 电平表已污染(证明待回收的会话有非零统计) */ + int pre9 = 0; + char q9b[1024] = ""; + for (int i = 0; i < 20; i++) { /* 最多 2s 等电平窗口结算 */ + struct cli q9c; + if (cli_connect(&q9c) != 0) { usleep(100000); continue; } + if (do_query(&q9c, q9b, sizeof q9b) == 0) { + int rms9 = atoi(strstr(q9b, "rms=") + 4); + int lvl9 = atoi(strstr(q9b, "lvlseq=") + 7); + if (strstr(q9b, "active=1") && rms9 > -990 && lvl9 > 0) { pre9 = 1; close(q9c.fd); break; } + } + close(q9c.fd); + usleep(100000); + } + printf(" pre-crash: %s", q9b); + check(pre9, "stream active & meter populated before crash"); + /* 模拟崩溃:SIGKILL 子进程(内核关 socket fd → audiod poll 到 EOF → 回收) */ + kill(kid, SIGKILL); + waitpid(kid, NULL, 0); + /* post-death:轮询直到 STATE 完全归零(排空后 session_clean) */ + int clean9 = 0; + char q9a[1024] = ""; + for (int i = 0; i < 40; i++) { /* 最多 4s */ + usleep(100000); + struct cli q9c; + if (cli_connect(&q9c) != 0) continue; + if (do_query(&q9c, q9a, sizeof q9a) == 0) { + int rr = atoi(strstr(q9a, "rms=") + 4); + int pp = atoi(strstr(q9a, "peak=") + 5); + int lv = atoi(strstr(q9a, "lvlseq=") + 7); + if (strstr(q9a, "active=0") && strstr(q9a, "sid=0") && + strstr(q9a, "written=0") && strstr(q9a, "played=0") && + strstr(q9a, "underrun=0") && rr <= -990 && pp <= -990 && lv == 0) { + clean9 = 1; close(q9c.fd); break; + } + } + close(q9c.fd); + } + printf(" post-crash: %s", q9a); + check(clean9, "SIGKILL orphan -> STATE fully clean (sid/written/played/rms/peak/lvlseq zeroed)"); + check(strstr(q9a, "active=0") != NULL && strstr(q9a, "app=-") != NULL, + "orphan query shows no-stream baseline"); + } else { + check(0, "pipe for T9 child"); + } + } + stop_audiod(); + printf("=== SUMMARY: pass=%d fail=%d ===\n", g_pass, g_fail); return g_fail ? 1 : 0; }