feat(media): 批3歌词数据源框架 — meow_media_session扩实时歌词(lrc/tlrc/seq)+MSG_META_LYRIC上报分片+ncm上报+launcher读meow_media_lyric_* 接批1/2;宿主L1-L7全过/ncm热更27554dd8,launcher待固件收编
This commit is contained in:
1 parent
7ca3e5bd84
commit
2e5b814059
8 files changed
+363
-4
No files matched your search
@@ -197,13 +197,74 @@ uint32_t meow_media_display_pos(const meow_media_session_t *s)
|
||||
return p;
|
||||
}
|
||||
|
||||
/* 把一帧歌词分片写入会话缓冲(kind=0 lrc / kind=1 tlrc)。含分片边界截断(不越界)。
|
||||
* 返回 0=写入;-1=参数非法。 */
|
||||
static int lyric_put(meow_media_session_t *s, const m_lyric_t *l)
|
||||
{
|
||||
if (!s || !l) return -1;
|
||||
char *buf;
|
||||
uint32_t cap;
|
||||
uint32_t *lenp;
|
||||
if (l->kind == 0) { buf = s->lyric_lrc; cap = MEOW_MEDIA_LRC_MAX; lenp = &s->lyric_lrc_len; }
|
||||
else if (l->kind == 1) { buf = s->lyric_tlrc; cap = MEOW_MEDIA_TLRC_MAX; lenp = &s->lyric_tlrc_len; }
|
||||
else return -1;
|
||||
uint32_t off = l->off, n = l->len;
|
||||
if (off >= cap) { off = cap; n = 0; } /* 起始越界:整片丢弃 */
|
||||
if (n > cap - off) n = cap - off; /* 末段越界:截断到缓冲上限 */
|
||||
if (n) memcpy(buf + off, l->data, n);
|
||||
buf[off + n] = 0; /* 恒 NUL 结尾(供字符串读取) */
|
||||
uint32_t end = off + n;
|
||||
if (end > *lenp) *lenp = end;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int meow_media_lyric(const m_lyric_t *l)
|
||||
{
|
||||
if (!l || !l->app_id[0]) return -1;
|
||||
meow_media_session_t *s = sess_find(l->app_id);
|
||||
if (!s) {
|
||||
/* 会话须先经 META 注册(否则 fd=0,PLAYCTL 会误发到 0 号描述符);丢弃。 */
|
||||
media_log("media: lyric drop app=%s (no session; report META first)", l->app_id);
|
||||
return -1;
|
||||
}
|
||||
/* 新代际(换歌/换词):清旧词缓冲,重开分片写入。 */
|
||||
if (l->seq != s->lyric_seq) {
|
||||
s->lyric_seq = l->seq;
|
||||
s->lyric_lrc_len = 0;
|
||||
s->lyric_tlrc_len = 0;
|
||||
s->lyric_lrc[0] = 0;
|
||||
s->lyric_tlrc[0] = 0;
|
||||
}
|
||||
lyric_put(s, l);
|
||||
media_log("media: LYRIC app=%s seq=%u kind=%u total=%u off=%u len=%u lrc=%u tlrc=%u",
|
||||
s->app_id, l->seq, l->kind, l->total, l->off, l->len,
|
||||
s->lyric_lrc_len, s->lyric_tlrc_len);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int meow_media_lyric_valid(const meow_media_session_t *s)
|
||||
{
|
||||
return (s && s->used && s->lyric_lrc_len > 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
const char *meow_media_lyric_lrc(const meow_media_session_t *s)
|
||||
{
|
||||
return (s && s->used) ? s->lyric_lrc : "";
|
||||
}
|
||||
|
||||
const char *meow_media_lyric_tlrc(const meow_media_session_t *s)
|
||||
{
|
||||
return (s && s->used) ? s->lyric_tlrc : "";
|
||||
}
|
||||
|
||||
void meow_media_dump(const char *prefix)
|
||||
{
|
||||
for (int i = 0; i < MEOW_MEDIA_MAX; i++) {
|
||||
if (!g_sess[i].used) continue;
|
||||
media_log("%s sess%d app=%s state=%u fd=%d last=%llu pos=%u/%u title=\"%s\"",
|
||||
media_log("%s sess%d app=%s state=%u fd=%d last=%llu pos=%u/%u title=\"%s\" lyric=%u",
|
||||
prefix ? prefix : "media", i, g_sess[i].app_id, g_sess[i].state,
|
||||
g_sess[i].fd, (unsigned long long)g_sess[i].last_active_ms,
|
||||
g_sess[i].pos_ms, g_sess[i].dur_ms, g_sess[i].title);
|
||||
g_sess[i].pos_ms, g_sess[i].dur_ms, g_sess[i].title,
|
||||
(unsigned)(g_sess[i].lyric_lrc_len > 0 ? 1 : 0));
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user