AudioFlinger 源码解析

本文详细解析AudioFlinger的内部结构,包括与客户端交互的client内部类,AudioFlinger的初始化过程,特别是AudioFlinger如何通过BinderService向ServiceManager注册。此外,还探讨了Track的创建,特别是Track的构造函数和共享内存的设置,以及play和stop函数的工作原理,如何在PlayBackThread中操作Track并读取共享内存数据。
摘要由CSDN通过智能技术生成

首先介绍一些AudioFlienger 用到的内部类

一 client  内部类

    可能存在很多个AudioTrack 或者AudioRecord (客户端)与AudioFlienger 对接。每个客户端由PId 分辨。

    每注册一个客户端, 则生成一个client 对象,保存到DefaultKeyedVector< pid_t, wp<Client> >     mClients 中


    class Client : public RefBase {
    public:
                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
        virtual             ~Client();
        sp<MemoryDealer>    heap() const;
        pid_t               pid() const { return mPid; }
        sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; }

    private:
                            Client(const Client&);
                            Client& operator = (const Client&);
        const sp<AudioFlinger> mAudioFlinger;
              sp<MemoryDealer> mMemoryDealer;
        const pid_t         mPid;
    };


二 AudioFlinger 的初始化

    AudioFlinger的初始化是从main_audioserver.cpp 初始化。

   这是系统启动服务的典型方法。


        sp<ProcessState> proc(ProcessState::self());
        sp<IServiceManager> sm = defaultServiceManager();
        ALOGI("ServiceManager: %p", sm.get());
        AudioFlinger::instantiate();
        AudioPolicyService::instantiate();
        RadioService::instantiate();
        SoundTriggerHwService::instantiate();
        ProcessState::self()->startThreadPool();
        IPCThreadState::self()->joinThreadPool();



我们只关心AudioFlinger::instantial()函数, 但是此函数并不是在AudioFlinger.cpp 中定义。

AudioFlinger 继承了BinderService,

class AudioFlinger :
    public BinderService<AudioFlinger>,
    public BnAudioFlinger


template<typename SERVICE>
class BinderService
{
public:
    static status_t publish(bool allowIsolated = false) {
        sp<IServiceManager> sm(defaultServiceManager());
        return sm->addService(
                String16(SERVICE::getServiceName()),
                new SERVICE(), allowIsolated);
    }

......

    static void instantiate() { publish(); }


其实就是执行,

sp<IServiceManager> sm(defaultServiceManager());


 sm->addService( String16(AudioFlinger::getServiceName()),
                new AudioFlinger, allowIsolated);


向ServiceManager 中注册AudioFlinger。



三  建立Track, 反馈给AudioTracker


sp<IAudioTrack> AudioFlinger::createTrack(
        audio_stream_type_t streamType,
        uint32_t sampleRate,
        audio_format_t format,
        audio_channel_mask_t channelMask,
        size_t *frameCount,
        IAudioFlinger::track_flags_t *flags,
        const sp<IMemory>& sharedBuffer,
        audio_io_handle_t output,
        pid_t pid,
        pid_t tid,
        audio_session_t *sessionId,
        int clientUid,
        status_t *status)
{
    sp<PlaybackThread::Track> track;
    sp<TrackHandle> trackHandle;
    sp<Client> client;
    status_t lStatus;
    audio_session_t lSessionId;

    const uid_t callingUid = IPCThreadState::self()->getCallingUid();
......

    {
        Mutex::Autolock _l(mLock);
        // 1.根据索引号找到一个工作线程 playbackThread
        PlaybackThread *thread = checkPlaybackThread_l(output);

        client = registerPid(pid);

        ALOGV("createTrack() lSessionId: %d", lSessionId);
        
        //2.建立PlaybackThread::Track指针, 这个对象是AT调用AF 的中间接口
        track = thread->createTrac
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值