Expand description
任意のデバイスフレーム(任意 SR / 任意 ch / interleaved f32)を 2 段で 正規化・再変換する。
入力(任意 SR/ch)
│ 第 1 段(内部正規化・不変)
│ ・チャンネル mix(→stereo)
│ ・SR 変換(rubato, →48000)
▼
内部正規形: f32 / 48000 Hz / stereo / 20ms = 960 frame
│ 第 2 段(出口・新規)
│ ・チャンネル変換(stereo→mono 平均 / mono→stereo 複製 / そのまま)
│ ・SR 変換(rubato, 48000→output.sample_rate。等しければパススルー)
▼
出力: f32 / output.sample_rate / output.channels / 時間ベース 20ms 固定
(48k=960 / 16k=320 / 8k=160 frame)既定の出力 {48000, 2} なら第 2 段は丸ごとパススルー(内部正規形がそのまま出る)。
第 1 段の SR 変換は in_sample_rate == 48000 で、第 2 段の SR 変換は
output.sample_rate == 48000 でそれぞれパススルーになる。
どちらの rubato リサンプラも FixedAsync::Input(固定入力チャンク)で、生成された
可変長出力を内部 accumulator に集約し、20ms 相当の境界で切り出す。端数はリサンプラ
内部と accumulator が次へ持ち越す。
PTS は出力チャンク先頭サンプルに対応する device_pts を、入力→出力サンプルオフセット の比で追跡して割り当てる。seq はストリーム層が付与する。
Structs§
- Normalizer
- 入力デバイスフレームを内部正規形(48k/stereo/960frame)へ正規化し、さらに
出力フォーマット(
output.sample_rate/output.channels/ 時間ベース 20ms) へ再変換するステートフルな 2 段変換器。
Constants§
- CHUNK_
FRAMES - 内部正規形 1 チャンクのフレーム数(20ms @ 48kHz)。第 1 段の切り出し境界。