feat(ncm §22): 播放页重做——封面页/歌词页双页(NCM_CACHE_DESIGN §6 定案)
- 去标题栏(不再用 ncm_topbar);返回=左缘手势/系统返回钮语义 - 双页结构:封面页/歌词页,屏幕正中左/右滑切换(与左缘≤24px返回、顶部通知分流), 页面指示点显示当前页;中部横滑=on_touch_move 锁存 page-drag + on_tap/on_swipe 判向 - 封面页:方形大图+圆角(无旋转动画)+进度条(点 seek)+MD3 矢量控制钮(prev/play/pause/next, 新增 app/ui/ncm_icons.h 32x32 单通道 alpha,参照 sb_icons.h 范式)+元信息+实际音质档 - 歌词页:LRC 滚动(当前行居中高亮、上下渐隐)+点行跳转(新增 lyric_line_time); 默认=封面模糊置底(封面铺底+主题 scrim),省电=封面背景+黑色半透明叠加层(设置 ncm.player_bg_mode) - 日夜间:主题配色只映射到半透明叠加层/scrim/accent(红),不动沉浸底(NCM_PLAYER_BG 恒定) - 分带刷新沿用:封面页=封面静态带+动态带(互不重叠 bbox,tick 只刷动态带);歌词页换行(~5s)才重画 - 性能:宿主 4 页 PPM 核验+手势自检 PASS;mipsel -Wall -Wextra 0 warning;qemu core 回归 PASS; 0 真实请求(封面/歌词用本地样本注入)。未部署真机(主会话统一) md5: ncm 730e0b6e / ncm_host 500ac85 / player.c 00934de / ncm_icons.h 20f0bba
This commit is contained in:
1 parent
ed2ae10320
commit
7bd6962ccb
13 files changed
+795
-343
No files matched your search
@@ -1988,3 +1988,107 @@ a80ee35f243ac28379cd1adeb61548ed build_ncm_host.sh # +stream_src.c
|
||||
首帧);实测 44.1k 向量 400kbps 首开声 3.82s(vs mp3 2.60s)即此因。
|
||||
- UI 菊花/缓冲提示未接 g_play.stalled(字段已备,UI 批再做)。
|
||||
- 断续网 underrun 聚合断言为时序容忍口径(§21.6),非判据放松——PCM 金标准不变。
|
||||
|
||||
---
|
||||
|
||||
## 22. 播放页重做:封面页/歌词页双页 + MD3 矢量图标 + 点行跳转 + 背景模式(2026-09-01,按 NCM_CACHE_DESIGN §6 定案)
|
||||
|
||||
> 范围:仅 `patch_v2/ncm_app/`。未动 `sdk/`(sb_icons.h 只作图标范式参照,未改)、`meow_launcherd/`、
|
||||
> `core/`(缓存/解码/网络底座零改动)。风控纪律:本批真实 NCM 请求 **0 次**(封面/歌词/手势全走
|
||||
> 宿主 mocK 与本地样本注入)。部署/真机验收留主会话统一。上一批(§21 边下边播)已 commit `9e25db7`,
|
||||
> 本批在其上做。
|
||||
|
||||
### 22.1 设计定案(NCM_CACHE_DESIGN §6)与实现映射
|
||||
|
||||
| 定案 | 实现 |
|
||||
|---|---|
|
||||
| 去掉现有标题栏(播放页不再用 ncm_topbar) | 删除 `player.c` 的 `g_tb`/topbar 创建与 `MEOW_TOPBAR_BACK` 命中;返回 = 左缘手势(`SWIPE_LEFT`→`app_on_swipe`→`page_pop`)/ 系统返回钮语义,`app.c` 不改 |
|
||||
| 双页结构:封面页/歌词页,屏幕正中左/右滑切换 | 新增内部页 `g_ppage`(0=封面、1=歌词);`player_set_page/player_page/player_page_go`;页面指示点(2 点,当前页红色) |
|
||||
| 手势分流(左缘≤24px=返回、顶部=通知、中部=页切换) | 不抢 SDK 左缘(`PLR_EDGE_W=24` 与 SDK `EDGE_W` 一致)与顶部热区(`y>=statusbar_hotzone()`);中部横滑用 `on_touch_down/move` 锁存 `page-drag` + `on_tap`(中部左滑落 TAP)判向 → 切页;中部右滑由 SDK `on_swipe(RIGHT)` → 切页(左滑/右滑都覆盖) |
|
||||
| 封面页:方形大图+圆角,无旋转动画;进度条(可点 seek)+控制钮+元信息+实际音质档 | `meow_ui_img_cover` 方形 + `round_corners_bg` 四角裁圆角;进度条点击 seek;控制钮 = MD3 图标;元信息(歌名/歌手)+ 实际生效档/降级标注 |
|
||||
| 按钮全部用 MD3 矢量图标(32×32 alpha,参照 sb_icons.h 范式) | 新增 `app/ui/ncm_icons.h`(PREV/PLAY/PAUSE/NEXT 四枚 32×32 单通道 alpha,几何近似+8× 超采样抗锯齿,参照 sb_icons.h 存储范式);`draw_md3_icon` 最近邻缩放 + 逐像素 `fill_rect_alpha` |
|
||||
| 歌词页:LRC 滚动(当前行居中高亮、上下渐隐)+ 点行跳转 | 沿用 `lyric.c`;新增 `lyric_line_time(i)`(点行 seek 用);当前行 `size=24` 红高亮、上下行 `size=20` 按距中心 `mix_c` 渐隐;点行 → `player_seek(lyric_line_time(i))` |
|
||||
| 歌词页默认=封面模糊置底;省电=封面背景+黑色半透明叠加层(设置 `ncm.player_bg_mode`) | 默认:封面 `meow_ui_img_scaled` 铺满 + 主题 `th->scrim` α150;省电:铺满 + `0x000000` α195;设置页新增行「歌词页背景」sheet 二选一,持久化 `ncm.player_bg_mode` |
|
||||
| 日夜间:主题配色只映射到半透明叠加层,不动沉浸底 | 新增 `NCM_PLAYER_BG` 固定沉浸底;`ncm_on_theme` 在 ACT_PLAYER 时 page_bg 恒 `NCM_PLAYER_BG`(不改底),其余页面仍跟随系统明暗;歌词 scrim/accent 随 `g_dark`/主题变化 |
|
||||
| 缓冲「缓冲中…N%」/错误条(256 那套)沿用 | 封面页:缓冲文案替时间行、错误文案(VIP/无音源/登录过期/网络)+「点播放键重试」;`ncm_snack` 错误沿沿用 |
|
||||
| 退出=后台播放(M4 background_audio,退出语义不动) | `app.json` 已声明 `background_audio:1`;播放线程/退出路径未动 |
|
||||
|
||||
### 22.2 性能(分带刷新纪律沿用)
|
||||
|
||||
- **封面页**拆「封面静态带 `g_cover_r`(z8)」+「动态带 `g_dyn_r`(z9)」两个绘制物,bbox 互不重叠:
|
||||
tick 只标脏动态带(进度/控制/元信息/指示点);封面带仅 歌曲/封面 变化(`player_static_invalidate`)
|
||||
才重画 → 不整页重绘。
|
||||
- **歌词页**为整屏带状物:仅在 进入/切歌/封面变化/换背景模式/换行(~5s 一次,歌词按行进非逐帧)
|
||||
时整屏重画;pos tick 不重画歌词页(`g_last_line` 沿驱动,行间静止)。
|
||||
- 模糊底图 = 封面按屏最近邻铺底 + scrim;区域重画时 SDK 绘制 clip 收敛(`meow_ui_draw.c`,
|
||||
`g_clip_stack`),只算相交区,不整屏 overdraw(§5.8 记忆点)。
|
||||
- 控制钮由「逐帧行扫三角」改为 **MD3 图标位图 blit**(扫描 + 每像素 blend565),code 更简单、观感对齐 Material。
|
||||
|
||||
### 22.3 验证记录(0 真实 NCM 请求)
|
||||
|
||||
| 层 | 手段 | 结果 |
|
||||
|---|---|---|
|
||||
| mipsel 交叉 | `bash build_ncm.sh`(自有代码 `-Wall -Wextra`) | **0 warning**;`text 963042 / data 1608 / bss 1113988`(bss 增量仅来自 icons/ncm 段,均常量) |
|
||||
| 宿主离屏 | `build_ncm_host.sh` + `MEOW_UI_DUMP`(mock,0 网络) | 自有代码 0 warning(仅 SDK `meow_ui_vol.c` 既有 `system()` 告警) |
|
||||
| 四页 PPM 核验 | `NCM_PAGE=plcover/pllyric × NCM_THEME=light/dark` + `NCM_COVER=本地样本注入` | **4 页全 rc=0**:封面页=方形圆角封面+歌名/歌手+时间+红进度条(52%)+prev/暂停/next MD3 图标+指示点;歌词页=封面模糊置底+顶部「歌名·歌手」+当前行红高亮居中+上下渐隐+指示点;日/暗两套底恒 `NCM_PLAYER_BG`(不动沉浸底)、accent/scrim 随主题 |
|
||||
| 缓冲/错误态 | `NCM_PAGE=playerbuf/playererr` | 全 rc=0:缓冲=「缓冲中… N%」文案+空进度条+暂停钮;错误=错误文案+「重试/切下一首」+播放钮(STOPPED→play 重试) |
|
||||
| 省电背景 | `NCM_PAGE=pllyric NCM_BGMODE=power_save` | 全 rc=0:封面背景更暗(`0x000000` α195),与 default 明显区分 |
|
||||
| 手势切换自检 | `NCM_PAGE=gestest`(宿主直调 touch_down/move/on_tap/on_swipe) | **PASS**:p0=0 → 中部左滑=1(歌词) → 中部右滑=0(封面);进度条上按下拖拽不锁存(不被误判翻页) |
|
||||
| qemu core 回归 | `timeout 120 qemu-mipsel ./out/test_ncm_core_mipsel` | **RESULT: PASS**(core 全量,本批未动 core) |
|
||||
| 宿主 core | `test/test_ncm_core_host` | **PASS** |
|
||||
| 设置页 | `NCM_PAGE=settings` | rc=0,6 行(新增「歌词页背景」行存在) |
|
||||
|
||||
### 22.4 md5(本批产物 + 改动文件)
|
||||
|
||||
```
|
||||
730e0b6eaa0b3f626f828bbaa51dc5a8 ncm # mipsel 静态 App(新)
|
||||
500ac859618a58bc2a641553a383a10f ncm_host # 宿主离屏调试二进制(新)
|
||||
00934dec4452f2f31e6f473c64bd311f app/ui/player.c
|
||||
20f0bbac74099d07638d4f92a340eb82 app/ui/ncm_icons.h # 新:MD3 prev/play/pause/next 32x32 alpha
|
||||
aedd5ff24e227eeda94341e63eac4064 app/ui/settings.c
|
||||
31ae666b0f7497bb3c3391da9ce4636a app/ui/ncm_colors.c
|
||||
b1c8f029886a60288e96bcf54476d7bf app/logic/lyric.c
|
||||
63127b670604ff67dd176224088b16c4 app/logic/cover.c
|
||||
aa5a5f22e10662c2247ece166c13ea6e app/logic/appstate.c
|
||||
e2a7062b0033234649fe03767a4c009d app/app.c
|
||||
fa00ea4f0093cd7e0a2600887106de07 app/ncm_app_internal.h
|
||||
2c484e5e920c0b05c6da107d15fd8a6f app/test/test_ncm_app.c
|
||||
```
|
||||
|
||||
### 22.5 出入清单(只改 `patch_v2/ncm_app/`)
|
||||
|
||||
```
|
||||
修改:
|
||||
app/ui/player.c # 播放页重做:去 topbar + 封面/歌词双页(中滑切换) + MD3 图标控制钮 +
|
||||
# 方盖圆角 + 点行 seek + 封面模糊/省电背景 + 分带刷新 + 手势分流
|
||||
app/ui/ncm_icons.h # 新增:MD3 prev/play/pause/next 32x32 单通道 alpha 位图(参照 sb_icons.h)
|
||||
app/ui/settings.c # 新增「歌词页背景」行(default/省电 sheet 二选一)
|
||||
app/ui/ncm_colors.c # ncm_on_theme:ACT_PLAYER 沉浸底恒 NCM_PLAYER_BG(不动沉浸底)
|
||||
app/logic/lyric.c # 新增 lyric_line_time(i):点行跳转
|
||||
app/logic/cover.c # 宿主测试桩 cover_host_inject(#ifdef MEOW_UI_HOST_TEST,产品不编)
|
||||
app/logic/appstate.c # 设置持久化 ncm.player_bg_mode(load/save + 越界回落 default)
|
||||
app/app.c # on_touch_down/move 播发页路由(中部横滑页切换跟踪)
|
||||
app/ncm_app_internal.h # NCM_PLAYER_BG/NCM_BG_* + player_bg_mode 字段 + player_set_page/
|
||||
# player_page/player_touch_* + lyric_line_time 声明
|
||||
app/test/test_ncm_app.c # 宿主:plcover/pllyric/gestest 模式 + NCM_BGMODE/NCM_COVER 注入
|
||||
ncm / ncm_host # 重编产物
|
||||
(未动 sdk/、meow_launcherd/、vendor/、core/;REPORT.md 本批记录 §22)
|
||||
```
|
||||
|
||||
### 22.6 诚实出入 / 已知限制
|
||||
|
||||
- **真机未部署未验**(留主会话统一)。真机验收点:①双页中滑流畅(跟手感/指示点)②点行 seek
|
||||
命中时间 ③封面模糊置底观感(默认)vs 省电黑色叠加(对比明显)④设置页「歌词页背景」持久化、
|
||||
重启生效 ⑤返回=左缘右滑仍正确(不误触页切换)⑥播放中退出=后台播放(M4,未动)。
|
||||
- **歌词页「当前行居中」为行进式**(按 LRC 行切换,非逐帧平滑滚动):这是 MIPS 软帧下
|
||||
「流畅性廉价可靠」取舍(§11);当前行高亮 + 上下行渐隐已提供视觉焦点。
|
||||
- **封面模糊 = 封面按屏最近邻铺底 + scrim(廉价近似)**:无 GPU 模糊/降采样原语,非真高斯模糊;
|
||||
非均匀铺底(480×720)会轻微拉伸封面(居中裁方可解但需另建 thumbnail 缓冲,本批不做)。
|
||||
- **歌词页顶部元信息/整屏重在换行时重画**:换行频率 ≈ 每行(数秒)一次,非逐帧;pos tick 不刷
|
||||
歌词页(只在其换行时刷),故 MIPS 上歌词页代价可忽略。
|
||||
- **页面对比色固定浅色系**(播放页为沉浸深色介质,文本若随主题 onSurface 在浅色主题下为近黑会
|
||||
隐形):这是「不动沉浸底」定案的必然——播放页文本/控件用固定浅色,仅 accent(红)/scrim 随日夜间。
|
||||
- **`player_set_screen` 保留为兼容占位(恒竖屏)**:重做后播放页为竖屏双页(旧「横屏布局」随顶栏
|
||||
⟳ 钮一并退役);`player_screen()` 恒 0,宿主 `grid`/`lands` 旧模式不再有横屏布局。
|
||||
- **歌词读锁残余(既有)**:`lyric_line_text/tl` 解锁后返回静态指针可能被下次 `lyric_parse` 覆盖
|
||||
(§14.7 已知);本批未改,点行跳转读 `lyric_line_time` 同理(写入仅在切歌瞬间,窗口极小)。
|
||||
Reference in new issue
Block a user