audioflinger

本文深入解析了Android 7.0中的AudioFlinger服务,包括AudioFlinger如何处理AudioTrack与AudioRecord,以及在蓝牙设备和本机输出时的线程配置。特别地,介绍了建立AudioTrack与AudioFlinger联系的过程,从AudioTrack的创建到与AudioFlinger的交互,涉及硬件接口加载、混音线程的管理和AudioPolicyService的角色。
摘要由CSDN通过智能技术生成

 

 

 

Android 7.0 Audio: AudioFlinger介绍和初始

http://blog.csdn.net/xiashaohua/article/details/53818568

 

frameworks/av/services/audioflinger/Threads.cpp:3027:status_t AudioFlinger::PlaybackThread

frameworks/av/services/audioflinger/Tracks.cpp:879:void AudioFlinger::PlaybackThread::Track     AudioFlinger::ThreadBase::TrackBase

 

http://blog.csdn.net/droidphone/article/details/5951999

 

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

默认的播放线程是MixerThread,DuplicatingThread,它是MixerThread的子类。当系统中有两个设备要同时输出时,DuplicatingThread将被创建

 

 

Android Framework的音频子系统中,每一个音频流对应着一个AudioTrack类的一个实例,每个AudioTrack会在创建时注册到AudioFlinger中,由AudioFlinger把所有的AudioTrack进行混合(Mixer),然后输送到AudioHardware中进行播放,目前Android的Froyo版本设定了同时最多可以创建32个音频流,也就是说,Mixer最多会同时处理32个AudioTrack的数据流

 

  实际上,创建DuplicatingThread的工作是有AudioPolicyService中的AudioPolicyManager里发起的。主要是当蓝牙耳机和本机输出都开启时,AudioPolicyManager会做出以下动作:

  • 首先打开(或创建)蓝牙输出线程A2dpOutput
  • 以HardwareOutput和A2dpOutput作为参数,调用openDuplicateOutput,创建DuplicatingThread
  • 把属于STRATEGY_MEDIA类型的Track移到A2dpOutput中
  • 把属于STRATEGY_DTMF类型的Track移到A2dpOutput中
  • 把属于STRATEGY_SONIFICATION类型的Track移到DuplicateOutput中

 

结果是,音乐和DTMF只会在蓝牙耳机中输出,而按键音和铃声等提示音会同时在本机和蓝牙耳机中输出。

                           

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值