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只会在蓝牙耳机中输出,而按键音和铃声等提示音会同时在本机和蓝牙耳机中输出。