AudioTrack&AudioFlinger

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();                       //是否有可读数据 
};

你可能感兴趣的:(android)