feat(ncm §21): 边下边播阶段1+2——stream_src流式源+decoder双路open_cb+下载线程预缓冲/stall联动+P2 HTTP空闲超时+cache fd写者+stream_sim全矩阵PCM金标准(0真实请求,未部署)
This commit is contained in:
1 parent
dbee37e1d6
commit
9e25db77cc
18 files changed
+1335
-136
No files matched your search
@@ -17,12 +17,16 @@
|
||||
* -Icore -Ivendor/jsmn -c bench/player_flow_sim.c -o /tmp/pf.o
|
||||
* gcc -O2 -ffunction-sections -DJSMN_HEADER -I. -I../sdk -I../meow_launcherd \
|
||||
* -Icore -Ivendor/jsmn -Ivendor/minimp3 -Ivendor/dr_flac -c app/play/player_manager.c -o /tmp/pf_pm.o
|
||||
* gcc -O2 -Wl,--gc-sections -o player_flow_sim /tmp/pf.o /tmp/pf_pm.o -lpthread -lm
|
||||
* gcc -O2 -ffunction-sections -DJSMN_HEADER -I. -I../sdk -I../meow_launcherd \
|
||||
* -Icore -c app/play/stream_src.c -o /tmp/pf_ss.o
|
||||
* gcc -O2 -Wl,--gc-sections -o player_flow_sim /tmp/pf.o /tmp/pf_pm.o /tmp/pf_ss.o -lpthread -lm
|
||||
* 运行:./player_flow_sim (0 网络;PASS/FAIL 退出码)
|
||||
* §19:P6 覆盖缓存键=歌曲ID+档位 + flac type → .flac 落盘扩展名。
|
||||
* §20:P7 覆盖 VIP 钳顶(非会员用户档 SURROUND → 请求档 EXHIGH,缓存键仍用户档 sky_c51;
|
||||
* SVIP 直达)+ eff_level 回填;P8 覆盖 fee 门禁(fee=1 非会员 NCM_ERR_VIP 零请求 /
|
||||
* 缓存命中绕过 / CVIP 放行 / fee=8 放行)。
|
||||
* §21:边下边播——下载线程走 stub http_download(经真实 stream_src 预缓冲门槛),
|
||||
* 解码器 stub 换 ncm_dec_open_src。
|
||||
*/
|
||||
#include "../app/ncm_app_internal.h"
|
||||
#include "../app/play/decoder.h"
|
||||
@@ -95,15 +99,20 @@ int ncm_cache_lookup(const ncm_cache_t *c, const char *id, const char *ext, char
|
||||
snprintf(out, out_sz, "/tmp/pf_sim.mp3");
|
||||
return NCM_OK;
|
||||
}
|
||||
static char g_tmp_path[] = "/tmp/pf_sim_dl.tmp"; /* 下载路径 stub 的 .tmp(§21:stream_src 要真实打开) */
|
||||
int ncm_cache_open(const ncm_cache_t *c, const char *id, const char *ext, ncm_cache_writer_t **w)
|
||||
{
|
||||
(void)c;
|
||||
snprintf(g_last_key, sizeof g_last_key, "%s", id);
|
||||
snprintf(g_last_ext, sizeof g_last_ext, "%s", ext ? ext : "");
|
||||
FILE *f = fopen(g_tmp_path, "wb"); /* 建空 .tmp:stream_src_open_stream 需存在 */
|
||||
if (f) fclose(f);
|
||||
*w = (ncm_cache_writer_t *)calloc(1, 64); return NCM_OK;
|
||||
}
|
||||
const char *ncm_cache_writer_tmp_path(const ncm_cache_writer_t *w) { (void)w; return g_tmp_path; }
|
||||
int ncm_cache_write(ncm_cache_writer_t *w, const unsigned char *d, size_t l) { (void)w; (void)d; (void)l; return NCM_OK; }
|
||||
int ncm_cache_commit(ncm_cache_writer_t *w) { free(w); g_cache_ok = 1; return NCM_OK; }
|
||||
static int g_commits; /* §21:commit 移到曲尾 dispose(边下边播),P7 等收尾用 */
|
||||
int ncm_cache_commit(ncm_cache_writer_t *w) { free(w); g_cache_ok = 1; g_commits++; return NCM_OK; }
|
||||
int ncm_cache_abort(ncm_cache_writer_t *w) { free(w); return NCM_OK; }
|
||||
int ncm_cache_evict(const ncm_cache_t *c) { (void)c; return NCM_OK; }
|
||||
void ncm_cache_set_limit_gb(ncm_cache_t *c, int gb) { (void)c; (void)gb; }
|
||||
@@ -139,16 +148,16 @@ int ncm_http_download(const ncm_http_req_t *req, ncm_http_write_cb cb, void *ctx
|
||||
return NCM_OK;
|
||||
}
|
||||
|
||||
/* ---- 解码器 stub(§19:player_manager 改走 ncm_dec_* 分发层):
|
||||
/* ---- 解码器 stub(§19:player_manager 走 ncm_dec_* 分发层;§21:open 改 ncm_dec_open_src):
|
||||
* g_eof 前恒有数据(P1 用 g_reads_left 控制播完点) ---- */
|
||||
static int g_eof;
|
||||
static int g_reads_left = -1; /* >=0: 剩余读次数后 EOF;-1: 直到 g_eof */
|
||||
static int g_dec_open_bits = 16; /* 模拟流位宽(记录用) */
|
||||
|
||||
int ncm_dec_open(ncm_decoder_t **out, const char *path, int *rate, int *ch, int *bits,
|
||||
int64_t *total_frames)
|
||||
int ncm_dec_open_src(ncm_decoder_t **out, stream_src_t *src, int *rate, int *ch, int *bits,
|
||||
int64_t *total_frames)
|
||||
{
|
||||
(void)path;
|
||||
(void)src;
|
||||
*out = (ncm_decoder_t *)calloc(1, 16);
|
||||
if (rate) *rate = 44100;
|
||||
if (ch) *ch = 2;
|
||||
@@ -347,7 +356,16 @@ int main(void)
|
||||
"eff_level=%d (expect EXHIGH,UI 标「已降级至 极高 HQ」)", player_manager_eff_level());
|
||||
CHECK(strcmp(g_last_key, "1000_sky_c51") == 0,
|
||||
"cache key=%s (expect 1000_sky_c51 = id+用户档,降级产物归用户档键)", g_last_key);
|
||||
/* SVIP:同一用户档不钳顶,直达 SURROUND */
|
||||
/* SVIP:同一用户档不钳顶,直达 SURROUND。
|
||||
* §21 时序:commit 移到 song0 曲尾 dispose(边下边播)——先 stop 阻断外层自动顺延
|
||||
* 到 song1 的竞态,再等 commit 落地后才切缓存开关,否则 commit stub 会把
|
||||
* g_cache_ok 重新置 1 / 自动顺延的 song1 会先发出请求 → 断言读数被污染。 */
|
||||
g_eof = 1;
|
||||
player_manager_stop();
|
||||
{
|
||||
int cb = g_commits;
|
||||
for (int t = 0; t < 3000 && g_commits == cb; t += 10) usleep(10 * 1000);
|
||||
}
|
||||
g_vip = NCM_VIP_SVIP; g_cache_ok = 0; g_url_calls = 0; g_url_req_level = -1;
|
||||
player_manager_play(1);
|
||||
CHECK(wait_state(NCM_PC_PLAYING, 3000), "svip song playing");
|
||||
|
||||
Reference in new issue
Block a user