- 解码分发 decoder.c:magic(fLaC→dr_flac / 其它→minimp3);flac ≤16bit→S16、 >16bit→S32 满幅送 audiod(AUDIO_FMT_S32),rate/ch/bits 按实际流,零 SRC 零裁剪 - song_url_auto 接受 flac(type 权威/url 扩展名兜底),降级语义不变;flac 下载限幅 1GB - 缓存键 song_<id>_<level>.<ext>:同歌同档命中不重下,换档新条目旧档留 LRU; ext 前导点正名(修双点名),lookup 回退历史双点名+旧无档键温和兼容 - audio_out S32 通路(AUDIOD/ALSA/WAV)+ 流死重开按 bits 还原格式 - 验证(0 真实请求):44.1k/16 与 96k/24 自制样本宿主+qemu 帧数/时长精确、 逐样本零误差;mp3 回归逐帧一致;player_flow_sim P1-P6(新 P6 档位键/flac ext)、 cache_evict/cover/pagination/window/audiod_chain sim 全 PASS;mipsel 0 warning - REPORT §19 / VENDOR_NOTES dr_flac 条目;未部署真机(留主会话)
35 lines
1.6 KiB
C
35 lines
1.6 KiB
C
/* play/decoder.h — 格式分发解码(REPORT §19):按文件 magic 选后端。
|
||
* "fLaC" → dr_flac(无损 SQ / Hi-Res,vendor/dr_flac.h)
|
||
* 其它(ID3 / 0xFF 帧同步 / 未知)→ minimp3(既有 mp3 路径,未知格式由 minimp3 兜底报错)
|
||
* 输出约定:bits<=16 → 交织 S16;bits>16 → 交织 S32(dr_flac s32 左对齐满幅,送 audiod
|
||
* AUDIO_FMT_S32,AUDIOD_DESIGN.md §4 格式归一由 SDK/audiod 完成,本层不做 SRC/裁剪)。
|
||
*/
|
||
#ifndef NCM_DECODER_H
|
||
#define NCM_DECODER_H
|
||
|
||
#include <stdint.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
typedef struct ncm_decoder ncm_decoder_t;
|
||
|
||
/* 打开并探测流参数:rate/ch/bits/total_frames 经指针回填实际值(mp3 恒 16bit;
|
||
* total_frames 0=未知)。返回 0=成功。 */
|
||
int ncm_dec_open(ncm_decoder_t **out, const char *path,
|
||
int *rate, int *ch, int *bits, int64_t *total_frames);
|
||
/* 读最多 cap_frames 帧到 buf(交织,样本位宽=open 返回的 bits;cap 以帧计,
|
||
* buf 容量须 ≥ cap_frames*ch*(bits/8))。返回实际帧数,0=EOF。 */
|
||
int64_t ncm_dec_read(ncm_decoder_t *d, void *buf, int64_t cap_frames);
|
||
/* seek 到 ms。flac=精确 PCM 帧;mp3=按 file_bytes*ms/dur_ms 字节近似(同旧语义)。 */
|
||
int ncm_dec_seek_ms(ncm_decoder_t *d, int64_t ms, int64_t file_bytes, int64_t dur_ms);
|
||
void ncm_dec_close(ncm_decoder_t *d);
|
||
/* "mp3" / "flac"(日志/UI 用)。 */
|
||
const char *ncm_dec_format(const ncm_decoder_t *d);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* NCM_DECODER_H */
|