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:
1 parent
68ce46a5d8
commit
44a790dc1d
13 files changed
+425
-24
No files matched your search
@@ -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));
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user