fix(ncm §33): 流媒专项批六项——流式SIGSEGV防御日志/档位保真(无损级必须flac+显示档按实际)/封面4xx不重试/收藏显隐/缓存命名迁移/topbar位图图标

- §2① ncm_api.c level_attempt: 无损级(hires/lossless及以上)命中必须 type=flac,返回 mp3 视为该档不可用续降
  (修「hires 档静默给 mp3 被当命中」)
- §2② player_manager.c eff_level_for_resp: 显示档按响应实际格式/码率——mp3 绝不显示 Hi-Res(≤128k→标准, 否则极高),
  flac 采信链 eff; br 未知钳 ≤EXHIGH
- §1 流式 SIGSEGV(《十面埋伏》sig=11) 审计+UBSAN 探针未复现 → 落地防御日志(dl start/done/interrupt + play done fin/exp/fail/underrun)
- §3 cover.c: download_cover 回填 rc/status; 确定性 4xx(404等)不重试立即跳下一张, 仅瞬时错误退避(rc=%d status=%d 日志)
- §4 playlist.c: pl_show_fav 我创建(is_collected==0)隐藏收藏钮, 我收藏保留, 搜索歌单保守显示(评论槽并入无空洞)
- §5 ncm_cache.c 双点→单点迁移 + player_manager song_local_file 旧键→当前档位键(不重下)
- §6 home.c: topbar 动作 ⚙↻⌕ 迁移 sb_icons 位图(meow_topappbar_set_item_icon, 修 4k 字库豆腐)
- 测试: test_ncm_core 新 test_grade_flac_gate + test_cache 双点迁移断言; degrade_sim/player_flow_sim 桩 flac 化
- 验证: stream/player_flow/window/search/cache_evict/degrade sim 全 PASS + test_ncm_core host+mipsel(qemu) + mem_sim + build_ncm.sh 0 warning
- 新 ncm md5 cb818786 (text 1017110/bss 1362500), 未部署留主会话; 0 真实 NCM 业务请求
This commit is contained in:
AskaEth committed 2026-09-02 04:20:46 +08:00
1 parent 68ce46a5d8
commit 44a790dc1d
13 files changed
+425 -24

No files matched your search

+5
View File
@@ -336,6 +336,11 @@ static void home_page_create(meow_view *v, void *ctx)
g_tb = ncm_topbar_create("我的音乐", 0, "\xe2\x86\xbb"); /* 刷新(动作0) */
meow_topappbar_add_action(g_tb, "\xe2\x9a\x99"); /* 设置(动作1) */
meow_topappbar_add_action(g_tb, "\xe2\x8c\x95"); /* 搜索(动作2, 最右) */
/* §307 topbar 图标迁移:三位码点(↻ ⚙ ⌕)在 4k 字库缺字形渲染成豆腐(WORK_STATE 310 前置
* 症状①),改为 sb_icons 位图(Material Symbols Rounded,字符标签仅作占位,绘制走位图)。 */
meow_topappbar_set_item_icon(g_tb, 0, MEOW_ICON_REFRESH);
meow_topappbar_set_item_icon(g_tb, 1, MEOW_ICON_SETTINGS);
meow_topappbar_set_item_icon(g_tb, 2, MEOW_ICON_SEARCH);
g_tabs = meow_tabbar_create(r_tabs.x, r_tabs.y, r_tabs.w, r_tabs.h);
meow_tabbar_add_tab(g_tabs, tab_label(0));
meow_tabbar_add_tab(g_tabs, tab_label(1));
+31 -9
View File
@@ -66,6 +66,23 @@ static const ncm_playlist_t *pl_cur(void)
return NULL;
}
/* 收藏按钮显隐(WORK_STATE 2026-09-02 用户报 ①):「我创建的」歌单不显示收藏按钮。
* 判定:home 打开的真实歌单(active_playlist >= 0)is_collected==0(=我创建的)隐藏;
* 搜索歌单(NCM_PL_SEARCH)无法判定归属,保守显示(外部歌单可收藏)。 */
static int pl_show_fav(void)
{
const ncm_playlist_t *pl = pl_cur();
if (!pl) return 1;
if (g_st.active_playlist >= 0 && pl->is_collected == 0) return 0; /* 我创建的:隐藏 */
return 1;
}
/* 评论按钮实际矩形:收藏隐藏时其槽并入评论(拉宽覆盖原收藏位+评论位,不留空洞)。 */
static ncm_rect_t pl_cmt_rect(void)
{
if (pl_show_fav()) return r_cmt;
return NR(r_fav.x, r_fav.y, r_fav.w + r_cmt.w + 12, r_cmt.h);
}
static int pl_src2(int idx, meow_list_item *out, void *ctx)
{
(void)ctx;
@@ -155,16 +172,19 @@ static void pl_draw(void *ctx)
}
meow_ui_text(nmx, r_card.y + 16 + th->font_body + 8, meta, th->font_body, th->onSurfaceVariant);
/* 操作条:播放全部(红 FILLED) + 收藏(OUTLINED) + 评论(红 TEXT+badge) */
/* 操作条:播放全部(红 FILLED) + 收藏(OUTLINED,我收藏的才显示) + 评论(红 TEXT+badge) */
ncm_draw_button(r_plall.x, r_plall.y, r_plall.w, r_plall.h, "播放全部", pa->red, pa->on_red);
meow_ui_draw_rect_round(r_fav.x + 1, r_fav.y + 1, r_fav.w - 2, r_fav.h - 2,
r_fav.h / 2 - 1, th->outlineVariant);
meow_ui_text_center(r_fav.x + r_fav.w / 2, r_fav.y + (r_fav.h - th->font_body) / 2,
"收藏", th->font_body, th->onSurface);
meow_ui_text_center(r_cmt.x + r_cmt.w / 2, r_cmt.y + (r_cmt.h - th->font_body) / 2,
ncm_rect_t rcmt = pl_cmt_rect(); /* 评论实际矩形(收藏隐藏时并入其槽,无空洞) */
if (pl_show_fav()) {
meow_ui_draw_rect_round(r_fav.x + 1, r_fav.y + 1, r_fav.w - 2, r_fav.h - 2,
r_fav.h / 2 - 1, th->outlineVariant);
meow_ui_text_center(r_fav.x + r_fav.w / 2, r_fav.y + (r_fav.h - th->font_body) / 2,
"收藏", th->font_body, th->onSurface);
}
meow_ui_text_center(rcmt.x + rcmt.w / 2, rcmt.y + (rcmt.h - th->font_body) / 2,
"评论", th->font_body, pa->red);
/* 红色小 badge(评论置灰入口) */
meow_ui_fill_rect(r_cmt.x + r_cmt.w / 2 + 34, r_cmt.y + 10, 6, 6, pa->red);
meow_ui_fill_rect(rcmt.x + rcmt.w / 2 + 34, rcmt.y + 10, 6, 6, pa->red);
/* 曲目行:红 mini-vinyl 缩略 + 按压红条(文本由 listview z=10 画) */
if (g_load_err == 0 && g_st.track_ids_count > 0) {
@@ -411,10 +431,12 @@ int playlist_on_tap(int x, int y)
}
if (x >= r_plall.x && x < r_plall.x + r_plall.w &&
y >= r_plall.y && y < r_plall.y + r_plall.h) { pl_drag_reset(); player_play_song(0); return 1; }
if (x >= r_fav.x && x < r_fav.x + r_fav.w && y >= r_fav.y && y < r_fav.y + r_fav.h) {
if (pl_show_fav() &&
x >= r_fav.x && x < r_fav.x + r_fav.w && y >= r_fav.y && y < r_fav.y + r_fav.h) {
pl_drag_reset(); ncm_snack("收藏功能开发中"); return 1;
}
if (x >= r_cmt.x && x < r_cmt.x + r_cmt.w && y >= r_cmt.y && y < r_cmt.y + r_cmt.h) {
ncm_rect_t rcmt = pl_cmt_rect(); /* 评论实际矩形(与绘制同口径) */
if (x >= rcmt.x && x < rcmt.x + rcmt.w && y >= rcmt.y && y < rcmt.y + rcmt.h) {
pl_drag_reset(); ncm_snack("评论功能开发中"); return 1;
}
if (g_load_err != 0) {