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
@@ -30,6 +30,17 @@
|
||||
#define ACT_PLAYER 3 /* 播放页(可横竖屏切,v1 允许切) */
|
||||
#define ACT_SETTINGS 4 /* 设置页 */
|
||||
#define ACT_SEARCH 5 /* 搜索页(顶栏搜索按钮进入) */
|
||||
#define ACT_QUEUE 6 /* 当前播放队列页(播放页「队列」钮进入,展示实时播放列表) */
|
||||
|
||||
/* ---- 播放模式三态(REPORT §NEW:随机 / 列表循环 / 单曲循环)----
|
||||
* 默认=列表循环(延续既有「顺序下一首」语义;列表循环下自动顺延会在队尾回绕)。
|
||||
* 三态按钮点击按 enum 序循环(SHUFFLE→LISTLOOP→SINGLE→SHUFFLE),图标/文案见 ncm_mode_name。 */
|
||||
enum {
|
||||
NCM_MODE_SHUFFLE = 0, /* 随机播放:自动播完/手动下一首 → 随机取队列另一首 */
|
||||
NCM_MODE_LISTLOOP = 1, /* 列表循环:自动播完/手动下一首 → 顺序下一首(队尾回绕队首) */
|
||||
NCM_MODE_SINGLE = 2, /* 单曲循环:当前曲播完 → 重播本曲;手动下一首仍顺序 */
|
||||
};
|
||||
#define NCM_MODE_COUNT 3
|
||||
|
||||
/* ---- 封面 CDN 尺寸参数(REPORT §NEW 任务2:网易云图片 CDN 对 URL 追加 ?param=WxH 返等比
|
||||
* 缩略 JPEG——省内存 +解 webp 三分型③+命中率高;已含 param= 的 URL 尊重原样)。
|
||||
@@ -137,7 +148,8 @@ enum {
|
||||
typedef struct ncm_play_run {
|
||||
pthread_mutex_t mu;
|
||||
int state; /* NCM_PC_* */
|
||||
int cur_song; /* 当前曲目在 g_st.songs[] 下标;-1=无 */
|
||||
int play_mode; /* NCM_MODE_*(播放模式三态;UI 读写,播放线程切歌依此) */
|
||||
int cur_song; /* 当前曲目在队列(queue_src)下标;-1=无 */
|
||||
int64_t pos_ms; /* 当前播放位置(播放进程推进,seek 写此) */
|
||||
int64_t dur_ms; /* 当前曲目标称时长 */
|
||||
int cmd; /* 暂存最新内部命令(play/pause/prev/next/seek)*/
|
||||
@@ -224,6 +236,7 @@ typedef struct ncm_app_state {
|
||||
int level; /* NCM_LEVEL_* */
|
||||
int cache_limit_gb;
|
||||
int player_bg_mode; /* 歌词页背景模式(§22):NCM_BG_DEFAULT / NCM_BG_POWER_SAVE */
|
||||
int play_mode; /* 播放模式(§NEW 三态):NCM_MODE_*;持久化 ncm.play_mode */
|
||||
|
||||
/* 搜索(REPORT §23:独立结果数组,不覆写歌单窗口;单曲/歌单两类页签各自独立结果集/分页/滚动) */
|
||||
char search_query[256];
|
||||
@@ -328,6 +341,7 @@ void player_on_tap(int x, int y);
|
||||
void player_tick(uint64_t now); /* 播放进度/歌词滚动 */
|
||||
void player_play_song(int idx); /* 从歌单窗口第 idx 首开始播放(queue=PLAYLIST) */
|
||||
void player_play_search_song(int i); /* 从搜索单曲第 i 首开始播放(queue=SEARCH,§23) */
|
||||
void player_play_queue_song(int idx);/* 从「当前实时播放队列」第 idx 首播放(保持当前 queue_src,§NEW) */
|
||||
void player_pause_toggle(int on);
|
||||
void player_next(int dir); /* dir=+1 下一首 / -1 上一首 */
|
||||
void player_seek(int64_t ms);
|
||||
@@ -355,6 +369,16 @@ void mini_bar_shutdown(void); /* 注销(app 退出前) */
|
||||
void mini_bar_tick(uint64_t now);/* 每帧:可见性/歌曲/暂停态/进度变化 → 失效栏带并重绘 */
|
||||
int mini_bar_hit(int x, int y); /* app_on_tap 顶层先行拦截:1=消费(toggle/进播放页) */
|
||||
|
||||
/* queue(当前播放队列页,§NEW:展示实时播放列表/分页/当前曲高亮/点播切歌) */
|
||||
meow_view *queue_view_create(void);
|
||||
int queue_is_active(void);
|
||||
int queue_on_tap(int x, int y);
|
||||
void queue_swipe(int dir, int dist);
|
||||
void queue_touch_down(int x, int y);
|
||||
void queue_touch_move(int x, int y);
|
||||
void queue_open(void); /* 进当前播放队列页 */
|
||||
void queue_tick(uint64_t now); /* UI tick:检查队列 worker 完成并刷新 */
|
||||
|
||||
/* search */
|
||||
meow_view *search_view_create(void);
|
||||
int search_is_active(void);
|
||||
@@ -433,6 +457,7 @@ void appstate_set_queue(int src); /* NCM_QUEUE_PLAYLIST / NCM_QUEU
|
||||
int appstate_get_queue(void);
|
||||
int appstate_queue_count(void); /* 当前播放队列长度(按 queue_src) */
|
||||
int appstate_queue_song(int idx, ncm_song_t *out); /* 队列第 idx 首;0=ok(按 queue_src) */
|
||||
void appstate_apply_play_mode(int m); /* 设 g_st.play_mode + 落盘(持久化「记住模式」,§NEW) */
|
||||
|
||||
/* ---- 搜索结果独立数组(§23;g_search_mu 保护,UI/worker 经此访问)---- */
|
||||
int appstate_search_count(int tab); /* tab: 0=单曲 1=歌单 */
|
||||
@@ -523,10 +548,14 @@ int player_manager_error(void);
|
||||
int player_manager_current_song(ncm_song_t *out); /* 播放曲快照锁内拷贝;0=有效 -1=无(REPORT §17) */
|
||||
void player_manager_dl(int64_t *done, int64_t *total); /* 本曲下载进度(字节;total=0 未知,§18) */
|
||||
int player_manager_eff_level(void); /* 实际生效音质档(§20;-1=未定) */
|
||||
int player_manager_play_mode(void); /* 当前播放模式(§NEW 三态:NCM_MODE_*) */
|
||||
void player_manager_set_play_mode(int m); /* 设播放模式(运行时态;持久化由 appstate_apply_play_mode 落盘) */
|
||||
void player_manager_next_intent(void); /* 曲目自然播完 → 按播放模式决定下一首/重播(单曲循环重播本曲) */
|
||||
|
||||
/* 音质档位显示名/规格(ui/chrome.c,§20 八档 UI 权威口径;settings/player 共用) */
|
||||
const char *ncm_level_name(int lv); /* 短名:标准/极高 HQ/无损 SQ/Hi-Res/高清臻音/臻音全景声/超清母带/沉浸环绕声 */
|
||||
const char *ncm_level_spec(int lv); /* 规格:128kbps / ≤320kbps / 48kHz·16bit / ... */
|
||||
const char *ncm_mode_name(int m); /* 播放模式短名(§NEW 三态):随机 / 列表 / 单曲 */
|
||||
|
||||
/* songmeta(app/logic/songmeta.c):歌曲元数据本地缓存(<cache_dir>/meta/<id>.bin),
|
||||
* 拉过的 song_detail 结果序列化落盘,再次入窗免重复请求(REPORT §17)。 */
|
||||
|
||||
Reference in new issue
Block a user