audio结构体 audio_track_cblk_t
audio_track_cblk_t
是 Android 音频系统中实现 跨进程环形缓冲区(FIFO)同步 的核心数据结构,主要用于协调 AudioTrack
(数据生产者)和 AudioFlinger
(数据消费者)之间的音频数据传输。以下从结构体功能、成员变量、同步机制等角度进行详细解析:
一、核心功能
-
环形缓冲区管理
audio_track_cblk_t
作为共享内存控制块(Control Block),定义了环形缓冲区的读写位置、大小等元数据,支持AudioTrack
和AudioFlinger
跨进程同步数据。 -
跨进程同步
通过Mutex
和Condition
实现线程安全,确保生产者(应用层)和消费者(音频服务)对缓冲区的并发访问安全。 -
音频参数传递
包含采样率(sampleRate
)、声道数(channels
)、帧格式(format
)等音频流配置参数,确保数据解析一致性。
二、关键成员变量
成员变量 | 作用 | 引用来源 |
---|---|---|
user / userBase | 生产者(AudioTrack )的当前写偏移和基准位置,用于计算实际写入地址 | |
server / serverBase | 消费者(AudioFlinger )的当前读偏移和基准位置,用于计算实际读取地址 | |
frameCount | 环形缓冲区的总帧容量(以音频帧为单位),决定缓冲区大小 | |
buffers | 指向环形缓冲区数据区域的起始地址,位于共享内存中 audio_track_cblk_t 结构体之后 | |
mFutex | 快速用户态互斥体(Futex),用于实现轻量级线程同步 | |
mVolumeLR | 立体声左右声道增益参数(浮点型),用于混音时的音量控制 | |
mExtendedTimestampQueue | 扩展时间戳队列,记录高精度时间戳以支持音视频同步 |
三、同步机制与操作
-
无锁环形缓冲区
使用原子操作(如user
和server
的更新)实现生产者和消费者的位置跟踪,避免传统锁带来的性能损耗。 -
阻塞与非阻塞模式
- 阻塞模式:当缓冲区满时,
AudioTrack
的write()
调用会阻塞等待可用空间。 - 非阻塞模式:通过
framesAvailable()
检查可用空间,避免阻塞。
- 阻塞模式:当缓冲区满时,
-
Futex 快速同步
mFutex
变量用于实现轻量级等待/唤醒机制,减少内核态与用户态的切换开销。
四、应用场景
-
音频流传输
- Stream模式:动态分配共享内存,
audio_track_cblk_t
位于缓冲区头部,支持实时数据流传输。 - Static模式:预分配静态缓冲区,适用于短音频(如提示音)。
- Stream模式:动态分配共享内存,
-
混音与重采样
AudioFlinger
的MixerThread
从环形缓冲区读取数据,结合mVolumeLR
和mSampleRate
进行混音和重采样后输出到 HAL 层。 -
时间戳同步
mExtendedTimestampQueue
记录高精度时间戳,解决音频与视频/输入设备的时间偏差问题。
五、设计技巧
-
跨进程共享内存
通过IMemory
接口实现匿名共享内存的跨进程映射,AudioTrack
和AudioFlinger
共享同一块物理内存。 -
环形缓冲区优化
- 覆盖策略:缓冲区满时覆盖旧数据,避免死锁(适用于实时流)。
- 双基准偏移:通过
userBase
和serverBase
解决 32 位整数溢出问题,支持长时间播放。
-
时间戳与速率分离
mPlaybackRateQueue
独立管理播放速率参数,避免与主缓冲区操作冲突。