我有一个程序读取
4096 frames (16384 bytes)
16bit LE
48000 Hz
PCM
每次从内核模块“读取”到一个 16384 字节的大缓冲区(= 从 ALSA 的环形缓冲区读取)。
每次“读取”后,我必须将 48 kHz 下采样到 44.1 kHz,并且输出必须更小/等于 4096 帧(流式传输到 Apple 的 Airport Express)。
它已经工作了,但是输出听起来“太快”并且“闪烁”(我认为是由于“读取”中的帧丢失,如下所述),然后有时会停止(我认为“太快”会导致“等待数据” )。
对于重采样,我使用libsamplerate中的src_process(又名 Secret Rabbit Code):
int src_process (SRC_STATE *state, SRC_DATA *data) ;
具有以下参数:
data_in : A pointer to the input data samples.
input_frames : 4096
data_out : A pointer to the output data samples.
output_frames : 4096
src_ratio : 44100 / 48000 -> 0,91875
当我错过了 ALSA 内部环形缓冲区中的一些帧时,我的内核模块会告诉我,这会发生。
我缺少大约 100 帧/“读取”。
也许有人理解这个问题并可以说“4096 帧缓冲区太小”或其他内容。
同时我会重新检查我的代码。