struct audio_track_cblk_t
{
// The data members are grouped so that members accessed frequently and in the same context
// are in the same line of data cache.
Mutex lock;
Condition cv;
volatile uint32_t user; //user代表AudioTrack,生产者已经写了多少个frame
volatile uint32_t server; //server代表AudioFlinger,消费者已经读取了多少个frame
uint32_t userBase; //与user结合使用,使之成为一个环形FIFO
uint32_t serverBase; //与server结合使用,使之成为一个环形FIFO
void* buffers; //实际数据buffer的起始地址,
//如果是MODE_STREAM,buffers紧跟在cblk后面
//如果是MODE_STATIC,buffers指向sharedBuffer
uint32_t frameCount; //数据buffer的大小,以Frame为单位
// Cache line boundary
uint32_t loopStart; //以下3个loopXXX是与循环播放有关
uint32_t loopEnd;
int loopCount;
volatile union {
uint16_t volume[2];
uint32_t volumeLR;
}; //音量相关
uint32_t sampleRate; //采样率
// NOTE: audio_track_cblk_t::frameSize is not equal to AudioTrack::frameSize() for
// 8 bit PCM data: in this case, mCblk->frameSize is based on a sample size of
// 16 bit because data is converted to 16 bit before being stored in buffer
uint8_t frameSize; //一个frame的字节数
uint8_t channelCount; //通道数目
uint16_t flags;
uint16_t bufferTimeoutMs; // Maximum cumulated timeout before restarting audioflinger
uint16_t waitTimeMs; // Cumulated wait time
uint16_t sendLevel;
uint16_t reserved;
// Cache line boundary (32 bytes)
audio_track_cblk_t(); //cblk总是new在指定的共享内存上,而不是堆栈上
uint32_t stepUser(uint32_t frameCount); //AudioTrack更新写位置
bool stepServer(uint32_t frameCount); //AudioFlinger更新读位置
void* buffer(uint32_t offset) const; //返回可写的地址
uint32_t framesAvailable(); //还有多少空间可写
uint32_t framesAvailable_l();
uint32_t framesReady(); //是否有可读数据
};
AudioTrack&AudioFlinger
最新推荐文章于 2020-11-27 16:34:07 发布