ncm search: 历史+单曲/歌单分类+分页+误触修复+不覆写歌单上下文 (§23)

- 搜索历史:进页自动弹键盘;meow_config 持久化 ≤12 去重最新在前;空态=历史列表(点搜/左滑删/清空)
- 结果分类单曲/歌单页签:独立结果集+独立滚动;歌单行进详情(playlist_open_pl);单曲行播放
- 触底分页:offset 累加 limit=30/页 cloudsearch 同参数;每类各记 offset
- 误触抑制:g_press_row + g_press_delta>10(对齐 home/playlist §13.3)
- 结果改独立数组(不写 g_st.songs[]);播放搜索单曲建搜索队列(queue_src=SEARCH),不弄丢歌单窗口
- core cloudsearch 扩展 type/offset/limit/total + 歌单解析
- bench/search_sim.c 离线回归(历史/独立集/翻页 offset/队列上下文);host searchtap 误触自检

验证:mipsel -Wall -Wextra 0 warning;core host/mipsel PASS;search_sim PASS;
宿主离屏 search(单曲)/searchpl(歌单)/searchhist(空态历史)/searchtap(误触) 均正常;0 真实 NCM 请求。
This commit is contained in:
MeowOS committed 2026-09-01 19:21:16 +08:00
1 parent d4928224a5
commit 1e97dbf54a
15 files changed
+1152 -121

No files matched your search

+18 -1
View File
@@ -71,7 +71,7 @@ static int g_lyr_meta_y; /* 顶部元信息 y */
static int cur_song(void)
{
int c = player_manager_playing_song();
return (c >= 0 && c < g_st.track_ids_count) ? c : -1;
return (c >= 0 && c < appstate_queue_count()) ? c : -1; /* §23:按队列来源界 */
}
/* 当前播放曲元数据(§17):优先播放快照(窗口无关);快照未就绪时退窗口拷贝。 */
@@ -529,6 +529,7 @@ void player_on_swipe(int dir, int dist)
void player_play_song(int idx)
{
if (idx < 0 || idx >= g_st.track_ids_count) return;
g_st.queue_src = NCM_QUEUE_PLAYLIST; /* §23:歌单窗口队列 */
/* 黑胶封面用真实专辑图(song_detail 的 al.picUrl,经 ncm_cache 缓存/限幅);
* 滑窗未物化(占位行直点)时回落歌单封面,元数据由播放线程物化后快照接管(§17)。
* §18:g_st.cover_url 只作「歌单封面兜底」。 */
@@ -542,6 +543,22 @@ void player_play_song(int idx)
meow_view_page_push(ACT_PLAYER);
}
/* 搜索单曲起播(§23):走搜索队列(search_songs[]),不覆写歌单窗口;
* 上/下一首在搜索结果集内循环,回退原歌单时窗口上下文不丢。 */
void player_play_search_song(int i)
{
if (i < 0 || i >= g_st.search_song_count) return;
g_st.queue_src = NCM_QUEUE_SEARCH;
ncm_song_t s;
if (appstate_search_song(i, &s) != 0) return;
const char *cover = s.al_pic[0] ? s.al_pic : g_st.cover_url;
player_manager_play(i);
appstate_set_playing_song(i, NULL);
cover_request(cover);
g_ppage = 0;
meow_view_page_push(ACT_PLAYER);
}
void player_pause_toggle(int on)
{
if (player_manager_state() == NCM_PC_PAUSED) player_manager_pause(0);