feat(launcher): 媒体会话+Now Playing (agent-204) — MSG_META(0x72)/MSG_PLAYCTL(0x73)+meow_media.c(最近活跃源=active_seq净序,30s超时回收); 通知中心顶部媒体卡片(封面缓存+进度seek+控制键); 主界面中部/右缘左滑进 Now Playing 大页(封面+元数据+进度+控制+歌词占位), 左缘返回; 空态完备
launcher a42171a1→ddfe616e; 宿主 test_media ALL PASS + qemu 端到端(META注册→PLAYCTL下发闭环) 出入: 卡片以媒体会话为权威非通知; PLAYCTL 走会话fd(断连防御留后续)
This commit is contained in:
1 parent
8012948b26
commit
32543ac616
15 files changed
+1429
-34
No files matched your search
@@ -825,6 +825,7 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
/* 阶段 D · M0:菜单/主屏循环内排空 IPC(非阻塞;应用可随时查询/声明路由) */
|
||||
meow_ipc_process();
|
||||
meow_notif_tick(); /* M2a:通知 TTL 10s 转储(§8)*/
|
||||
meow_media_tick(); /* 阶段D附录B:媒体源死亡(播放中无 META 超时)清槽回空态 */
|
||||
|
||||
/* sim hooks */
|
||||
if (sim_tap_ms > 0 && !sim_tap_done && el >= sim_tap_ms) {
|
||||
@@ -1104,7 +1105,15 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
* 已删;如需物理启动应用,可后续加「长按播放键」,本轮不做。) */
|
||||
if (play && !m_prev_play) {
|
||||
any_input = 1; /* 仍视为输入(重置息屏计时);不再 launch_app */
|
||||
logmsg("play key: media-reserved (no menu confirm)");
|
||||
/* 阶段D附录B:媒体键路由到最近活跃媒体会话(播放/暂停切换)。无源=打点。 */
|
||||
const meow_media_session_t *ms = meow_media_current();
|
||||
if (ms) {
|
||||
uint32_t cmd = (ms->state == MEOW_MEDIA_PLAYING) ? 2u /* 暂停 */ : 1u /* 播放 */;
|
||||
int rc = meow_media_playctl(cmd, 0);
|
||||
logmsg("play key: media control -> cmd=%u rc=%d (%s)", cmd, rc, ms->app_id);
|
||||
} else {
|
||||
logmsg("play key: media-reserved (no media source)");
|
||||
}
|
||||
}
|
||||
m_prev_vold = vold; m_prev_volu = volu; m_prev_play = play;
|
||||
|
||||
@@ -1296,7 +1305,31 @@ static void run_menu(struct app apps[MAX_APPS], int napps, int state,
|
||||
continue; /* 本圈不再按 tap/其余处理 */
|
||||
}
|
||||
/* M2.23 滑动不启动:抬手位移 >= 阈值 → 判为滑动,不 launch、
|
||||
* 不进行行判定(为将来左右滑切屏预留;本轮只判滑动、不打事件)。 */
|
||||
* 不进行行判定(为将来左右滑切屏预留;本轮只判滑动、不打事件)。
|
||||
* 阶段D附录B:主界面「右缘/中部向左横滑」→ 进入 Now Playing 大页。
|
||||
* 手势分流(MEOW_APP_SDK §5.2):顶部下滑=通知中心(已在上方处理)、
|
||||
* 左缘右滑=返回(左缘起点不至此),此处只接管「中部/右缘向左」横滑。 */
|
||||
if (dx <= -MENU_SWIPE_THRESH && adx > ady &&
|
||||
tx >= MEOW_EDGE_W && ty >= SB_BAR_H) {
|
||||
logmsg("menu: left-swipe -> Now Playing (dx=%d,dy=%d)", dx, dy);
|
||||
menu_arm_touch(TAP_ARM_DELAY_MS);
|
||||
run_now_playing();
|
||||
/* 重播按键防抖基线,防播放页内电源/音量边沿被 run_menu 误判 */
|
||||
memset(&kd_pwr, 0, sizeof kd_pwr);
|
||||
memset(&kd_vold, 0, sizeof kd_vold);
|
||||
memset(&kd_volu, 0, sizeof kd_volu);
|
||||
memset(&kd_play, 0, sizeof kd_play);
|
||||
kp_poll(&kp_power, NULL, NULL);
|
||||
kp_poll(&kp_keys, NULL, NULL);
|
||||
m_prev_pwr = kp_is_down(&kp_power, KEY_POWER);
|
||||
m_prev_vold = kp_is_down(&kp_keys, KEY_VOLUMEDOWN);
|
||||
m_prev_volu = kp_is_down(&kp_keys, KEY_VOLUMEUP);
|
||||
m_prev_play = kp_is_down(&kp_keys, KEY_PLAYPAUSE);
|
||||
last_input_ms = now_ms();
|
||||
menu_arm_touch(800);
|
||||
dirty = 1;
|
||||
continue;
|
||||
}
|
||||
if (adx >= MENU_SWIPE_THRESH || ady >= MENU_SWIPE_THRESH) {
|
||||
logmsg("menu swipe (dx=%d,dy=%d) — no launch", dx, dy);
|
||||
} else if (tx >= 0 && ty >= 0) {
|
||||
|
||||
Reference in new issue
Block a user