AskaEth
|
d0a5901ffb
|
fix(fw): M6.38 收编SDK对话框MD3细化+批②底部上滑回桌面+批6 ncm顶栏回播放页+批④面板后台列表+launcher UI微调+封面空artwork保留 — 推卡+面板热更
- meow_ui.a 重编 4c006844(0warning): meow_ui_dialog MEOW_SHAPE_EXTRA_LARGE 28
- launcher c9218411 / hello 63824093 / files c9309774 / reader 0d462111(未变,不拉对话框对象) / ncm 2b33b1dc
- 固件 r3proii_m6_38.upt 7b6ce4a5(0.8.38, rootfs 38715392<=45088768, unpack 0 diff)
- meowpanel 后端 fcb2f658 + web(index/css/js/mp_pages) 热更 MeowOS/opt/MeowPanel, /api/ams/bg 新增, 运行中新二进制
- netmgrd 9c345b2e/audiod 9f47c8fd/meow_audio 6864ec38 未变; amsd 57e19cde 保持
|
2026-09-04 13:23:56 +08:00 |
|
AskaEth
|
a2aec783a7
|
feat(ui): M6.38批 — P1 MD3细化(SDK对话框28)+批②底部上滑回桌面+批6 ncm顶栏回播放页+批④面板后台列表+launcher UI微调(歌词页黑半透明底/播放页布局下移)+封面空artwork保留修复
- P1: meow_ui_dialog.c 对话框底框 radius_card→MEOW_SHAPE_EXTRA_LARGE(28) 三处(:103填充/:104描边/:361 BottomSheet); meow_ui_widgets.h 新增 MEOW_SHAPE_EXTRA_LARGE 28 宏; TextField/FAB/Slider/Progress 按设计文档保留
- 批②: np_gesture.h 新增 NP_GEST_HOME+np_home_gesture(底部热区上滑,与左缘返回对称互斥); now_playing.c 新增 np_draw_home_bar(屏底左缘pill指示条)+手势衔接; test_now_playing_widgets G5b
- 批6: ncm home.c 顶栏加回播放页按钮(MEOW_ICON_QUEUE_MUSIC)→push(ACT_PLAYER), 无音频也生效
- 批④: meowpanel /api/ams/bg 只读端点+前端后台列表页+杀/清复用kill通道
- UI微调: now_playing.c 播放页布局宏下移(NP_COVER_Y 84/NP_BTN_Y 612消底部留白)+歌词页背景统一黑色半透明叠层(弃封面取色底,删 np_draw_lyric_coverbg)
- 封面保留: now_playing.c/notif_center.c 空artwork保留上一张已解码封面(防暂停/开歌单致META报空artwork后封面闪没); test_np_cover C2断言更新+mirror同步
0warning;宿主测试 test_np_cover ALL PASS;launcher/ncm/panel 宿主测试无回归。二进制留批量批次未入库
|
2026-09-04 13:09:03 +08:00 |
|
AskaEth
|
b3ce719742
|
fix(fw): M6.37 收编SDK默认列表MD3容器化(meow_listview_create默认container=1)重编meow_ui.a重链四App — 推卡
- meow_ui.a 重编 14f218d7(0warning): meow_listview_create默认container=1,行=surfaceContainer圆角卡+空隙+去分隔线+卡内tonal选中
- launcher e7fd28dd / hello c10a3ea5 / files 90a6e817 / reader 0d462111 / ncm 6f3967f8 (重链新meow_ui.a)
- 固件 r3proii_m6_37.upt a8dd8f54(0.8.37, rootfs 38715392<=45088768, unpack 0 diff)
- netmgrd 9c345b2e/audiod 9f47c8fd/meow_audio 6864ec38 未变; amsd 57e19cde 保持
|
2026-09-04 12:29:23 +08:00 |
|
AskaEth
|
8e68254ce4
|
style(sdk): SDK默认列表MD3容器化 — meow_listview_create默认container=1(行=surfaceContainer圆角卡+空隙+去分隔线+卡内tonal选中),hello/files/ncm/reader等用默认renderer的App开箱即MD3(用户2026-09-04反馈默认仍扁平);需平坦宿主可set_container(0)回退(宿主测试test_meow_ui_widgets/listvirt补set_container(0)锁扁平基线)。0warning,宿主测试全过(widgets ALL PASS/md3 PASS/swipe 35-0/listvirt 44-0)。meow_ui.a变需重编+重链四App
|
2026-09-04 12:24:16 +08:00 |
|
AskaEth
|
4d0a8450e9
|
fix(fw): M6.36 收编全面MD3对齐+批①叠加/列表外距/后台图标/后台圆角卡+重编meow_ui.a重链四App — 推卡
- meow_ui.a 重编 d02c0f57(0warning): MD3对齐(meow_ui_widget/widgets:容器/胶囊/shape)+批①叠加共享判定+meow_img_pixels+meow_ui_audio
- launcher 0c4f3c10: MD3全面对齐(subpage/settings/bg/MENU列表圆角卡8px外距/按钮胶囊/状态层/shape)+批①叠加/穿透根治(7处转场)+顶栏后台按钮图标+后台管理页圆角卡
- 四App热更: ncm df149a9c / hello f3ac1fc0 / files f37d66c7 / reader b6cbc050(reader四格式冒烟全过)
- 固件 r3proii_m6_36.upt 91ccf411(0.8.36, rootfs 38715392<=45088768, unpack 0 diff)
- netmgrd 9c345b2e/audiod 9f47c8fd/meow_audio 6864ec38 未变; amsd 57e19cde 已M6.35收编
|
2026-09-04 12:00:59 +08:00 |
|
AskaEth
|
b712088daa
|
style(md3): 全面MD3对齐P0-P3 — P0扁平行列表容器化(meow_listview_set_container容器模式:surfaceContainer圆角卡12dp+tonal状态层+去分隔线;sub_page/settings_page/bg_page圆角容器) P1按钮胶囊化+shape令牌(extrasmall/small/medium/large/full) P2状态层补齐 P3子控件(Switch off-track/NavBar pill64×32/Checkbox24/对话框28);宿主test_meow_md3等全过,0warning;meow_ui.a变M6.36需重编+四App重链
|
2026-09-04 11:49:59 +08:00 |
|
AskaEth
|
3fea237306
|
docs: 同步至 M6.35/0.8.35(App后台常驻框架+批③后台管理页+面板拆分合并页+MD3对齐在跑+third_party/md-material-web参考+redline纪律;不提网易云明面)
|
2026-09-04 11:40:00 +08:00 |
|
AskaEth
|
2db87b2c5c
|
style(bt): 后台管理页行改MD3圆角卡+8px外距(bgm_row_card_y/h,卡高48行距56上下对称,删除分隔线,按压限卡内,按钮相对卡定位恒等)+test_bg_row_card PASS,0warning
|
2026-09-04 11:27:07 +08:00 |
|
AskaEth
|
7a276f609e
|
fix(bt): 批①叠加/穿透根治 — /tmp/meow_notif_active从布尔标志改为内容=前台归属app_id(App用MEOW_LOG_APP比较:前台照常上屏收输入/后台常驻自抑+排空输入/空=全抑制),SDK present+input共用共享判定meow_ui_overlay_suppressed_active,launcher 7处转场改写;宿主test_overlay_suppress(T2c)/notif_gesture/overlay_gate/bg全过,0warning;meow_ui.a变M6.36需重编+重链四App
|
2026-09-04 04:05:41 +08:00 |
|
AskaEth
|
6bab304660
|
style(launcher): 主界面列表布局(home_layout=list)圆角卡加8px外距(MENU_LIST_ROW_GAP+menu_row_card_y/h卡上下对称内缩行距不变) — 圆角列表项紧贴修复;其余扁平行(Material标准)未动;test_menu_row_gap PASS,0warning,不动meow_ui.a
|
2026-09-04 03:53:09 +08:00 |
|
AskaEth
|
491db5069c
|
style(launcher): 主界面顶栏'后台'按钮图标美化 — 去方形primary底改surface_container柔和圆角+矢量双卡层叠图标(后台应用堆叠语义)+小字'后台';命中矩形/入口不变,0warning
|
2026-09-04 03:51:30 +08:00 |
|
AskaEth
|
b23c6d53c4
|
fix(fw): M6.35 收编批③后台管理页(按钮化)+amsd FG/BG+i18n — 推卡
|
2026-09-04 02:57:26 +08:00 |
|
AskaEth
|
5c174224f7
|
feat(bt): 批③后台管理页UI按钮化 — 每行右'杀'按钮(bgm_btn_rect精确命中,行区不误杀)+顶栏'一键清除后台'按钮(sub_page_t增row_draw/row_tap/top_action/top_action_cb全NULL守卫,wifi/bt/lock行为不变);test_bgpage 32项ALL PASS,0warning
|
2026-09-04 02:48:08 +08:00 |
|
AskaEth
|
c69fb92284
|
refactor(i18n): settings/lock 剩余中文补抽为 meow_str_zh 键(内联键,默认=原中文显示不变) — settings_page([59]设置行/值格式/标题)+lock_settings(行/模态/动作)+lock_screen_ui(清空/退格/PIN锁定提示);顺带修2条既有-Wformat-zero-length;宿主settings/lock全过,0warning
|
2026-09-04 02:21:45 +08:00 |
|
AskaEth
|
211c5a556a
|
feat(bt): 批③后台管理页 — bg_page(顶栏'后台'入口+sub_page_t列表[名字/CPU/内存/状态/tap=kill]+一键清除动作行+空态,2s实时)+meow_bgmgr(collect/can_kill !framework门控+kill_all不杀框架)+meow_bg_terminate复用回收序列;amsd FG/BG收编(重编57e19cde含handle_bg/fg);test_bgmgr 20项ALL PASS,0warning
|
2026-09-04 02:19:06 +08:00 |
|
AskaEth
|
2f22e26de7
|
fix(fw): M6.34 收编批①后台常驻+宽限期+audiod A3/DSD+meow_img_pixels+重编meow_ui.a重链四App — 推卡
|
2026-09-04 02:00:39 +08:00 |
|
AskaEth
|
3c5612f7c9
|
refactor(sdk/lyric)+misc: ①G5断言改成EXIT(播放页任意右滑回桌面,宿主全过) ②meow_img_pixels正式访问器上收(替代局部补全结构体,const化w/h,清3处警告) ③RECOVERY_PROMPT §五铁律补重链四App ④MEOW_APP_SDK.md §4.1取色/§5.9音频/§9后台字段/§16歌词组件;0warning;meow_ui.a变M6.34需重编+四App重链
|
2026-09-04 01:49:24 +08:00 |
|
AskaEth
|
45c633868f
|
feat(bt): 批①宽限期补充 — 全App入后台表(bg_since_ms)+未声明App宽限30min(MEOW_BG_GRACE_MS)超时回收+声明常驻/媒体活跃不清+槽满LRU回收最旧未声明;test_bgplay全过/0warning;devdocs APP_BACKGROUND_KEEPALIVE_P1 §9;M6.34需先重编meow_ui.a(meow_img_pixels)
|
2026-09-04 01:48:31 +08:00 |
|
AskaEth
|
effce6d0db
|
feat(audiod): A3+DSD — ①24/32bit高清byte-exact(偏好S32) ②独立AUDIO_FMT_DOP DoP DSD透传+失败报错关流(拒BT) ③音量收编v2双组写PCM+DSD_VOLUME平方锥度audiod权威 ④/api/audio/monitor监控+前端音频页监控卡;宿主100/0,0warning;SDK meow_ui_audio ABI变大M6.34需重编meow_ui.a+重链四App
|
2026-09-04 00:56:57 +08:00 |
|
AskaEth
|
2dc4cad454
|
refactor(panel): 前后端按模块拆分+屏幕/控制合并页 — 后端meowpanel.c 6372行拆src/*.c+mp.h(235函数原型,20端点output byte-identical,0warning)+前端拆mp_shared/mp_pages/meowpanel三层;屏幕·遥控合并(左屏实时画面+右MD3 SVG矢量按钮无emoji);重编后热更TF卡
|
2026-09-04 00:56:13 +08:00 |
|
AskaEth
|
f3ae06d7cd
|
feat(bt): 批①后台常驻框架实施 — meow_media_app_resident按app会话判活跃+should_keep三参(keepalive||bg_audio&&resident)+background_keepalive声明解析透传+amsd EV BG/FG上报;宿主test_media39/test_bgplay/test_bg_keep19全过,0warning;落盘APP_BACKGROUND_KEEPALIVE_P1;降配(nice)待真机未做
|
2026-09-04 00:39:29 +08:00 |
|
AskaEth
|
7e68313981
|
fix(fw): M6.33 收编launcher播放页占位符移除+封面空→复原恢复 — 推卡
|
2026-09-04 00:19:31 +08:00 |
|
AskaEth
|
6eccb17f9b
|
fix(ncm): 歌单切换两bug — ①暂停态跨歌单点歌旧信息(play同曲护栏改按曲目id判同曲而非裸队列下标,切歌单后同下标换歌被吞play→修play_is_same_song) ②切歌单封面残留(playlist_tick补cover_changed/ack+invalidate重画头块);附带占位行cover_request野id修复;宿主P15/covswitch PASS,热更ncm
|
2026-09-04 00:14:37 +08:00 |
|
AskaEth
|
62ec405dca
|
docs: README 更新至 M6.32/0.8.32(歌词批1-5桌面歌词页双页/封面取色/流媒体客户端功能/蓝牙P0-P2)
|
2026-09-04 00:09:40 +08:00 |
|
AskaEth
|
b988d64653
|
fix(launcher): ①移除播放页底部歌词占位符(歌词页已做,删NP_LYRIC_Y+占位块) ②封面'空→复原'不恢复修复(meta_changed补artwork/np_cover_load缓存去重改为空也重载/歌词页补载封面);宿主test_np_cover 14项PASS,0warning
|
2026-09-04 00:07:34 +08:00 |
|
AskaEth
|
18014eb2b9
|
fix(ncm): 补play_mode持久化定义(appstate_apply_play_mode/ncm_mode_name,同agent-392播放模式) — ncm链通必需,与M6.32上卡二进制一致
|
2026-09-03 23:48:08 +08:00 |
|
AskaEth
|
76a22a6a91
|
fix(fw): M6.32 重编meow_ui.a+重链四App(播放页进度条取色+ncm列表gap)+面板透传 — 推卡+热更四App
- meow_ui.a 重编(86af4d29): SDK W_PROGRESS 改读 opts.bg/fg=轨道/填充(agent-408)
- launcher 513d7603: 播放页进度条/按钮局部重绘接取色(np_grad_row/np_page_bg_row/np_theme_widgets)
+ 链新 meow_ui.a + sdk meow_lyric/lyric_view/meow_img_color; 经固件 /usr/bin 刷入
- ncm 05ff05f1 重链新 meow_ui.a(agent-409 列表项 gap 已入源), hello f35495a5 / files 5d70b7b2 重链
- meowpanel.c: audio_fill 补透传 audiod target/volctl/codec(输出目标/音量AVRCP/编解码器)
前端 meowpanel.js 已前向兼容; 宿主 /api/audio JSON 验证含三键
- fw_content.conf launcher 0cdf940f -> 513d7603(M6.32)
- r3proii_m6_32.upt md5 8ce917ad(0.8.32, rootfs 38707200<=45088768, unpack 0 diff)
|
2026-09-03 23:42:46 +08:00 |
|
AskaEth
|
e8218b8ae9
|
fix(ncm): SDK圆角矩形列表项加外边距 — 实为ncm_app应用层自绘(row_bg圆角卡),调用处加NCM_ROW_GAP=8px卡间可见外距(卡高48/行距56上下对称+擦SDK行分隔线);三屏playlist/home/queue;宿主test_meow_row_gap PASS,0warning,不涉meow_ui.a无需重链
|
2026-09-03 23:29:45 +08:00 |
|
AskaEth
|
a82f3f9dfa
|
fix(lyric): 全局播放页进度条/按钮带局部重绘回退默认色修复 — 取色主题抽共用(np_grad_row/np_page_bg_row/np_theme_widgets),1s局部重绘也接取色(带底色渐变/进度条fill=accent/track=fg_dim/四钮accent);SDK W_PROGRESS改读opts.bg/fg向后兼容;宿主R1-R3 PASS,0warning;需重编meow_ui.a+四App重链
|
2026-09-03 23:28:37 +08:00 |
|
AskaEth
|
8971f6067b
|
fix(fw): M6.31 收编桌面歌词页封面修复+alsa.conf DEV自动识别(bt_dev) — 推卡
|
2026-09-03 22:43:05 +08:00 |
|
AskaEth
|
8c165bb8e6
|
fix(lyric/bt): ①桌面歌词页封面不显示修复(根因:歌词页从不画封面+scrim逐秒叠涂压黑→新增np_draw_lyric_coverbg封面背景+1s整页重绘;播放页封面宿实证非批5破坏) ②alsa.conf pcm.bluealsa DEV自动识别(bt_dev.c:audiod BT打开时bluealsa-cli检测a2dpsrc设备幂等改写DEV=保留codec/ldac_eqmid等);test_bt_dev 14/14,0warning
|
2026-09-03 22:36:17 +08:00 |
|
AskaEth
|
ef6eca86b1
|
fix(fw): M6.30 收编批5取色+蓝牙P2(audiod glibc-dynamic)+面板蓝牙卡 — 推卡+panel热更
|
2026-09-03 21:44:23 +08:00 |
|
AskaEth
|
4ecddb5ea3
|
fix(bt): 蓝牙P2 mipsel libasound链接 — 改glibc-dynamic(设备实为glibc2.22硬浮点,pcm.bluealsa=独立glibc插件需dlopen,musl-static死路)直链设备libasound.so.2,BT层脱离dlopen(内联9个libasound原型);qemu装载动态库验证+宿主67pass/0warning;audiod改glibc-dynamic(57KB)M6.30后需重验DAC出声
|
2026-09-03 21:18:19 +08:00 |
|
AskaEth
|
71b2dafecc
|
feat(bt): 蓝牙P2 source实装 — audiod OUT_BT输出目标(libasound直连pcm.bluealsa,BT独立目标不动DAC独占/FPGA/音量反转)+音量AVRCP隔离(不下发DAC反转)+codec生效+MSG_AUDIO_OUTPUT/CLI;宿主67pass/0warning;sink标记P2.5;遗留mipsel静态dlopen不支持libasound(硬集成项)
|
2026-09-03 20:52:06 +08:00 |
|
AskaEth
|
1f6d390e1c
|
feat(lyric): 批5 封面双色渐变取色 — SDK meow_img_color纯整数分桶主色+次色(副采样≤3.6k零分配)+launcher播放页/歌词页set_colors注入渐变主题+无封面回退全局主题+meow_lyric_view灰阶随覆盖cur修正;宿主C1-C7全过,0warning,未并入meow_ui.a
|
2026-09-03 20:44:33 +08:00 |
|
AskaEth
|
a3679e3688
|
fix(launcher): M6.29 播放页任意右滑返回桌面(回退出np_gesture) — 推卡
|
2026-09-03 20:32:23 +08:00 |
|
AskaEth
|
0da68e4972
|
fix(fw): M6.28 收编桌面NowPlaying双页歌词页+歌词数据源+蓝牙P1(netmgrd/bt_page) — 推卡
|
2026-09-03 20:06:36 +08:00 |
|
AskaEth
|
eb07415f7b
|
feat(bt): 蓝牙P1 — netmgrd BT_CTL权威收口(hcitool con判连接/paired-devices补名/a2dp详情/connect-disconnect-pair-unpair-scan)+launcher蓝牙子页sub_page_t重做(8分组,数据全走netmgrd)+设置键audio.output_bt/bt.codec;修act冲突+sub悬垂;宿主82PASS+bt_ctl/bt_page全过
|
2026-09-03 20:01:13 +08:00 |
|
AskaEth
|
8c677f127f
|
feat(launcher): 批4 Now Playing双页(播放页⇄歌词页) — 方向感知手势(播放页右→左进歌词/左缘右滑回桌面;歌词页左→右回播放)+歌词页用批3数据+批1/2控件实时滚动+空态;宿主G5/G6全过,0warning;meow_ui.a未重编
|
2026-09-03 20:00:38 +08:00 |
|
AskaEth
|
2e5b814059
|
feat(media): 批3歌词数据源框架 — meow_media_session扩实时歌词(lrc/tlrc/seq)+MSG_META_LYRIC上报分片+ncm上报+launcher读meow_media_lyric_* 接批1/2;宿主L1-L7全过/ncm热更27554dd8,launcher待固件收编
|
2026-09-03 19:49:28 +08:00 |
|
AskaEth
|
7ca3e5bd84
|
feat(ncm): 播放模式三态(随机/列表循环/单曲循环,播放页三键左)+当前实时播放列表(三键右,歌单滑窗/meow_listview虚拟化分页至5194首,当前曲高亮,点播切歌) — 模式持久化,宿主modetest/queuetest全过
|
2026-09-03 18:51:28 +08:00 |
|
AskaEth
|
29e13b2b5e
|
fix(netmgrd): M6.27 流量统计收编(pub_bytes/去lo) — 推卡+panel热更
|
2026-09-03 18:45:12 +08:00 |
|
AskaEth
|
671f0d1835
|
feat(ncm): 底部mini播放栏(替代顶栏图标) — 异Activity常驻,非播放页+有活动播放时显示:封面缩略+歌名/歌手+播放暂停+进度带+点击进播放页,宿主barhit/plsplay/home/player PASS
|
2026-09-03 18:07:57 +08:00 |
|
AskaEth
|
26a140e00f
|
feat(netmgrd): 播放器流量统计细化 — A.实时速率去lo(uplink_totals) C1.netlink sock_diag TCP流公网/内网字节(pub_bytes)=status+panel展示+诚实标注;UDP暂不计(tcp_only),netmgrd宿主70/70pass
|
2026-09-03 18:00:39 +08:00 |
|
AskaEth
|
dce12c63a2
|
feat(sdk): 批2 meow_lyric_view 歌词页渲染控件 — 上收ncm成熟布局(活动行纯白/灰阶/偏上锚定/翻译行不叠行/折行/点行seek),布局命中绘制同源,宿主L1-L7全过,预留批5取色set_colors,暂不并入meow_ui.a
|
2026-09-03 17:56:27 +08:00 |
|
AskaEth
|
4827cc8d92
|
fix(launcher): M6.26 播放页三键命中(push哨兵)+媒体卡片体FOCUS(点击开播放页) — 推卡
|
2026-09-03 14:54:41 +08:00 |
|
AskaEth
|
76eb2f4d1c
|
fix(bootmenu): M6.25 开机菜单/第二屏亮度按用户设置恢复(方案A:显示前读settings.conf写回) — 推卡
|
2026-09-03 14:40:56 +08:00 |
|
AskaEth
|
42718385cc
|
feat(sdk): 批1 meow_lyric 通用歌词组件 — lrc/tlrc解析+存取+查询+折行辅助,纯libc+pthread零依赖,宿主54断言全过,暂不并入meow_ui.a
|
2026-09-03 14:40:44 +08:00 |
|
AskaEth
|
b5da7d7151
|
fix(launcher): M6.24 App内按电源键锁屏时序(松开边沿误判唤醒) — 推卡验收
|
2026-09-03 14:27:00 +08:00 |
|
AskaEth
|
b89b91c9c4
|
fix(ncm): 歌词页两bug — ①app.json单行被fgets(256)截断致keep_awake失效(改多行版部署) ②翻译行块高不含翻译致叠行(lyr_layout s_lyr_bh)
|
2026-09-03 14:20:14 +08:00 |
|
AskaEth
|
ec8e43e1fd
|
fix(watchdog): M6.23 亮屏亮度按用户设置恢复(修 panel ON 固定60跳变) — 推卡
|
2026-09-03 14:12:21 +08:00 |
|
AskaEth
|
e448b9bfda
|
fix(launcher): M6.22 播放页返回根因修复 — np_exit 退出外层主循环(break错层级) — 推卡
|
2026-09-03 14:00:28 +08:00 |
|
AskaEth
|
e802cc678a
|
fix(launcher): M6.21 播放页返回诊断日志+阈值放宽(M6.20基础上) — 推卡
|
2026-09-03 13:50:40 +08:00 |
|
AskaEth
|
cd9d9da3bd
|
fix(launcher): M6.20 播放页右滑返回+顶部下滑通知中心+时钟1s刷新 — 推卡验收
|
2026-09-03 13:42:32 +08:00 |
|
AskaEth
|
3d70a3dd2c
|
feat: M6.10–M6.19 批量收编 + M6.19 推卡验收
- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘)
- OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复
- ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640
- 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫)
- 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
|
2026-09-03 12:16:01 +08:00 |
|
AskaEth
|
c2ee7626a4
|
fw_content: M6.9 收编 launcher 94a33b7b(327 M7.0b 试点)
|
2026-09-02 18:38:25 +08:00 |
|
AskaEth
|
d8241cd2d6
|
launcher(M7.0b): 电源菜单/Now Playing 控件化 + SDK 主题薄壳 + i18n 抽取(试点迁移)
M7 整体 MD3 重写试点(M7.0 定两隔离页,只动 patch_v2/meow_launcherd/):
- 电源菜单 power_menu.c:圆角卡→meow_card;6 圆钮→meow_iconbtn(回HiBy=ARROW_BACK、
取消=CLOSE;sb_icons 表在位图)+ meow_widget_custom_create(关机/重启/升级/锁定=pm_icons
专有,圆形命中自定义);命中/选中/按压态全走 SDK(meow_widget_hit/set_state/draw),
触摸按下置 PRESSED、抬起清(pm_blend 按主题混合状态层);py 手动驱动控件(哨兵 activity
0x50 push/pop,owner 闸门使命中生效)。
- Now Playing now_playing.c:进度条→meow_progress;播放控制三钮→meow_iconbtn(SKIP_PREV /
PLAY_ARROW|PAUSE同位双钮按状态只画其一/ SKIP_NEXT);命中走 meow_widget_hit;封面
(meow_img contain) 与歌名/艺术家 (meow_font) 保留;哨兵 activity 0x51 push/pop。
- 主题薄壳 font_theme.c:s_ui_theme() 改读 SDK meow_theme_export()(单一权威,9 字段映射
§8.1.5),退役 launcher 自持 4 套静态色板(#if 0 回退位)。
- i18n 抽取:两页硬编码中文案改 meow_str(新增 meow_str_zh 辅助:SDK 内嵌表无 launcher 域串
时回退中文默认,TF 覆盖表/后续并入 SDK 内嵌后自动换语)。
- 会话骨架不动:物理键语义(单击息屏/3s 菜单/8s 强关/左缘返回/横划 NP)与两页进入退出/事件流
未改,只替换「怎么画/怎么命中」;旧绘制函数 #if 0 留回退位。
- 验证:新增 test_power_menu_widgets / test_now_playing_widgets 宿主测试(圆形命中/owner+enabled
闸门/选中按压态像素/主题四态 MD3+MIUIx×明暗 渲染 + meow_theme_export 九字段)全 PASS;
launcher 全量宿主回归(lock_screen/overlay_gate/utf8_name/media/depends/ams_start/bgplay/
settings_brightness/netmgr_ipc/vol_ramp_jack/notif_panel/notif_tf/lock_render + SDK theme_export/
iconbtn)全 PASS;交叉 -Wall -Wextra 0 warning。新 meow_launcherd md5 94a33b7b。
|
2026-09-02 17:25:21 +08:00 |
|
AskaEth
|
a8c51be1fc
|
sdk(M7.0a): 视图事件接线 + IconButton + 主题色板导出/注入(launcher 重写基座前置)
M7 launcher 整体 MD3 重写的 SDK 基座补全(只动 patch_v2/sdk/):
- 缺口#7 meow_view 事件接线:meow_view_dispatch_event 接入 meow_ui_run 主循环
(§6.4 分流之上,TAP/KEY/SWIPE/LONG_PRESS 先经 view 路由、命中即消费、未命中回落
on_* —— 无 view 树/未命中完全向后兼容);meow_view_add_child 在父已进入时挂子视图
立即进入(递归 children 修正);meow_view_sub_push/pop 标注废弃(设计定案 b 不做页内
子导航栈)。
- 缺口#2 IconButton:meow_iconbtn_create —— sb_icons 位图 + 圆形命中 + 按压/按住态
(实时,同 meow_btn)+ owner/enabled 闸门;电源菜单/播放控制/锁屏通用件。
- 缺口#6 SDK 半主题收口:meow_theme_export/meow_theme_inject(§8.1.5 色板导出/注入),
launcher s_ui_theme() 将据此变读 SDK 的薄壳(launcher 侧改动不在此批)。
- 文档:MEOW_APP_SDK.md 补 meow_iconbtn_create + meow_theme_export/inject 说明。
- 验证:新增 test_meow_ui_iconbtn / test_meow_ui_theme_export / test_meow_ui_view_event
全 PASS;全量 SDK 宿主回归(widgets/dispatch/box/anim/scroll/listvirt/str/ime/pinyin/
overlay/notif/input_keys/p1p2p3/umbrella/ft)全 PASS;交叉 -Wall -Wextra 0 warning。
meow_ui.a md5: be24214e24faadba63577f3a98c2c9d1 -> 7fc83f7731cadb2f91df1c3ed7d3814f
|
2026-09-02 16:50:40 +08:00 |
|
AskaEth
|
e67cc50afa
|
fw_content: M6.9 候选 netmgrd 20243ea1(期4)+powermgr 1ef2f8af(期3)
|
2026-09-02 16:29:42 +08:00 |
|
AskaEth
|
5663acfbb9
|
feat(powermgr): 期3 policy 生效 + 标定工具 + 模型单键 setter + events 说明
- policy:IPC 0xD2/0xD3 GET/SET(SET 动作级鉴权=root+系统身份,SO_PEERCRED→pid→exe→classify,同 svc_power)
+ CLI `meow_power policy show|set`。策略项 profile 四档(performance/balanced/powersave/ultra)
+ 低电阈值(power.low_pct/critical_pct 读 settings.conf) + 亮度上限(power.brightness_cap)
+ 息屏上限(power.screen_timeout_cap)。**默认全关**(profile=balanced 无操作=现状, cap=0 不生效,
只能用户手动开)。生效方式: powermgr 不直接写系统——只写 settings.conf power.* 键(原子),
launcher/sysui 期4 消费; 本服务绝不 poke 背光/息屏/wlan0/bt。低电/极低阈值改从 settings.conf
读, 事件检测即时生效。
- calibrate:`meow_power calibrate start <场景>|stop|list`——守护内 2s 节拍采样 电流(mp2731
current_now)+亮度+CPU+wifi/bt 状态+电量%变化,写 TF MeowOS/logs/power_calib_<epoch>.csv
(无卡降级 /tmp,逐行 fflush),用户实验中 start/stop 两命令即可。
- model:`meow_power model set <key> <mw>` 读改写单键+原子写(tmp+rename),守护每拍重载 conf。
- events:App 前后台切换——launcher MSG_ACT_FOCUS 为单向 app→launcher 上报,powermgr 侧无导出点
可接,诚实标注「期4 接 launcher」扩展,本期不编造该事件(延续期2 口径)。
- 验证:宿主+qemu 全量 76/76 PASS(期1/2 全过+新增 policy/calibrate/model-set 用例),mipsel
静态交叉 0 warning,二进制 151516B(<200KB 阈值)。md5 1ef2f8afc07acc7aa09dee9f7149aba8。
|
2026-09-02 16:25:51 +08:00 |
|
AskaEth
|
4e0e7441fd
|
fw_content: M6.8 收编 launcher 42b6633a(310四轮 锁屏自睡)
|
2026-09-02 15:31:07 +08:00 |
|
AskaEth
|
cd7329d141
|
feat(ncm): MUSIC_U 临期主动续期 — 启动查龄超阈值后台静默刷新/eapi 会话锚点/cookie 合并+冷却
用户定案:失效前用当前 cookie 换新登录态(用户无感);仅刷新失败才退扫码重登。
- core/ncm_req.c|h:eapi Cookie 头补齐会话锚点 MUSIC_U/MUSIC_A(对齐 request.rs,
补 §36.5 遗留——登录刷新/song_url 会员档依赖);新增 ncm_req_cookie_merge
(patch 覆盖 base 同名 cookie,MUSIC_A/__remember_me 等不丢)。
- core/ncm_login.c|h:ncm_login_refresh(eapi /api/login/token/refresh 空体,
code200+set-cookie→merge;code!=200→NCM_ERR_AUTH 退扫码;网络/TLS→负码退避)。
- app/logic/account.c:account.json 增 last_refresh_ts + 拆分 cvip/svip;
account_cookie_maybe_refresh(年龄阈值 12h 可配 ncm.cookie_refresh_h,单飞/boot,
失败冷却 30min 跨 boot 持久化,AUTH 置回登录页标志)+ mark_fresh/need_relogin。
- app/ui/home.c:home_worker 先续期再拉歌单;app/ui/login.c:803 落盘后 mark_fresh;
app/app.c:UI tick 消费回登录标志 → logout+切登录页。
- 新增测试:test_ncm_core 的 cookie_merge + eapi_musicu_hdr;bench/cookie_refresh_sim
(端点语义,0 网络);bench/account_cookie_sim(临期/未临期/退避/失效/冷却,0 网络)。
验证:host+qemu 核心测试 PASS;build_ncm_sims.sh 全家桶 PASS;build_ncm.sh 0 warning。
真机只读探针 2 次(设备 10.78.193.50,不写回):refresh 走 eapi 域
interface.music.163.com 在当前网络被 TLS reset(alert 80)→ rc=-5 瞬断退避,
session.enc/deviceId md5 前后一致(登录态零损伤)。新 ncm md5 c960244b。
|
2026-09-02 14:30:04 +08:00 |
|
AskaEth
|
de18cef02c
|
feat(ncm): 缓存分目录(songs//covers/)+ 陈旧 mp3 缓存修复
任务1 缓存分目录(用户定案):\n- ncm_cache_init mkdir songs/ 与 covers/ 子目录 + 一次性迁移\n (根混放 song_*/cov*/cover_current.jpg 挪进两子目录,幂等,legacy_migrated 计数)\n- ncm_cache_path 按 id 前缀路由(cov*→covers/,其余→songs/)\n- LRU(evict/total_bytes/7天 .part 回收)只扫 songs/;clear 清 songs/+covers/ 的 song_*\n- cover.c save_cover_raw 落 covers/cover_current.jpg\n\n任务2 陈旧 mp3 缓存修复(真机实锤:hires 档键下存 mp3,播放命中旧档):\n- song_local_file 缓存命中且用户档>EXHIGH(无损+)且实体是 .mp3 = 静默降级产物\n → 迁移重命名到 exhigh 键 song_<id>_exhigh.mp3(选极高仍可用;目标已存在删旧)\n → 本档视为未命中走下载(311 flac 门禁拿真无损/正确降级)\n\n验证:cache_evict_sim case10(目录迁移一次成型)+P1-9;player_flow_sim P13(迁移+miss)\n+P1-12 零回归;stream/window/search/degrade/cover_chain/test_ncm_core(host+qemu) 全 PASS;\nbuild_ncm.sh -Wall -Wextra 0 warning。0 真实请求。新 ncm md5 a90ba8c3 (text1028458/bss1364484)。
|
2026-09-02 13:51:36 +08:00 |
|
AskaEth
|
986e3814bc
|
fix(launcher,lock): §310 M6.7 锁屏页自睡——空闲超时自动灭屏(294 遗留补)
背景:锁屏页(run_lock_screen)此前常亮不灭屏——用户停在锁屏页不操作,屏幕一直亮着耗电。
M6.6 上机后用户反馈,补 294 遗留项「锁屏页未做空闲超时自动息屏」。
实现(/usr/bin 只读,待 M6.7 固件打包,fw_content.conf 未动):
- run_lock_screen 循环加空闲跟踪(last_act)+ 自睡状态(asleep):
① 阈值 = overlay_lock_idle_off_sec(screen_off_timeout) = min(系统 screen_off_timeout, 30s)。
系统未设/设 0(常亮)/超 30 → 锁屏页封顶 30s(锁屏页不应常亮耗电);系统设更短 → 尊重更短。
② 活跃态空闲超阈值 → meow_panel_off()(与息屏路径一致:panel 模式 FBIOBLANK 4 挂起 goodix /
black 模式仅背光 0)+ asleep=1 —— 锁态保持,仍留在锁屏循环(=「锁屏页自己也会睡」)。
③ asleep 后电源键按下边沿 或 触摸活动 → meow_panel_on() + lk_draw 重画锁屏页(本循环唤醒链
回锁),输入活动(任意按键 change / 触摸)都重置 last_act。
④ 音量键本页不动,仅计入输入活动重置计时;自睡期面板已关,不重绘(唤醒时统一重画)。
- EVIOCGRAB 与灭屏交互(核对结论):灭屏期 grab **保持**(tfd 不关)。panel 模式 FBIOBLANK 4
挂起 goodix → 灭屏期无触摸事件,唤醒只走电源键;black 模式触摸仍活动且被抓取者(launcher)独占
→ 唤醒第一下触摸进锁屏(不穿透 App、不被吞——被锁屏作为活动消费,可能命中 PIN 键)。唤醒后
FBIOBLANK 0 + grab 仍在,全程无穿透。
- App 前台叠加锁屏(run_app_lock_overlay)期间 App 的 /tmp/meow_notif_active 标记在整个自睡/
唤醒周期保持(仅锁屏退出才 unlink),故媒体保活 App 自睡期仍被 present 抑制,不覆盖锁屏。
overlay_gate.h 增 overlay_lock_idle_off_sec / overlay_lock_should_sleep / overlay_lock_wake_now
(纯决策,可单测)。test_overlay_gate.c 扩展 S4(12 断言:阈值 tradeoff / 超时灭屏 / 唤醒回锁屏 /
屏幕关不重睡)。launcher 全量宿主回归 + SDK 叠加/状态栏/输入回归全 PASS;mipsel 交叉 -Wall -Wextra
0 warning。md5 42b6633afde37035585fc36b074a73c6(待 M6.7 固件打包,不部署)。
|
2026-09-02 13:35:56 +08:00 |
|
AskaEth
|
cf8b0da3bd
|
fix(fw_content): 拆分 launcher+watchdog 与 audiod+audio 两个合并行 — 修 watchdog/audio CLI 被吞进 desc 不打包
build_fw_apps.sh 以 `IFS='|' read -r src dst md5 desc` 解析,launcher 与 audiod 的 desc 后误并入了
meow_watchdog / meow_audio(CLI) 条目,导致这两个二进制在固件打包时被当作 desc 文本【不】作为独立
条目安装(M6.0 时本为独立行)。拆回各一行,md5 均已对源文件校验证实一致。
|
2026-09-02 13:05:29 +08:00 |
|
AskaEth
|
a70bcaac95
|
docs: 仓库文档同步 M6.6(0.8.6)——README 版本行 + M6.5/M6.6 演进;SPEC_REF 补 SDK §10.1 矢量字 meow_ft/audiod 315 孤儿回收/锁屏 310 三期;FIRMWARE_BINARIES 按 fw_content.conf 更新到 M6.6
- README:版本行 M6.4→M6.6(新增 M6.5 audiod 孤儿回收 + M6.6 §310 三期锁屏);新增「M6.5-6.6 新增」演进条目(SDK 矢量字/audiod 孤儿回收/流媒体客户端 314 SIGSEGV 根因+317 封面链分诊+兜底链+318 track/all 否决+319 接口地图+320 风控加固);应用生态更新到 2026-09-02 批次。
- SPEC_REF §3.5:补 §10.1 矢量字 `meow_ft_*`(316,上收阅读器 FreeType 管线)+签名蓝本扩到 meow_ui_ft.h;audiod 段补 315 孤儿会话两段式回收;锁屏 PIN 段补 310 二期 EVIOCGRAB + 三期(M6.6)。
- FIRMWARE_BINARIES:按 conf 更新 meow_launcherd(M6.6)/meow_audiod(M6.5)/meow_amsd(M6.2)/S89(M6.2) + 当前基线标注 M6.6。
|
2026-09-02 13:04:58 +08:00 |
|
AskaEth
|
ea645ce2a6
|
feat(ncm): 风控加固——接口响应短 TTL 缓存 + 游客 MUSIC_A + track/all 死代码
三(按 NCMAPI_NOTES §2.1/§4/§6):
① 接口级响应缓存(对齐参考 apicache 2 分钟,防风控高频 ip 错误):
- 新增 core/ncm_apicache.{c,h}——内存 4 槽 LRU(单槽≤128KB,TTL 120s,
键=md5(path+\x01+json))+ 可选盘缓存 <data_dir>/ncm_api_cache/.json
(8B 墙钟头+body,超 TTL miss 并删,30s 节流清过期)。自包含模块
(仅 libc+pthread+clock_gettime),可独立链接无符号冲突。
- ncm_api.c:api_post 拆「请求+解析」两段,新增 api_post_cached;四个只读
接口接线:user_playlist/playlist_detail/song_detail/cloudsearch。
song_url/lyric/vip 不入缓存。
- 手动刷新绕过:ncm_api_cache_refresh_path(path) 一次性标记;home/歌单
topbar ↻ 接入;playlist_open/search 不标记(走缓存)。
- 盘层挂载 appstate_init;登出 appstate_logout 全清(防串账号)。
② 游客 MUSIC_A:ncm_req.c weapi+eapi 无 MUSIC_U 且非 login 路径补
MUSIC_A=anonymous_token(对齐参考 cookie 伪装)。
③ track/all 死代码清理:移除 ncm_api_playlist_track_all(真实服务器 8 形态全
404,无调用点);ncm_api_parse_track_all 保留(离线重放/单测),注释标注
「已验证不存在,勿用于真实请求」。
验证:新 bench/apicache_sim.c(0 网络)①TTL 内不重复请求/②过期重拉/③手动
刷新绕过/④cloudsearch 按键区分/⑤清空重拉/⑥盘缓存写入+clear 全 PASS;stream/
player_flow/window/search/cache_evict(1-9)/pagination/playlist_race sim 全
PASS;test_ncm_core host+mipsel(qemu) PASS;build_ncm.sh -Wall -Wextra 0
warning(text 1026914/data 1664/bss 1363460);0 高频真实请求。新 ncm md5
a69c93538920eba9d42a2ebb42f8fdca(留主会话上卡)。
|
2026-09-02 12:48:34 +08:00 |
|
AskaEth
|
9d5301f931
|
fw_content: M6.6 收编 launcher 62c817c2(310三期)
|
2026-09-02 11:52:06 +08:00 |
|
AskaEth
|
a3d6e21db5
|
fix(launcher,lock): §310 M6.5 追加两修——App 内手动息屏不锁屏 + 锁屏脏区被 App 覆盖
真机 M6.4 反馈(c730333 EVIOCGRAB 之后仍未好全):
P1 App 内电源键手动息屏→亮屏无锁屏(桌面/超时路径都有锁、唯独此路径丢)
根因:App 会话内电源键单击息屏由 **watchdog** 处理(meow_watchdog.c handle_power →
wd_panel_off,直接 blank 面板背光 0),**不置** meow_auto_slept;而 launcher app 会话循环的
唤醒锁屏只在 `if (meow_auto_slept)`(超时路径 set)内触发(app_launcher.c:1996/2029)。
手动路径唤醒时 meow_auto_slept==0 → 不锁屏(真机实测)。
修法(app_launcher.c):App 循环每圈以读背光 `==0` 补判 watchdog 手动息屏(app_panel_manual_off),
唤醒分支改 `meow_auto_slept || app_panel_manual_off`,两类唤醒都走 lck_wake_should_lock 锁屏,
两条路径对齐。overlay_gate.h 增 overlay_wake_should_lock 判据。
P2 锁屏脏区被 App 覆盖(App 刷新控件盖到锁屏上 / 未刷新区显示锁屏自带脏区)
根因:媒体保活 App 不冻结仍在绘制;SDK present 抑制(/tmp/meow_notif_active)有 ≤200ms
标记节流窗(meow_ui_gfx.c MEOW_OVERLAY_CHK_MS)——锁屏首扑后 App 仍可能进 1-2 帧,其
部分脏区落在锁屏上(App 控件覆盖),未覆盖区才是锁屏。另外锁屏关闭需整帧重绘消残影。
修法:
① lk_draw 首帧已 fill_rect(0,0,xres,yres,th->surface) 全屏不透明底(复核满足);
② run_lock_screen 进场 300ms(OVERLAY_LOCK_COVER_MS > 200ms 标记窗)后**重铺一次全屏
不透明底**盖掉 App 抑制窗内的 1-2 帧残影;App 此后被抑制不再上屏,锁屏稳定遮盖;
③ 锁屏关闭(run_app_lock_overlay 关闭路径)已 pm_capture_app_frame+meow_ui_flush+
app_overlay_statusbar 整帧重绘含状态栏(复核满足)。
新增 test_lock_render.c(6 断言:首帧整帧不透明覆盖断言 + 部分填充漏区对照)+ test_overlay_gate.c
扩展(S1c 手动息屏触发锁屏 4 断言 + S2b 重铺阈值>200ms 2 断言)。launcher 全量宿主回归 +
SDK 叠加/状态栏/输入回归全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。
md5 62c817c204b9d9751a4d8f411d1eb69b(/usr/bin 只读,待 M6.5 固件打包;fw_content.conf 未动)。
|
2026-09-02 11:49:37 +08:00 |
|
AskaEth
|
986944ff24
|
fix(ncm): 歌词页封面拉伸铺满→等比居中放大(contain,四周主题底;方图不再变形)
|
2026-09-02 11:47:49 +08:00 |
|
AskaEth
|
2bfe1ed796
|
feat(ncm): 封面死链兜底链 —— 原 picUrl 失败→web 端 song/detail 重取活链→歌单封面兜底
用户调研: 官方旧版 GET music.163.com/api/song/detail/?id=<id>&ids=[<id>] 免登录出
songs[0].album.picUrl/blurPicUrl。本批宿主实锤: 登录态 eapi 给的死链封面, 该 web 接口给不同活链
(死链 yR2VGt7.../10995116862531 -> album.picUrl p2.../6y-UleORIT.../...jpg 活 PNG 146KB)。
实现 (patch_v2/ncm_app/):
- cover_request(url, song_id): 新增第二参曲目 id; g_tgt_song 记录; 新目标重置 g_fb_done。
player.c 三处传 s.id(专辑封面), playlist.c 传 NULL(歌单封面无兜底)。
- cover_song_detail_pic(song_id): web song/detail 重取 album.picUrl(缺 blurPicUrl);
ids=[<id>] 的 [ ] URL 编码 %5B/%5D(裸[ ] curl 报 bad range); 带 Referer+桌面UA; ncm_http_request
(头进 resp->headers, 体进 16KB 栈缓冲) + ncm_json 解析; 只读一次。
- cover_try_fallback(url, song_id): 仅原链确定性失败时触发; g_tgt_url 仍==url(未被换走) + 曲目非空 +
未兜底 + 同曲 5 分钟冷却(ncm_monotonic_ms) 才下探; 拿到不同新图->记冷却/置 g_fb_done/换目标返 1
(worker 重试新图); 无新图/冷却中/已兜底/目标被换走->返 0 走歌单封面兜底; 每步日志写清级别。
- worker: kind=1(webp)/kind=2(非图)/确定性4xx 死链分支清目标前先
if(song[0]&&!fb_done&&cover_try_fallback(url,song)) continue; 瞬时错误仍指数退避不触发。
- 风控: 只在原链失败触发(不新增常规请求); 单曲目最多一次(g_fb_done)+5分钟冷却。
验证 (宿主+qemu, 0 新增真实 CDN 业务请求):
- cover_chain_sim T1-T12 ALL PASS(新增 T11 原链死->song/detail活链->出图+恰1次+song-detail fallback日志;
T12 兜底也死->留歌单封面+同曲再请求 song/detail 0次(冷却)+cooldown日志)。
- cache_evict/player_flow/window/search/stream sim 全 PASS; core host+mipsel(qemu) PASS;
build_ncm.sh 0 warning(text 1022210/bss 1362564,+64B); ncm_host UI dump exit=0。
新 ncm md5 e1f4b7ade834b18c7910b9c3e64bc858 (未部署, 留主会话上卡)。
|
2026-09-02 11:41:54 +08:00 |
|
AskaEth
|
9d93f1b1ef
|
fix(ncm): 封面矩阵实锤修正 —— 200解码失败=死对象返JSON错误体(非webp)/UA改桌面浏览器(CNMPlayer UA被拦403)/非图k不定性不重试
真机(设备恢复)CDN 行为矩阵结论并落地:
- 裸请求(无Referer)→403: 防盗链坐实, 封面请求头加 Referer https://music.163.com/。
- +Referer 仍不返真图; 全部变体只见 403/404/200+JSON错误体(43B {"code, application/json)。
③「200解码失败」真因=源站死对象返 200+JSON错误体, 非webp; stbi解不了→旧逻辑盲指数退避8次。
→ download_cover 回填 *out_kind(0可解码/1 webp/2非图), worker 对 kind=1/2 与确定性 4xx 一律
立即清目标走兜底(保留歌单封面)不重试; kind=2 打 'not an image (origin error body/200)'。
- UA 分表: CNMPlayer口径 UA(Mozilla/5.0 CNMPlayer/0.1)同Referer也返403(CDN拦bot串);
桌面 Chrome UA(旧cover.c)返200。→ NCM_COVER_UA 改回桌面浏览器 UA。
- ?param=300y300 在死对象上→404(对死链无效); 存活URL未获样本, 保留 USE_PARAM=1(标准缩略)。
- cover_chain_sim 增 T10(200+JSON→非图不重试) + stub 内容加 JPEG 魔数(过 body_is_decodable_img);
T1-T10 ALL PASS。mipsel 0 warning(text 1020306/bss 1362500 持平)。
新 ncm md5 06896b54f31ddf55980cbf921a00d67a (未部署, 留主会话上卡)
|
2026-09-02 10:50:07 +08:00 |
|
AskaEth
|
aeb9176101
|
fix(ncm): 封面链分诊与修复 —— CNMPlayer 头(Referer+UA 解403)/webp 魔数内容型先判不解码走兜底/URL 追加 param=300y300 缩略图/403 与 webp 单独分诊日志不盲重试
- cover.c: 请求头对齐 CNMPlayer(Referer https://music.163.com/ + UA Mozilla/5.0 CNMPlayer/0.1);
下载后先判 content-type 含 webp 或临时文件魔数 RIFF....WEBP(stb_image 不支持),回 webp=1 不解码,
worker 打 'webp unsupported' 立即清目标走兜底(保留歌单封面),不再当 fetch failed 盲目指数重试;
403 单独日志(anti-hotlink/forbidden, no retry),确定性 4xx 不重试(沿用 311)。
- cover_request 入口 cover_norm_url 追加 ?param=300y300(已有 param= 尊重原样, 溢出保原 URL),
缓存键/去重/下载 URL 同参版(省内存+出 jpeg)。
- ncm_app_internal.h: NCM_COVER_USE_PARAM/NCM_COVER_PARAM 共享宏(cover.c 与 sim 同源)。
- bench/cover_chain_sim.c: 补 ncm_http_download/meow_img_load_file/meow_img_downscale 桩对齐现行
cover.c(旧 ncm_http_request 桩已过时), url_hash 同参数规则; 新增 T8 webp/T9 403 用例。
- 验证: cover_chain_sim T1-T9 ALL PASS + stream/player_flow/window/search/cache_evict/degrade/mem
sim 全 PASS + core host+mipsel(qemu) PASS + build_ncm.sh 0 warning(text 1019834/bss 1362500 持平)
+ ncm_host UI dump exit=0。0 新增真实 CDN 请求; 设备端 CDN 矩阵因设备不可达未执行(见 REPORT 34.6)。
新 ncm md5 a7c22bd4ee3bcd02fb24046d27a33242 (未部署, 留主会话上卡)
|
2026-09-02 10:37:24 +08:00 |
|
AskaEth
|
c7ef1ebb04
|
fw_content: M6.5 收编 audiod b122c9b8(315 孤儿会话回收)
|
2026-09-02 10:10:36 +08:00 |
|
AskaEth
|
bcc016e50e
|
fix(ncm): 播放页歌词解析栈溢出(SIGSEGV)修复 —— lyric_parse 栈上 227KB 临时数组超 128KB 线程栈
根因(真机 sig=11,RA 落 lyric_parse / pc 在 lib):
app/logic/lyric.c lyric_parse() 在栈上定义
long ttmp[NCM_LYRIC_LINES=600]; char txt[600][192]; char tl[600][192]
= ~227KB 栈帧,远超 ncm_thread_create 统一设的 NCM_THREAD_STACK=128KB。
播放页 enter → player_manager_load_lyric → lyric_worker(128KB 线程栈) → lyric_parse → 栈溢出 SIGSEGV。
崩溃仅在「播放页前台 + 拉取歌词成功 + 解析」时触发,故与播放进度无关、autoplay 仅后台起播不崩。
修法:排序临时数组移到堆(按 s_n 计,≤600 行,峰值 ~230KB 瞬态),栈帧回到 KB 级。
复现/定位(/dev 调试 + 真机):
- 真机通过 amd 恢复路径:/tmp/ncm_autoplay 起播缓存曲,app_on_tick 于 UI 线程调 player_play_song
打开播放页(复现用户点曲路径;autoplay_ui_consume 承接)。原崩溃:pid sig=11 dur=3683ms;
修复后:连续两次 play:start 无崩溃、60s+ 存活、无 crash_report。
- app.c 增 async-signal-safe SIGSEGV/SIGBUS/SIGILL 处理器(MIPS mcontext_t.pc + gregs ra/sp/fp
→ stderr + crash_report.txt),供 addr2line/链接布局定位。
验证:stream/player_flow/window/search/cache_evict sim 全 PASS;test_ncm_core host + qemu-mipsel
PASS;build_ncm.sh -Wall -Wextra 0 warning;ncm_host NCM_PAGE=player/home 离屏渲染 exit=0。
|
2026-09-02 09:53:34 +08:00 |
|
AskaEth
|
54750a63c5
|
feat(sdk): SDK 矢量字(meow_ft_*,§10.1)——上收阅读器 FreeType 管线
问题:SDK 位图字库(meow_font)只有离散字号档位,全字形 atlas 稳态 17.3MiB
(27MB 整机装不下)→ 大字库/大字号必出豆腐。阅读器 R1/R2 的 FreeType 管线已真机验证
(MiSans OTF),本 commit 将其上收 SDK,让任意 App 用上无级字号 + CJK 全字形。
设计(追加式,与位图字库并存):
- meow_ui_ft.c(独立 .o):meow_ft_load/unload/loaded/text/width/line_height/
ascender/descender/cache_set_slots/cache_slots/cache_used。底层按 READER_ENGINE_NOTES §5:
FT_New_Face(path) 按需读文件(零整载 anon);灰阶 FT_LOAD_RENDER|NO_HINTING|TARGET_LIGHT;
glyph LRU key=(px<<32)|cp,默认 512(~0.46MB),可配 256/1024;测宽不栅格化。
- meow_ui_gfx.c 只加两个薄封装 meow_gfx_ft_blend_px/dirty(写 back_buf + 标脏),
使 meow_ui_ft.o 不引入新依赖——「不调 meow_ft_* 的 App 零增量」(freetype 不拉入,已验证)。
- 降级:加载失败/无卡 → meow_ft_loaded()==0 → meow_ft_text 自动改走 meow_ui_text(位图字库,
5x7 兜底),绝不豆腐不崩;meow_ft_width/line_height 降级位图字库度量。
- FreeType 2.14.3 vendor 进 patch_v2/sdk/vendor/(gitignore)+ build_sdk.sh 可复现拉取+裁剪
构建(-DFT_DISABLE_ZLIB/BZIP2/PNG/HARFBUZZ/BROTLI=TRUE,静态 musl),freetype .o 编入
meow_ui.a,App 链接命令不变(meow_ui.a libz.a -lpthread)。
验证:
- 宿主 test_meow_ui_ft 5 项全 PASS(加载/渲染像素非空/宽度测量/LRU 淘汰/降级回退)。
- 全量 SDK 回归:widgets/sdk_fixes/dispatch/notif_gesture/overlay_suppress/listvirt/box/anim/
scroll/ime_fix/pinyin/notif_open/sb_collapse/theme/notify_ipc/audio_host/vol/str/config/
sdk_input_keys 全 PASS。
- 交叉 -Wall -Wextra 全 SDK TU 0 warning;qemu-mipsel 冒烟 PASS(mipsel FreeType 真光栅化)。
- meow_ui.a 新 md5 6ff5be9455f9e197b35fa120be012041(未重链不部署 App,四 App 免重链)。
MEOW_APP_SDK.md 补 §10.1 矢量字一节 + 公共头索引/§9 构建约定更新;.gitignore 忽略
patch_v2/sdk/vendor/ 与 test_meow_ui_ft 二进制。
|
2026-09-02 09:51:23 +08:00 |
|
AskaEth
|
121d30ec95
|
fix(audiod): 孤儿会话回收 — 客户端崩溃/被杀(sig=9)/正常退出后会话完整回收,STATE 回干净无流基线
根因: cli_free(EOF)与 STOP 路径只置 active=0 + 唤醒排空,未清 sid/written/played/underrun/
rms/peak/lvlseq——ncm 被内核 OOM 杀后面板 /api/overview audio 块残留(active=0 但 sid/统计挂着)。
修法: 两段式 session_end_locked(即时置死+清 sid/app_id,保留 rate/ch/fmt 供排空算 frame_size)+
session_clean_locked(播放线程排空完成后彻底归零 rate/ch/fmt/written/played/underrun/drop/stall/
rms/peak/lvlseq)。顺带修 dac_vol_set 一处 -Wmisleading-indentation。
宿主 51/51 PASS(47 既有 + T9 SIGKILL 孤儿回收断言 STATE 全清,模拟子进程崩溃). meow_audiod b122c9b8 交叉0warning
|
2026-09-02 09:32:48 +08:00 |
|
AskaEth
|
19f7e59927
|
docs: 仓库文档同步 M6.4(0.8.4)——README 版本行+新能力(SDK 演进批次/锁屏 PIN/面板批2+overview 自校验);SPEC_REF 补 SDK §3.5 扩展模块速查+system.pin 锁屏键+面板 batch2/UTF-8 加固
|
2026-09-02 09:12:56 +08:00 |
|
AskaEth
|
54e737a4a2
|
fix(panel): overview net 块括号配平(批2 DNS 并入时多写一个 },浏览器 Extra data 破页)+自校验换严格平衡检查(jv_parse 容忍尾随垃圾,浏览器不容忍)
|
2026-09-02 09:00:08 +08:00 |
|
AskaEth
|
524e5d6967
|
feat(panel): 前端 NOT_JSON 自动回传原始响应到 /api/debug/report_bad_json(落 /tmp/overview_client_bad.txt,抓浏览器收到的真实字节)
|
2026-09-02 08:39:29 +08:00 |
|
AskaEth
|
57676766c0
|
fw_content: M6.4 收编 launcher 56dac860(310二期 EVIOCGRAB 锁屏+名称截断)
|
2026-09-02 08:17:37 +08:00 |
|
AskaEth
|
bc9ba3693f
|
feat(panel web): NOT_JSON 错误日志补 响应长度+尾部 200 字节(定位截断点)
|
2026-09-02 08:16:57 +08:00 |
|
AskaEth
|
c730333776
|
fix(launcher): §310 追加两修——未冻结App锁屏输入穿透(独占触控) + 主界面应用名截断
真机 M6.3 反馈(bcef8e0 三连修复未好全,追加两问题):
P1 锁屏 PIN 输入穿透仍在(媒体保活 App 实时读 evdev)
根因:媒体保活 App(播放中)从不 SIGSTOP(保 PCM),SDK 输入线程实时读 evdev,不走缓冲。
bcef8e0 的「SIGCONT 排空」只作用于冻结 App;对未冻结 App,隔离全靠 /tmp/meow_notif_active
让 SDK 排空——若 App 的 meow_ui.a 缺该排空(或节流窗内漏网),锁屏期触摸依旧抵达 App。
修法:run_lock_screen() 与 lck_input_pin_modal() 打开 DEV_TOUCH 后 EVIOCGRAB 独占触控设备
(真机 goodix 实测 EVIOCGRAB 返回 0)——抓取期事件只投递抓取者、不为其它 fd 缓冲/回放,
故**任何**前台进程(冻结或未冻结)锁屏期都收不到触摸(真全模态)。失败时记日志降级
(仍靠标记+SIGSTOP 隔离)。overlay_gate.h 增 overlay_keepalive_needs_grab 判据。
P2 主界面应用名只显示 5 字(「流媒体客户」式,半字残形)
根因:app_launcher.c `strncpy(a->name, name, 16)` 仍把显示名硬截 16 字节——M6.3 只扩了
name[49]+json_str 整序列,漏改此二处。UTF-8 下 16B = 5 汉字 + 「端」首字节 + 无 NUL,
显示成「流媒体客户」+ 残形;main_menu.c menu_name_fit 按字节回退又停在半截字符、加 "..." 溢出。
修法:新增 meow_utf8.h(meow_utf8_char_len / meow_utf8_copy_bounded,纯决策可单测)——
app_launcher.c 两处 strncpy(16) 改 app_name_copy(=copy_bounded, 拷满 sizeof name=49);
menu_name_fit 改整字符前进 + 预留省略号宽度(mfont 用「…」/点阵用 "..."),总宽 ≤ maxw,
绝不劈开多字节字符。
新增 test_utf8_name.c(14 断言:整字符长/整序列有界拷贝,含 cap=16/17/12 边界不劈字)+
test_overlay_gate.c 扩展(S1b 未冻结 App 靠 EVIOCGRAB 隔离 4 断言)。launcher 全量宿主回归
+ SDK 叠加/状态栏/输入回归全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。
md5 56dac860841c3884b4322707246e22af(/usr/bin 只读,待固件打包 M6.4;fw_content.conf 未动)。
|
2026-09-02 08:13:55 +08:00 |
|
AskaEth
|
67aa5fc7a8
|
feat(panel): overview 自校验加严——内嵌 NUL/非法 UTF-8/strlen≠n 全拦并 dump /tmp/overview_bad.json(与浏览器 JSON.parse 对齐)
|
2026-09-02 08:12:47 +08:00 |
|
AskaEth
|
7a405866af
|
feat(panel web): 调试日志——api() 每请求计时/失败详录(NOT_JSON 附原始内容头 300B)+route 切换日志,控制台过滤 [mp]
|
2026-09-02 08:07:16 +08:00 |
|
AskaEth
|
908fc53805
|
feat(panel): /api/overview 服务端自校验——jv_parse 发出前自查,坏则 dump /tmp/overview_bad.json + 500(追查间歇性非 JSON 破页)
|
2026-09-02 07:56:04 +08:00 |
|
AskaEth
|
44a790dc1d
|
fix(ncm §33): 流媒专项批六项——流式SIGSEGV防御日志/档位保真(无损级必须flac+显示档按实际)/封面4xx不重试/收藏显隐/缓存命名迁移/topbar位图图标
- §2① ncm_api.c level_attempt: 无损级(hires/lossless及以上)命中必须 type=flac,返回 mp3 视为该档不可用续降
(修「hires 档静默给 mp3 被当命中」)
- §2② player_manager.c eff_level_for_resp: 显示档按响应实际格式/码率——mp3 绝不显示 Hi-Res(≤128k→标准, 否则极高),
flac 采信链 eff; br 未知钳 ≤EXHIGH
- §1 流式 SIGSEGV(《十面埋伏》sig=11) 审计+UBSAN 探针未复现 → 落地防御日志(dl start/done/interrupt + play done fin/exp/fail/underrun)
- §3 cover.c: download_cover 回填 rc/status; 确定性 4xx(404等)不重试立即跳下一张, 仅瞬时错误退避(rc=%d status=%d 日志)
- §4 playlist.c: pl_show_fav 我创建(is_collected==0)隐藏收藏钮, 我收藏保留, 搜索歌单保守显示(评论槽并入无空洞)
- §5 ncm_cache.c 双点→单点迁移 + player_manager song_local_file 旧键→当前档位键(不重下)
- §6 home.c: topbar 动作 ⚙↻⌕ 迁移 sb_icons 位图(meow_topappbar_set_item_icon, 修 4k 字库豆腐)
- 测试: test_ncm_core 新 test_grade_flac_gate + test_cache 双点迁移断言; degrade_sim/player_flow_sim 桩 flac 化
- 验证: stream/player_flow/window/search/cache_evict/degrade sim 全 PASS + test_ncm_core host+mipsel(qemu) + mem_sim + build_ncm.sh 0 warning
- 新 ncm md5 cb818786 (text 1017110/bss 1362500), 未部署留主会话; 0 真实 NCM 业务请求
|
2026-09-02 04:20:46 +08:00 |
|
AskaEth
|
68ce46a5d8
|
fix(ncm §32): 内存瘦身修 OOM 被杀 —— 封面降采样(8.28MB→0.78MB) + 瞬态 rbuf 缩减 + 线程栈显式
真机 dmesg 实锤:OOM Kill ncm (score 460, anon-rss 26.9MB, 设备 56MB)。
画像:封面全分辨率 RGBA 8.28MB(1448x1448 原生解码驻留) 是最大可控块。
瘦身(按收益排序):
1. sdk meow_ui_img 新增纯增量 meow_img_downscale + cover.c cover_cap(≤480px)
→ 封面 8.28MB→0.78MB,-7.65MB(mem_sim 实测 PASS)。
2. ncm_api.c 瞬态响应 rbuf:song_url→64KB、lyric/song_detail/cloudsearch/user_playlist→256KB
(detail/track_all 保 1MB)。
3. ncm_app_internal.h 新增 ncm_thread_create(显式 128KB 栈),替换全部 14 处 pthread_create。
4. 滑动窗口/meta 复核零回退(window_sim:608B/首,6000 首 280KB 恒定)。
验证:mem_sim 封面收益 PASS + host home/player 渲染 OK + stream_sim/player_flow_sim/
window_sim/search_sim/cache_evict_sim 全 PASS + test_ncm_core host+mipsel(qemu) PASS
+ build_ncm.sh -Wall -Wextra 0 warning。真机 scp 播放在跑确认(缓存曲,0 播放请求)。
新 ncm md5 44fa16fe(text 1015150/bss 1362500)。正式部署留主会话。
|
2026-09-02 03:43:42 +08:00 |
|
AskaEth
|
202caaf66b
|
fw_content: M6.3 收编 launcher 136dc67c(309 设置页5s+310 锁屏三连)
|
2026-09-02 03:43:12 +08:00 |
|
AskaEth
|
bcef8e092e
|
fix(launcher,lock): §310 锁屏/叠加三连 bug——输入穿透·状态栏消失·App死亡残影
用户真机 M6.2 实测三症状,全部位于锁屏/通知中心叠加路径。根因与修法:
S1 锁屏输入穿透(PIN 触摸打到下层 App / 解锁后「启动奇怪界面」)
根因:run_app_lock_overlay / run_app_notif_overlay 关闭路径先 unlink
/tmp/meow_notif_active 再 SIGCONT App——App 被 SIGSTOP 冻结期间缓冲的 evdev
触摸事件在解除瞬间被 SDK 输入线程在无隔离态回放成 App 内点击(穿透触发)。
修法:反序——标记仍在时先 SIGCONT,让 SDK 输入线程排空冻结期缓冲事件 +
EVIOCGKEY 对齐,等 OVERLAY_DRAIN_WINDOW_MS(300ms > SDK 200ms 节流) 再 unlink。
S2 解锁后状态栏消失(App 无状态栏全屏残留)
根因:S1 的回放点击常把 App 导航进全屏页(状态栏随 app.json/fullscreen 隐掉);
叠加关闭路径也未强制状态栏重同步。
修法:解锁后 g_sb_mode_last=-1 + 立即 app_overlay_statusbar() 重叠加(不等 1s 慢刷)。
S3 App 异常死亡(OOM sig=9)残影——fb0 停 App 死帧、无状态栏、launcher 不重绘主屏
根因:锁屏叠加(run_app_lock_overlay→run_lock_screen)阻塞于 lock_screen 内,
App 叠加期崩溃不被感知(notif 叠加有 run_notif_center 的 proc_is_zombie 探测,
锁屏独缺),launcher 卡在锁屏会话永不回 menu 重绘。
修法:run_app_lock_overlay 置位 g_lock_overlay_pid,run_lock_screen 每圈
proc_is_zombie 探测,App 死即中止锁屏(LCK_OVERLAY_RET_DIED)走统一退出路径
(reap_wait 回收 + ams_status_valid + break → run_menu 重绘主屏含状态栏)。
新增 overlay_gate.h(纯决策,宿主可单测)+ test_overlay_gate.c(10 断言)+
test_lock_screen.c 扩展(4 断言 overlay-abort)。launcher 全量宿主回归 +
SDK 叠加/状态栏回归(overlay_suppress/sb_collapse/notif_open/notif_gesture/
sdk_fixes/sdk_input_keys)全 PASS;mipsel 交叉 -Wall -Wextra 0 warning。
md5 136dc67c086a9d75c0ad9c83d519ff0d(/usr/bin 只读,待固件打包;fw_content.conf 未动)。
|
2026-09-02 03:41:39 +08:00 |
|
AskaEth
|
3611cbbbde
|
sdk: sb_icons 扩充动作图标 + TopAppBar 位图图标支持
TopAppBar 动作项此前用字体码点(⚙↻⌕)绘制,4k 字库无这些码点→豆腐。改走位图:
- sb_icons.h 追加 15 个 Material Symbols Rounded 动作位图(settings/refresh/search/
play_arrow/pause/skip_next/skip_previous/arrow_back/close/add/check/lyrics/
queue_music/download/heart),FILL=1 实心与状态栏一致;sb_icons[] 只追加(0-14 不变),
动作索引 15-29。
- 生成脚本 tools/gen_action_icons.py(cairosvg svg→32x32 单通道 alpha,SVG 缓存
icons_src/ 可复现、断网可跑)。
- meow_ui_gfx.c 抽取图标 blit 像素核心 icon_blit_px,新增 meow_gfx_blit_icon_ink
(控件路径不标顶栏脏区);meow_gfx_blit_icon 状态栏路径行为不变。
- meow_ui_widget.c W_TOPAPPBAR 项支持位图模式:新 API meow_topappbar_set_item_icon
(w, idx, icon_idx),绘制取主题 onSurface/按压向栏底色淡 12%,文本项行为不变;
hit 用统一项宽。
- 公共头 widgets.h 加 MEOW_ICON_*(15-29) 枚举与 set_item_icon 声明;internal.h 声明
meow_gfx_blit_icon_ink。
- 宿主测试(test_meow_ui_widgets)加 topbar 位图图标绘制/命中/按压变淡 + 状态栏 blit
回归断言;test_umbrella 加 MEOW_ICON_* 编译期锁;MEOW_APP_SDK.md 补说明+索引表。
- 验证:宿主测试 ALL PASS(14项);交叉 zig 构建 0 warning;meow_ui.a 新 md5
1d69cdae55ab5dde3a98f5e2124f3656。
|
2026-09-02 03:24:46 +08:00 |
|
AskaEth
|
41427fdcb3
|
launcher: 进设置页不再同步跑串行网络 popen 与逐套字体 sha256(点设置卡≥5s 修复)
- 设置页入口 s_net_sync_from_sys() 改为 toggle 同步(快)+异步 s_net_refresh_kick();
wifi/bt 状态与列表由 run_settings_page 主循环逐步骤 s_net_refresh_pump() 填充
(每步一个带超时 popen、~150ms 一步),draw 用 g_net_* 缓存,数据变化即 need_paint
→ 入口不再被 wpa_cli/bluetoothctl/hcitool 5 条串行 popen(各 1.2~2.5s 有界超时)拖住。
- 进设置页字体重扫 meow_font_scan_presets(0) 跳过逐套 sha256(gbk/full 套数 MB,
逐套双 sha256 真机耗数秒,入口卡顿主因之一);完整性校验保留给启动/热插拔全量(verify=1)。
- s_net_refresh() 保留同步语义(kick+drain) 供通知中心等调用方;WiFi/BT 子页返回、
网络下拉后改 kick(由主循环承担异步填充)。
- 设置入口加毫秒级分段日志(font rescan / net toggle-sync+kick / page shown)供真机取证。
- 交叉 -Wall -Wextra 0 warning;launcher 宿主测试全 PASS。launcher md5 fbc78c62
|
2026-09-02 03:18:36 +08:00 |
|
AskaEth
|
0294553096
|
reader(R2): EPUB/FB2/MOBI/CBZ 加载器落地
- rdsrc 统一文档源抽象:TXT/FB2/EPUB/MOBI/CBZ 都产出「UTF-8 段序列+目录+元数据+图片」,
与 R1 rdtxt 段契约一致;book.c 改喂 rd_src(文本)或图页(CBZ)。
- EPUB:miniz 解 ZIP → 自写 rdxml 回调解析 OPF(spine/manifest)+NCX/nav → 正文 XHTML 用
rdhtml 逐行粗解析(坏标签/未闭合/实体容错,不建 DOM),章节按 RDSRC_SEG_MAX 分片。
- FB2:rdxml 严格解析抽 section 段落 + base64 内嵌图;段题进正文+目录。
- MOBI/AZW3:vendor libmobi 最小调用面(mobi_init→load→parse_kf7/8→parse_rawml_opt→
flow/resources),HTML 走 rdhtml 同款粗解析;LGPL-3.0 合规见 NOTICE(版权+全文+锁定 commit)。
- CBZ:miniz 解 ZIP → 自然序图片序列,rdimg(stb_image) 解码+降采样,阅读页图页模式。
- 目录显示与跳转(EPUB NCX/FB2 section/MOBI 标题);书架开放四格式;进度按
(段,字符偏移)(TXT/FB2/EPUB/MOBI)/页号(CBZ)。
- 宿主单测 loaders_smoke(四格式抽取/目录/图片/base64/页序)+ qemu-mipsel
formats_smoke/book_smoke;R1 test_reader_core 58/0 不回归。
- build_reader.sh 集成 miniz/libmobi/stb/zlib 头;NOTICE 入仓;交叉 -Wall -Wextra 0 warning。
新 reader md5: e29036599300eb277b1c960a75b65dbf
|
2026-09-02 03:11:55 +08:00 |
|
AskaEth
|
10690bc348
|
fix(ncm §31): 修两处 UI 数据竞态——返回首页行空白(staging发布) + 进第二个歌单显示上一歌单(换歌单清窗)
A. 返回首页各行 2~3s 空白:appstate_load_playlists 就地 memset(g_st.playlists[])
与 home_src2 无锁逐行绑定竞态,刷新期间 playlist_count 保留旧值 → UI 读清零行。
照搬 s_build[] staging 范式:网络落 s_pls[] → 成功后锁内原子发布(拷回+更新count),
失败保留旧快照(断网离线浏览)。绝不就地清零 UI 可见数组。
B. 进第二个歌单显示上一歌单:playlist_open/refresh 同步路径不调 appstate_playlist_reset,
pl_apply(1) 绑到上一歌单残留窗口(track_ids_count/songs)。
新增窗口归属(歌单 id 唯一标识, 对搜索歌单同样成立): worker 首屏发布后
appstate_playlist_window_set;refresh 目标≠归属(窗口is) → 同步 reset 再 pl_apply。
同歌单手动刷新(id 同)保留旧内容(stale-while-revalidate)。
宿主回归:playlist_race_sim(新 F 并发读无清零态/G 开A→开B 不串)、window/search/
cache_evict/player_flow/stream_sim、test_ncm_core 宿主+mipsel 全 PASS;
build_ncm.sh -Wall -Wextra 0 warning;0 真实请求;未部署。
|
2026-09-02 03:03:48 +08:00 |
|
AskaEth
|
97b741cf56
|
fix(ncm): 播放路径接通 auto_av(300 的降级链接线,修「SQ 被跳过掉标准」真机路径)
|
2026-09-02 02:48:43 +08:00 |
|
AskaEth
|
33414de7c4
|
fix(ncm §20.3): 降级链账户/fee感知 auto_av —— 修「SQ 被跳过掉标准」(297)
根因:ncm_api_song_url_auto 无账户感知,依赖调用方按会员钳顶;若账户 VIP 态未就绪/
错钳到 EXHIGH,降级链从 EXHIGH 起步,LOSSLESS(无损 SQ) 被跳过,直接掉「标准」。
修法:新增 ncm_api_song_url_auto_av[_f](§20.3 权威形态):fee∈{1,4} 且非 CVIP →
NCM_ERR_VIP 零请求;按 account_vip 自钳顶(NONE→EXHIGH/CVIP→HIRES/SVIP→SURROUND);
只试账户可访问档(ncm_api_level_gate<=vip);落在最近可用档。原 auto/auto_f 行为零回归。
逐级尝试重构为共享 level_attempt(type/url 接受+静默降档采信)。
测试(bench/degrade_sim.c):fee门禁5例 + auto_av矩阵 vip3×desired9×avail9=243例全PASS
+ 真机复现(CVIP+Hi-Res+有SQ无HiRes→落无损SQ flac);原90例零回归。
验证:test_ncm_core_host+qemu-mipsel 全PASS;build_core/build_ncm -Wall -Wextra 0 warning。
新 ncm md5 1064a1d686390cc159f18296ee2980ee(未部署,留主会话)。
遗留:player_manager.c 仍调 auto(不传vip/fee),应改请 auto_av(account_vip()+fee);
真机若仍掉标准需另查旧缓存 song_<id>_hires.mp3 复用或旧二进制。
|
2026-09-02 02:41:09 +08:00 |
|
AskaEth
|
55f0dfe91d
|
M6.2 备料: S89 amsd.conf 热更 exec→/usr/bin 迁移; fw_content 收编 launcher 03dfcf76(锁屏+门控+名字)/amsd 026cad52(UTF-8 名字)/S89 a1ef9d65
|
2026-09-02 02:39:11 +08:00 |
|
AskaEth
|
54857bc0fd
|
sdk(ui): 字符串资源外置(i18n 雏形 §13)—— meow_str_* + 内嵌双语表 + TF 覆盖表 + 控件接入
公开 SDK 前把 SDK/App 硬编码文案外置:新增 meow_str/meow_strf/meow_str_set_locale/
meow_str_locale,按当前 locale 取串(永不 NULL),第三方开发者可做多语言。
- 新增 include/meow_ui_str.h + meow_ui_str.c:取串优先级 = TF 覆盖表 > 内嵌当前语言
(en_us→en 其余→zh) > 内嵌内置默认(zh_cn) > 原样返回 id。内嵌双语表(common.* 21 条 +
ime.* 9 条);热路径零 malloc(编译期静态表 + ≤256 静态覆盖数组);纯 libc 宿主可单测。
- locale 存系统设置 settings.conf 的 ui.locale(默认 zh_cn,首次调用惰性读取);
meow_str_set_locale 即时切换 + 重载覆盖表 + best-effort 持久化(流式改写保留其它行)。
- TF 覆盖表 MeowData/<pkg>/strings/<locale>.txt(id=text 行,UTF-8,'=' 两侧去空白);
无卡/无文件/无该 id → 回落内嵌。meow_strf 用调用方缓冲(snprintf 语义,重入安全)。
- SDK 控件接入:dialog 默认按钮 OK/CANCEL + INPUT 占位、IME 键面/徽标(空格/确定/拼英/
?123/清/拼音/(无候选)/中)改走 meow_str;空态/加载态给 App 提供 common.no_data/loading。
- 测试:新增 test_meow_ui_str.c(内嵌回退/TF 覆盖优先级/未知 id 回退/切 locale 即时生效/
查找正确性/meow_strf,tmp+env 两模式);全量宿主回归(widgets/dispatch/box/anim/scroll/
listvirt/theme/ime_fix/pinyin/overlay/notif/sdk_input_keys/p1p2p3/config/vol/sb_collapse/
notify_*) 0 回归;交叉 zig-mipsel -Wall -Wextra 0 warning。
- 文档:MEOW_APP_SDK.md 新增 §13(字符串资源/i18n,遗留顺延为 §14);docs/APP_DEV_GUIDE.md
新增 §7.11。各宿主 test_*.c 头注释补 meow_ui_str.c 编译依赖。
边界(§13.7):仅 zh_cn/en_us 整串取用;不做复数规则 / BiDi / RTL / 动态字体回退(雏形)。
|
2026-09-02 02:37:38 +08:00 |
|
AskaEth
|
d7bf62f448
|
fix(meowpanel §UTF-8): JSON 输出 UTF-8 加固——sA_str 统一消毒非法/截断字节,防任一上游坏字节拖垮整页
事故:amsd 的 am list 把「流媒体客户端」(18B) 截成 16B,腰斩「端」字(E7 AB AF→仅剩 E7) →
面板 ams_fill 把非法 UTF-8 嵌进 /api/overview → 浏览器 JSON.parse 拒收(HTTP 200 非 JSON)。
amsd 侧已修(8588a6b),面板侧自此防住任一上游再产坏字节,一个源的坏数据不拖垮整页。
- meowpanel.c: 新增 utf8_seq_len/utf8_seq_ok/utf8_valid_n/utf8_sanitize(C 无依赖);sA_str 收口为
sA_str_n:逐字节校验 UTF-8,合法序列透传、非法/截断逐字节回退 '?'(保持长度);纯 ASCII 单遍直通。
- 覆盖点(全部经 sA_str/sA_str_n):ams_fill(pkg/name)、svcd_fill(name/exec/state/...)、audio_fill(app/fmt/route_mode)、
/api/apps(app.json name/pkg/ver/exec)、字体名、通知字段、崩溃/日志中心字段、设置/主题串等。
- 两处日志内联转义(api_net_log、api_logs_read)改走 sA_str_n,日志行同样消毒。
- 原始 IPC JSON(perf/power/net,含 ssid)先 utf8_valid_n 校验:坏字节时 perf/power/net/status 降级
available:false / 503,不嵌坏字节(api_overview 首页生命线不受影响;api_system network 段坏字节回退 hostname_local)。
- 宿主自测 `--selftest`:喂「流媒体客户\xE7」给 utf8_sanitize/sA_str/ams_fill 桩,断言 JSON 完整可解析 + 无非法字节,
且不误改完整合法名「流媒体客户端」;`meowpanel --selftest` 通过。
- 验证:build_meowpanel.sh host / 交叉均 -Werror 0 warning;真实 ams_fill 桩复现事故 → 「流媒体客户?」JSON 合法。
- 后端 meowpanel(mipsel) md5: 820b24541ed69f2e27e4a301aff10c98(README 已校正)
|
2026-09-02 02:32:25 +08:00 |
|
AskaEth
|
3397a702aa
|
fix(ncm §30): 真机四连症状——JSON unescape + 封面流式 + 歌单豆腐/分隔符 tofu + 首屏诊断日志
症状/根因/修法(0 真实 NCM 业务请求;宿主+qemu 全绿):
- ③ LRC 挤一行/时间戳未解析:ncm_json_get_str_at 不做 JSON 转义还原,
lrc.lyric 的 \n 转义原样进串 → lrc_parse 无真实换行整段一行。修:ncm_json.c 加
json_unescape(RFC8259 全转义 + \uXXXX/代理对),get_str_at 返回前还原。
- ⑤ 封面全 failed→give up:cover.c 静态 g_buf 288KB < 封面 1.34MB → NCM_ERR_FULL。
设备 RAM 仅 56MB。修:cover.c 改流式写文件(ncm_http_download cb→ncm_cache_write +
meow_img_load_file 临时文件),NCM_COVER_MAX 8MB 改下载上限(非缓冲,bss 未涨)。
- ① 162 首歌单所有条目「三个豆腐」+「加载中」:占位符 ···(U+00B7)在 default 字体缺
该字形 → 3 豆腐(font.idx glyph 扫实证 U+00B7 MISSING)。修:占位 ···→...、全 App
· 分隔符→/;playlist_worker 首屏打 first-screen 诊断日志。
- ② 返回首页歌单列表 1 秒方框:字体缺 U+00B7/特殊字形(◢◤/Kannada)tofu;瞬态疑 glyph
atlas 冷缓存(SDK 内部未深挖)。修:·→/。
验证:test_ncm_core(+test_json_unescape, host+qemu) / listvirt44 / dispatch / box42 /
scroll17 / anim32 / widgets / overlay_suppress / sdk_input_keys / theme / vol / ime_fix /
pinyin / notif_gesture / notif_open / sdk_fixes / sb_collapse / ui_audio_host / notify_ipc /
notify_integration + playlist_race_sim / window_sim / search_sim / cache_evict_sim(1-9) /
player_flow_sim(P1-12) / stream_sim(16+2resume) 全 PASS;mipsel -Wall -Wextra 0 warning。
新 md5:ncm d91cd906、ncm_host b731654a、test_ncm_core_host 7a38194c。
(症状④ VOL_DOWN×3 杀 App 的 launcher 源修复 app_launcher.c 门控 !a->framework 已随
并发 commit 54a6e82 存入 HEAD;launcher 二进制 03dfcf76 留主会话/固件打包。)
注:build_ncm_host.sh 补 SDK 292/295 的 anim/box/scroll 源(宿主链接)。
|
2026-09-02 02:25:37 +08:00 |
|