定义回顾(Framework 层)
在 AudioTrack / AudioFlinger / HAL 中:
| Framework 成员 | 含义 |
|---|---|
| mFrameSize | 单个 frame 占用的字节数(bytes) = 通道数 × 每个样本大小(sample size, 2 或 4 bytes) |
| mFrameCount | 总的 frame 数量(frames) = HAL buffer / AudioTrack buffer 中的 frame 数量 |
| mBufferSize | 总字节数(bytes) = mFrameSize × mFrameCount |
注意:这里的 frame 指的是“声道打包后的最小单位”,例如 stereo 16bit → frame = 2*2 bytes = 4 bytes
2️⃣ 对应到 period_size / period_count
我们在 ALSA / HAL 层说:
period_size = 每次 DMA 消耗的 frame 数 period_count = ring buffer 里有几个 period buffer_size = period_size × period_count
Framework 层的对应关系:
| HAL / Driver | Framework (AudioTrack / AudioFlinger) |
|---|---|
| period_size (frames) | mPeriodSize(有些地方是 HAL 返回的 frame 数) |
| period_count | periodCount(Framework 很少直接用,但可以算成 mFrameCount / mPeriodSize) |
| buffer_size (frames) | mFrameCount |
| buffer_size (bytes) | mBufferSize = mFrameCount × mFrameSize |
3️⃣ 举例(低延迟 track)
假设:
-
Stereo 16bit → 每帧 4 bytes
mFrameSize = 4 bytes -
HAL ring buffer: period_size = 240 frames, period_count = 2
buffer_size = 240 * 2 = 480 frames -
Framework 对应:
mFrameCount = 480 mBufferSize = 480 * 4 = 1920 bytes
-
低延迟延迟:
latency = buffer_size / sample_rate = 480 / 48000 = 10 ms
✅ 对应完全匹配。
4️⃣ 小结公式
mFrameSize = bytes_per_sample * num_channels mFrameCount = total_frames_in_buffer = period_size * period_count mBufferSize = mFrameSize * mFrameCount = total_bytes
-
如果 Framework 层只知道 mFrameCount / mFrameSize,就可以算出 HAL 的 period_count / period_size,反之亦然。
-
period_size / period_count 更接近硬件层,mFrameCount / mBufferSize 是 Framework 层抽象的总 buffer。
5️⃣ 🔥 工程小技巧
-
低延迟 track:mFrameCount 尽量小 → latency 低
-
普通 track:mFrameCount 大一点 → underrun 容错高
-
Stereo 16bit:
mFrameSize = 2ch * 2B = 4B mFrameCount = 480 → mBufferSize = 1920 bytes
-
Mono 16bit:
mFrameSize = 1ch * 2B = 2B mBufferSize = mFrameCount * 2
3851

被折叠的 条评论
为什么被折叠?



