我有一个读取的程序
4096 frames (16384 bytes)
16bit LE
48000 Hz
PCM
从内核模块每次“读取”到一个16384字节的大缓冲区(=从ALSA的环形缓冲区读取)。
每次“读取”后,我必须将48 kHz下采样到44.1 kHz,输出必须小于/等于4096帧(流向Apple的机场快线)。
它已经可以工作,但是输出听起来“太快”并且是“闪烁”(我认为由于“读取”中的帧丢失,如下所述),然后有时会停止(我认为“太快”导致“等待”对于数据“)。
对于重新取样,我使用src_process中的libsamplerate(又名秘密兔码):
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帧 - 缓冲区太小”或其他类似的东西。
同时我会重新检查我的代码。