feat(ncm): 播放模式三态(随机/列表循环/单曲循环,播放页三键左)+当前实时播放列表(三键右,歌单滑窗/meow_listview虚拟化分页至5194首,当前曲高亮,点播切歌) — 模式持久化,宿主modetest/queuetest全过
This commit is contained in:
1 parent
29e13b2b5e
commit
7ca3e5bd84
8 files changed
+707
-28
No files matched your search
@@ -103,6 +103,8 @@ static int page_id(const char *name)
|
||||
if (strcmp(name, "searchhist") == 0) return ACT_SEARCH; /* §23 空态=历史列表 */
|
||||
if (strcmp(name, "searchpl") == 0) return ACT_SEARCH; /* §23 歌单页签 */
|
||||
if (strcmp(name, "searchtap") == 0) return ACT_SEARCH; /* §23 误触抑制自检 */
|
||||
if (strcmp(name, "modetest") == 0) return ACT_PLAYER; /* §NEW 播放模式三态逻辑自检 */
|
||||
if (strcmp(name, "queuetest") == 0) return ACT_QUEUE; /* §NEW 播放队列页/点播语义自检 */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -233,6 +235,16 @@ int main(int argc, char **argv)
|
||||
appstate_search_history_add("Jay \u5553\u8868");
|
||||
appstate_search_history_add("lofi beat");
|
||||
appstate_search_history_add("Jay \u5553\u8868"); /* 去重 → 仍 3 条 */
|
||||
} else if (strcmp(name, "modetest") == 0 || strcmp(name, "queuetest") == 0) {
|
||||
/* §NEW 播放模式 / 播放队列自检:歌单滑窗队列(6 首)+ 播放态 */
|
||||
mock_playlists(); mock_songs();
|
||||
pthread_mutex_lock(&g_play.mu);
|
||||
g_play.state = NCM_PC_PLAYING;
|
||||
g_play.cur_song = 0;
|
||||
g_play.play_mode = NCM_MODE_LISTLOOP;
|
||||
g_play.play_song = g_st.songs[0];
|
||||
g_play.play_song_valid = 1;
|
||||
pthread_mutex_unlock(&g_play.mu);
|
||||
} else if (strcmp(name, "plsplay") == 0 || strcmp(name, "homeplay") == 0 ||
|
||||
strcmp(name, "barhit") == 0) {
|
||||
/* mini 播放栏目检/命中自检:非播放页(歌单/首页)+ 播放态 → 底部显示 mini 栏 */
|
||||
@@ -254,7 +266,8 @@ int main(int argc, char **argv)
|
||||
else if (strcmp(name, "home") == 0) v = home_view_create();
|
||||
else if (strcmp(name, "playlist") == 0 || strcmp(name, "plsplay") == 0 ||
|
||||
strcmp(name, "barhit") == 0) v = playlist_view_create();
|
||||
else if (page_id(name) == ACT_PLAYER) v = player_view_create(); /* player/lands/playerbuf/playererr */
|
||||
else if (page_id(name) == ACT_PLAYER) v = player_view_create(); /* player/lands/playerbuf/playererr/modetest */
|
||||
else if (page_id(name) == ACT_QUEUE) v = queue_view_create(); /* §NEW 播放队列页 */
|
||||
else if (strcmp(name, "settings") == 0) v = settings_view_create();
|
||||
else if (strcmp(name, "search") == 0 || strcmp(name, "searchhist") == 0 ||
|
||||
strcmp(name, "searchpl") == 0 || strcmp(name, "searchtap") == 0) v = search_view_create();
|
||||
@@ -358,6 +371,78 @@ int main(int argc, char **argv)
|
||||
if (!ok_tg) return 1;
|
||||
}
|
||||
|
||||
if (strcmp(name, "modetest") == 0) {
|
||||
/* §NEW 播放模式三态逻辑自检:列表循环(顺序回绕)/单曲循环(自然播完重播)/随机(下一首随机+上一首回溯)。 */
|
||||
int ok = 1;
|
||||
pthread_mutex_lock(&g_play.mu);
|
||||
g_play.cur_song = 0; g_play.state = NCM_PC_PLAYING; g_play.play_mode = NCM_MODE_LISTLOOP;
|
||||
pthread_mutex_unlock(&g_play.mu);
|
||||
int cnt = appstate_queue_count();
|
||||
player_manager_next(1); int c1 = player_manager_playing_song(); /* 0→1 */
|
||||
player_manager_next(-1); int c2 = player_manager_playing_song(); /* 1→0 */
|
||||
player_manager_next(-1); int c3 = player_manager_playing_song(); /* 0→5 回绕 */
|
||||
player_manager_next(1); int c4 = player_manager_playing_song(); /* 5→0 回绕 */
|
||||
ok &= (cnt == 6 && c1 == 1 && c2 == 0 && c3 == 5 && c4 == 0);
|
||||
/* 单曲循环:自然播完 → 重播本曲(cur 不变,state=BUFFER) */
|
||||
player_manager_set_play_mode(NCM_MODE_SINGLE);
|
||||
player_manager_next_intent();
|
||||
int cs = player_manager_playing_song();
|
||||
int st = player_manager_state();
|
||||
ok &= (cs == 0 && st == NCM_PC_BUFFER);
|
||||
/* 单曲循环手上一首:顺序回绕(0→5) */
|
||||
player_manager_next(-1);
|
||||
int c5 = player_manager_playing_song();
|
||||
ok &= (c5 == 5);
|
||||
/* 随机:next 变(≠5),prev 历史回溯回 5 */
|
||||
player_manager_set_play_mode(NCM_MODE_SHUFFLE);
|
||||
player_manager_next(1); int c6 = player_manager_playing_song();
|
||||
player_manager_next(-1); int c7 = player_manager_playing_song();
|
||||
ok &= (c6 >= 0 && c6 < 6 && c6 != 5 && c7 == 5);
|
||||
/* 模式循环:LISTLOOP→SINGLE→SHUFFLE→LISTLOOP */
|
||||
player_manager_set_play_mode(NCM_MODE_LISTLOOP);
|
||||
int m1 = (NCM_MODE_LISTLOOP + 1) % NCM_MODE_COUNT;
|
||||
int m2 = (m1 + 1) % NCM_MODE_COUNT;
|
||||
int m3 = (m2 + 1) % NCM_MODE_COUNT;
|
||||
ok &= (m1 == NCM_MODE_SINGLE && m2 == NCM_MODE_SHUFFLE && m3 == NCM_MODE_LISTLOOP);
|
||||
printf("modetest: listloop=%d single=%d shuffle=%d cycle=%d -> %s\n",
|
||||
(c1 == 1 && c2 == 0 && c3 == 5 && c4 == 0),
|
||||
(cs == 0 && st == NCM_PC_BUFFER && c5 == 5),
|
||||
(c6 != 5 && c7 == 5),
|
||||
(m1 == NCM_MODE_SINGLE && m2 == NCM_MODE_SHUFFLE && m3 == NCM_MODE_LISTLOOP),
|
||||
ok ? "PASS" : "FAIL");
|
||||
if (!ok) return 1;
|
||||
}
|
||||
if (strcmp(name, "queuetest") == 0) {
|
||||
/* §NEW 播放队列:点播切歌保持当前 queue_src(歌单/搜索两源)+ 队列长度一致。 */
|
||||
pthread_mutex_lock(&g_play.mu);
|
||||
g_play.cur_song = 0; g_play.state = NCM_PC_PLAYING; g_play.play_mode = NCM_MODE_LISTLOOP;
|
||||
pthread_mutex_unlock(&g_play.mu);
|
||||
int cnt0 = appstate_queue_count();
|
||||
player_play_queue_song(2); /* PLAYLIST 队列点播第 2 首 */
|
||||
int cur = player_manager_playing_song();
|
||||
int qsrc = appstate_get_queue();
|
||||
int ok1 = (cnt0 == 6 && cur == 2 && qsrc == NCM_QUEUE_PLAYLIST);
|
||||
/* 切到 SEARCH 队列:点播第 1 首,保持 SEARCH */
|
||||
static const char *sn[] = { "S1", "S2", "S3" };
|
||||
appstate_set_queue(NCM_QUEUE_SEARCH);
|
||||
g_st.search_song_count = 3;
|
||||
for (int i = 0; i < 3; i++) {
|
||||
snprintf(g_st.search_songs[i].id, sizeof g_st.search_songs[i].id, "%d", 2000 + i);
|
||||
snprintf(g_st.search_songs[i].name, sizeof g_st.search_songs[i].name, "%s", sn[i]);
|
||||
snprintf(g_st.search_songs[i].art_name, sizeof g_st.search_songs[i].art_name, "A%d", i);
|
||||
snprintf(g_st.search_songs[i].album_name, sizeof g_st.search_songs[i].album_name, "Al%d", i);
|
||||
g_st.search_songs[i].duration_ms = 100000;
|
||||
}
|
||||
int cnt1 = appstate_queue_count();
|
||||
player_play_queue_song(1);
|
||||
int cur2 = player_manager_playing_song();
|
||||
int qsrc2 = appstate_get_queue();
|
||||
int ok2 = (cnt1 == 3 && cur2 == 1 && qsrc2 == NCM_QUEUE_SEARCH);
|
||||
printf("queuetest: playlist=%s search=%s -> %s\n", ok1 ? "PASS" : "FAIL",
|
||||
ok2 ? "PASS" : "FAIL", (ok1 && ok2) ? "PASS" : "FAIL");
|
||||
if (!(ok1 && ok2)) return 1;
|
||||
}
|
||||
|
||||
meow_ui_shutdown();
|
||||
printf("dumped %s -> %s\n", name, dump);
|
||||
return 0;
|
||||
|
||||
Reference in new issue
Block a user