Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15497165
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2010-12-05 20:02:00

  • DuplicatingThread

    AudioFlinger中有一个特殊的线程类:DuplicatingThread,从图一可以知道,它是MixerThread的子类。当系统中有两 个设备要同时输出时,DuplicatingThread将被创建,通过IAudioFlinger的openDuplicateOutput方法创建 DuplicatingThread。

  1. int AudioFlinger::openDuplicateOutput(int output1, int output2)  
  2. {  
  3.     Mutex::Autolock _l(mLock);  
  4.     MixerThread *thread1 = checkMixerThread_l(output1);  
  5.     MixerThread *thread2 = checkMixerThread_l(output2);  
  6.     ......  
  7.     DuplicatingThread *thread = new DuplicatingThread(this, thread1, ++mNextThreadId);  
  8.     thread->addOutputTrack(thread2);  
  9.     mPlaybackThreads.add(mNextThreadId, thread);  
  10.     return mNextThreadId;  
  11. }  

    创建 DuplicatingThread时,传入2个需要同时输出的目标线程Id,openDuplicateOutput先从 mPlaybackThreads中根据Id取得相应输出线程的实例,然后为每个线程创建一个虚拟的AudioTrack---- OutputTrack,然后把这个虚拟的AudioTrack加入到目标线程的mTracks列表中,DuplicatingThread在它的 threadLoop()中,把Mixer好的数据同时写入两个虚拟的OutputTrack中,因为这两个OutputTrack已经加入到目标线程的 mTracks列表,所以,两个目标线程会同时输出DuplicatingThread的声音。

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

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

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

  图三  本机播放时的Thread和Track
  图四  蓝牙播放时的Thread和Track
阅读(4434) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~