} }
//一样啊,把环形缓冲铺直了
if (s >= serverBase + this->frameCount) { serverBase += this->frameCount; }
this->server = s; //server为512了 cv.signal(); //读者读完了。触发下写者吧。 lock.unlock(); return true; }
6 真的是环形缓冲吗?
环形缓冲是这样一个场景,现在buffer共1024帧。 假设:
? 写者先写到1024帧 ? 读者读到512帧
? 那么,写者还可以从头写512帧。
所以,我们得回头看看frameavail是不是把这512帧算进来了。 uint32_t audio_track_cblk_t::framesAvailable_l() {
uint32_t u = this->user; //1024 uint32_t s = this->server;//512
if (out) {
uint32_t limit = (s < loopStart) ? s : loopStart; return limit + frameCount - u;返回512,用上了! } }
再看看stepUser这句话
if (u >= userBase + this->frameCount) {u为1024,userBase为0,frameCount为1024 userBase += this->frameCount;//好,userBase也为1024了 } 看看buffer
return (int8_t *)this->buffers + (offset - userBase) * this->frameSize;
//offset是外界传入的基于user的一个偏移量。offset-userBase,得到的正式从头开始的那段数据空间。太牛了!