zoukankan      html  css  js  c++  java
  • Android AudioFlinger(一)

      本文主要介绍AudioFlinger,AudioFlinger向下访问AudioHardware,实现输出音频数据,控制音频参数。同时,AudioFlinger向上通过IAudioFinger接口提供服务。所以,AudioFlinger在Android的音频系统框架中起着承上启下的作用,地位相当重要。AudioFlinger的相关代码主要在:frameworks\base\libs\audioflinger,也有部分相关的代码在frameworks\base\media\libmedia里。

            AudioFlinger的类结构
            下面的图示描述了AudioFlinger类的内部结构和关系:

    5.png

    6.png


           不知道各位是否和我一样,第一次看到AudioFlinger类的定义的时候都很郁闷--这个类实在是庞大和臃肿,可是当你理清他的关系以后,你会觉得相当合理。下面我们一一展开讨论。


           IAudioFlinger接口
           这是AudioFlinger向外提供服务的接口,例如openOutput,openInput,createTrack,openRecord等等,应用程序或者其他service通过ServiceManager可以获得该接口。该接口通过继承BnAudioFlinger得到。


           ThreadBase
           在AudioFlinger中,Android为每一个放音/录音设备均创建一个处理线程,负责音频数据的I/O和合成,ThreadBase是这些线程的基类,所有的播放和录音线程都派生自ThreadBase


           TrackBase
           应用程序每创建一个音轨(AudioTrack/AudioRecord),在AudioFlinger中都会创建一个对应的Track实例,TrackBase就是这些Track的基类,他的派生类有:

      
           PlaybackTread::Track                 // 用于普通播放,对应于应用层的AudioTrack
           PlaybackThread::OutputTrack    // 用于多重设备输出,当蓝牙播放开启时使用
           RecordThread::RecordTrack       // 用于录音,对应于应用层的AudioRecord

           播放
           默认的播放线程是MixerThread,它由AudioPolicyManager创建,在AudioPolicyManager的构造函数中,有以下代码:


    Java代码:

    1. mHardwareOutput = mpClientInterface->openOutput(&outputDesc->mDevice,
    2. &outputDesc->mSamplingRate,
    3. &outputDesc->mFormat,
    4. &outputDesc->mChannels,
    5. &outputDesc->mLatency,
    6. outputDesc->mFlags);
    复制代码

           最终会进入AudioFlinger的openOut函数:

    Java代码:
    1. thread = new MixerThread(this, output, ++mNextThreadId);
    2. ......
    3. mPlaybackThreads.add(mNextThreadId, thread);
    4. ......
    5. return mNextThreadId;
    复制代码

           可以看到,创建好的线程会把该线程和它的Id保存在AudioFlinger的成员变量mPlaybackThreads中,mPlaybackThreads是一个Vector,AudioFlinger创建的线程都会保存在里面,最后,openOutput返回该线程的Id,该Id也就是所谓的audio_io_handle_t,AudioFlinger的调用者这能看到这个audio_io_handle_t,当需要访问时传入该audio_io_handle_t,AudioFlinger会通过mPlaybackThreads,得到该线程的指针。

           createTrack会调用PlaybackThread类的createTrack_l函数:

    Java代码:
    1. track = thread->createTrack_l(client, streamType, sampleRate, format,
    2. channelCount, frameCount, sharedBuffer, &lStatus);
    复制代码

            再跟入createTrack_l函数中,可以看到创建了PlaybackThread::Track类,然后加入播放线程的track列表mTracks中。

    Java代码:
    1. track = thread->createTrack_l(client, streamType, sampleRate, format,
    2. channelCount, frameCount, sharedBuffer, &lStatus);
    3. ......
    4. mTracks.add(track);
    复制代码

           在createTrack的最后,创建了TrackHandle类并返回,TrackHandle继承了IAudioTrack接口,以后,createTrack的调用者可以通过IAudioTrack接口与AudioFlinger中对应的Track实例交互。

    Java代码:
    1. trackHandle = new TrackHandle(track);
    2. ......
    3. return trackHandle;

     



  • 相关阅读:
    存储型 XSS 原理复现
    反射型 XSS 原理复现
    HTTP 简易理解
    Markdown 流程图语法
    Dirsearch 快速开始
    sqlmap 快速开始
    SQL 注入原理
    XSS 原理
    51nod 1835 完全图
    11.5 AM 请求
  • 原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124497.html
Copyright © 2011-2022 走看看