私は読むプログラムを持っています
4096 frames (16384 bytes)
16bit LE
48000 Hz
PCM
カーネルモジュールからの「読み取り」ごとに 16384 バイトの大きなバッファーに入れます (= ALSA のリングバッファーから読み取ります)。
各「読み取り」の後、48 kHz を 44.1 kHz にダウンサンプリングする必要があり、出力は 4096 フレームより小さい/等しい必要があります (Apple の Airport Express にストリーミング)。
すでに機能していますが、出力が「速すぎる」ように聞こえ、「ちらつき」があり(後述の「読み取り」でフレームが失われたためだと思います)、時々停止します(「速すぎる」と「データの待機」が発生すると思います) )。
リサンプリングには、libsamplerate (別名 Secret Rabbit Code)のsrc_processを使用します。
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 フレーム バッファが小さすぎます」などと言うことができるかもしれません。
その間、コードを再確認します。