fix(ncm): 歌单切换两bug — ①暂停态跨歌单点歌旧信息(play同曲护栏改按曲目id判同曲而非裸队列下标,切歌单后同下标换歌被吞play→修play_is_same_song) ②切歌单封面残留(playlist_tick补cover_changed/ack+invalidate重画头块);附带占位行cover_request野id修复;宿主P15/covswitch PASS,热更ncm

This commit is contained in:
AskaEth committed 2026-09-04 00:14:37 +08:00
1 parent 62ec405dca
commit 6eccb17f9b
5 files changed
+150 -17

No files matched your search

+6 -4
View File
@@ -743,13 +743,15 @@ void player_play_song(int idx)
g_st.queue_src = NCM_QUEUE_PLAYLIST; /* §23:歌单窗口队列 */
/* 黑胶封面用真实专辑图(song_detail 的 al.picUrl,经 ncm_cache 缓存/限幅);
* 滑窗未物化(占位行直点)时回落歌单封面,元数据由播放线程物化后快照接管(§17)。
* §18:g_st.cover_url 只作「歌单封面兜底」。 */
* §18:g_st.cover_url 只作「歌单封面兜底」。占位行直点(appstate_song_copy 失败)时
* s 未初始化,**不能**把 s.id 传给 cover_request(会带出一段野曲 id 参与兜底判冷却)——
* 仅物化成功才带曲目 id,否则 NULL(歌单封面,不带兜底)。 */
ncm_song_t s;
const char *cover = (appstate_song_copy(idx, &s) == 0 && s.al_pic[0])
? s.al_pic : g_st.cover_url;
int have_s = (appstate_song_copy(idx, &s) == 0);
const char *cover = (have_s && s.al_pic[0]) ? s.al_pic : g_st.cover_url;
player_manager_play(idx);
appstate_set_playing_song(idx, NULL);
cover_request(cover, s.id); /* 曲目专辑封面:带 id,死链时 song/detail 兜底(REPORT §NEW 任务1) */
cover_request(cover, have_s ? s.id : NULL);
g_ppage = 0; /* 新曲 → 回封面页 */
meow_view_page_push(ACT_PLAYER);
}
+8
View File
@@ -386,6 +386,14 @@ void playlist_refresh(void)
void playlist_tick(uint64_t now)
{
(void)now;
/* 歌单头块封面跨页同步:全局单封面(与播放页/mini 栏共享)由 cover worker 异步换入,
* 本页须判 cover_changed 并重画头块封面带——否则切歌单后(或从播放页回退时)头块永远
* 停留上一张(歌单封面不随切换刷新,实机 Bug1:切到 B 顶图仍是 A 的)。仅在播放页 tick
* 消费 cover_ack 是不够的(该页 inactive 不跑);此处 play 页活跃时消费并失效封面带。 */
if (cover_changed()) {
cover_ack();
meow_ui_invalidate(r_cov.x, r_cov.y, r_cov.w, r_cov.h);
}
if (!g_plthr_on) return;
if (g_plgen == g_placked) return;
g_placked = g_plgen;