Android Framework学习笔记 -- client与AudioFlinger的数据交换

本文探讨了Android Framework中AudioTrack与AudioFlinger如何在不同进程中通过共享内存进行音频数据交换,利用环形缓冲区实现,且详细阐述了AudioTrackShared.cpp中的AudioTrackClientProxy和AudioTrackServerProxy在数据读写中的作用,以及客户端和服务端的数据交换流程。
摘要由CSDN通过智能技术生成

AudioTrack与AudioFlinger在两个不同进程,他们之间要通过共享内存进行音频的数据交换。
交换的实现通过环形缓冲去来实现,貌似没有同步机制,从实验结果来看,AudioTrack写满缓冲区后AudioFlinger就会去读取。

数据交换的实现主要在AudioTrackShared.cpp中实现,包括AudioTrackClientProxy和AudioTrackServerProxy。

两边数据通过cblk的flag来进行数据的读写。

//两边操作数据的接口
class Proxy : public RefBase {
    ...
public:
    struct Buffer {
        size_t  mFrameCount;            // number of frames available in this buffer
        void*   mRaw;                   // pointer to first frame
        size_t  mNonContig;             // number of additional non-contiguous frames available
    };

protected:
    // 共享内存的一些信息
    audio_track_cblk_t* const   mCblk;  // the control block
    void* const     mBuffers;           // starting address of buffers

    const size_t    mFrameCount;        // not necessarily a power of 2
    const size_t    mFrameSize;         // in bytes
    const size_t    mFrameCountP2;      // mFrameCount rounded to power of 2, streaming mode
    const bool      mIsOut;             // true for AudioTrack, false for AudioRecord
    const bool      mClientInServer;    // true for OutputTrack, false for AudioTrack & AudioRecord
    bool            mIsShutdown;        // latch set to true when shared memory corruption detected
    size_t          mUnreleased;        // unreleased frames remaining from most recent obtainBuffer
};

客户端的流程:获取Buf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值