当前位置: 首页 > news >正文

wordpress 3.2/郑州seo实战培训

wordpress 3.2,郑州seo实战培训,镇江论坛,ps做简洁大气网站引言 AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:frameworks\base\media\mediaserver\main_mediaserver.cpp。AudioFlinger主要…

引言
    AudioPolicyService是Android音频系统的两大服务之一,另一个服务是AudioFlinger,这两大服务都在系统启动时有MediaSever加载,加载的代码位于:frameworks\base\media\mediaserver\main_mediaserver.cpp。AudioFlinger主要负责管理音频数据处理以及和硬件抽象层相关的工作。本文主要介绍AudioPolicyService。

AudioPolicyService
    AudioPolicyService主要完成以下任务:
JAVA应用层通过JNI,经由IAudioPolicyService接口,访问AudioPolicyService提供的服务
输入输出设备的连接状态
系统的音频策略(strategy)的切换
音量/音频参数的设置
    AudioPolicyService的构成
    下面这张图描述了AudioPolicyService的静态结构:

Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager_www.fengfly.com

进一步说明:

1. AudioPolicyService继承了IAudioPolicyService接口,这样AudioPolicyService就可以基于Android的Binder机制,向外部提供服务;

2. AudioPolicyService同时也继承了AudioPolicyClientInterface类,他有一个AudioPolicyInterface类的成员指针mpPolicyManager,实际上就是指向了AudioPolicyManager;

3. AudioPolicyManager类继承了AudioPolicyInterface类以便向AudioPolicyService提供服务,反过来同时还有一个AudioPolicyClientInterface指针,该指针在构造函数中被初始化,指向了AudioPolicyService,实际上,AudioPolicyService是通过成员指针mpPolicyManager访问AudioPolicyManager,而AudioPolicyManager则通过AudioPolicyClientInterface(mpClientInterface)访问AudioPolicyService;

4. AudioPolicyService有一个内部线程类AudioCommandThread,顾名思义,所有的命令(音量控制,输入、输出的切换等)最终都会在该线程中排队执行;

AudioPolicyManager
    AudioPolicyService的很大一部分管理工作都是在AudioPolicyManager中完成的。包括音量管理,音频策略(strategy)管理,输入输出设备管理。

输入输出设备管理
音频系统为音频设备定义了一个枚举:AudioSystem::audio_devices,例如:DEVICE_OUT_SPEAKER,DEVICE_OUT_WIRED_HEADPHONE,DEVICE_OUT_BLUETOOTH_A2DP,DEVICE_IN_BUILTIN_MIC,DEVICE_IN_VOICE_CALL等等,每一个枚举值其实对应一个32bit整数的某一个位,所以这些值是可以进行位或操作的,例如我希望同时打开扬声器和耳机,那么可以这样:

 

newDevice = DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADPHONE;  setOutputDevice(mHardwareOutput, newDevice);  
 

 

AudioPolicyManager中有两个成员变量:mAvailableOutputDevices和mAvailableInputDevices,他们记录了当前可用的输入和输出设备,当系统检测到耳机或者蓝牙已连接好时,会调用AudioPolicyManager的成员函数:

 

 

 

status_t AudioPolicyManager::setDeviceConnectionState(AudioSystem::audio_devices device,                                                    AudioSystem::device_connection_state state,                                                    const char *device_address)    该函数根据传入的device值和state(DEVICE_STATE_AVAILABLE/DEVICE_STATE_UNAVAILABLE)设置mAvailableOutputDevices或者mAvailableInputDevices,然后选择相应的输入或者输出设备。

其他一些相关的函数:

setForceUse()  设置某种场合强制使用某一设备,例如setForceUse(FOR_MEDIA, FORCE_SPEAKER)会在播放音乐时打开扬声器
startOutput()/stopOutput()
startInput()/stopInput()
音量管理
AudioPolicyManager提供了一下几个与音量相关的函数:

initStreamVolume(AudioSystem::stream_type stream, int indexMin, int indexMax)
setStreamVolumeIndex(AudioSystem::stream_type stream, int index)
getStreamVolumeIndex(AudioSystem::stream_type stream)
AudioService.java中定义了每一种音频流的最大音量级别:

 

/** @hide Maximum volume index values for audio streams */   

  private int[] MAX_STREAM_VOLUME = new int[] {         

5,  // STREAM_VOICE_CALL         

7,  // STREAM_SYSTEM         

7,  // STREAM_RING         

15, // STREAM_MUSIC         

7,  // STREAM_ALARM         

 7,  // STREAM_NOTIFICATION        

  15, // STREAM_BLUETOOTH_SCO        

  7,  // STREAM_SYSTEM_ENFORCED         

15, // STREAM_DTMF         

15  // STREAM_TTS      }; 
 

由此可见,电话铃声可以有7个级别的音量,而音乐则可以有15个音量级别,java的代码通过jni,最后调用AudioPolicyManager的initStreamVolume(),把这个数组的内容传入AudioPolicyManager中,这样AudioPolicyManager也就记住了每一个音频流的音量级别。应用程序可以调用setStreamVolumeIndex设置各个音频流的音量级别,setStreamVolumeIndex会把这个整数的音量级别转化为适合人耳的对数级别,然后通过AudioPolicyService的AudioCommandThread,最终会将设置应用到AudioFlinger的相应的Track中。

音频策略管理
 我想首先要搞清楚stream_type,device,strategy三者之间的关系:

AudioSystem::stream_type  音频流的类型,一共有10种类型
AudioSystem::audio_devices  音频输入输出设备,每一个bit代表一种设备,见前面的说明
AudioPolicyManager::routing_strategy 音频路由策略,可以有4种策略
Android Audio System 之三: AudioPolicyService 和 AudioPolicyManager_www.fengfly.com

getStrategy(stream_type)根据stream type,返回对应的routing strategy值,getDeviceForStrategy()则是根据routing strategy,返回可用的device。Android把10种stream type归纳为4种路由策略,然后根据路由策略决定具体的输出设备。

成员变量mOutputs
 

view plaincopy to clipboardprint?
KeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs;   // list of output descriptors  
KeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs;   // list of output descriptors

 

这是AudioPolocyManager用管理输出的键值对向量(数组),通常AudioPolocyManager会打开3个输出句柄(audio_io_handle_t),关于audio_io_handle_t,请参考另一编博客:http://blog.csdn.net/DroidPhone/archive/2010/10/14/5941344.aspx,它实际上就是AudioFlinger中某个PlaybackTread的ID。这3个句柄分别是:

mHardwareOutput            // hardware output handler
mA2dpOutput                   // A2DP output handler
mDuplicatedOutput          // duplicated output handler: outputs to hardware and A2DP
可以通过startOutput()把某一个stream type放入到相应的输出中。

popCount()
这个函数主要用来计算device变量中有多少个非0位(计算32位数种1的个数),例如该函数返回2,代表同时有两个device要处理。之所以特别介绍它,是因为这个函数的实现很有意思:

 

 

 

uint32_t AudioSystem::popCount(uint32_t u)  {      u = ((u&0x55555555) + ((u>>1)&0x55555555));      u = ((u&0x33333333) + ((u>>2)&0x33333333));      u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f));      u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff));      u = ( u&0x0000ffff) + (u>>16);      return u;  } 不知道各位看懂了么?

AudioCommandThread
    这是AudioPolicyService中的一个线程,主要用于处理音频设置相关的命令。包括:

START_TONE
STOP_TONE
SET_VOLUME
SET_PARAMETERS
SET_VOICE_VOLUME
     每种命令的参数有相应的包装:

class ToneData
class VolumeData
class ParametersData
class VoiceVolumeData
    START_TONE/STOP_TONE:播放电话系统中常用的特殊音调,例如:TONE_DTMF_0,TONE_SUP_BUSY等等。

    SET_VOLUME:最终会调用AudioFlinger进行音量设置

    SET_VOICE_VOLUME:最终会调用AudioFlinger进行电话音量设置

    SET_PARAMETERS:通过一个KeyValuePairs形式的字符串进行参数设置,KeyValuePairs的格式可以这样:

 "sampling_rate=44100"
"channels=2"
"sampling_rate=44100;channels=2"     // 组合形式
    这些KeyValuePairs可以通过AudioPolicyService的成员函数setParameters()传入。


原文来自:雨枫技术教程网 http://www.fengfly.com
原文网址:http://www.fengfly.com/plus/view-192719-1.html


http://www.lbrq.cn/news/786115.html

相关文章:

  • wordpress 网站建设/万网域名注册查询网
  • 做网站域名/百度官方网
  • 哈尔滨松北区建设局网站/百度招聘官网首页
  • 如何创建自己网站/平谷头条新闻
  • 湛江模板建站多少钱/北京建公司网站价格
  • 那里做网站最好/申请网站怎么申请
  • 做网站收会员费违法吗/现在百度推广有用吗
  • 公司网站维护都需要怎么做/营销型网站的推广方法
  • 开工作室做网站怎样找资源/手机怎么建网站
  • 郑州上街区网站建设公司/百度指数什么意思
  • 公明做网站的公司/上海网站建设咨询
  • 啥网站都能看的浏览器/什么叫关键词举例
  • 顺德网站制作案例如何/农夫山泉软文300字
  • wordpress文章编辑技巧/杭州优化建筑设计
  • 鹤壁专业做网站多少钱/个人怎么做网站
  • 网站 维护方案/产品推广运营的公司
  • 常州做网站yongjiaweb/seo服务商排名
  • 如何选择购物网站建设/南阳seo优化
  • 网络服务器的作用/seo推广效果怎么样
  • 企业网站建设平台/成品网站源码1688免费推荐
  • 怎样才能增加网站/网络平台推广方式
  • 深圳工程造价建设信息网站/网站设计公司哪家专业
  • 企业集团网站建设与运营/泰州百度seo公司
  • jquery mobile网站模板/微信群拉人的营销方法
  • 中企动力科技股份有限公司广州分公司/网站seo完整seo优化方案
  • 中学教材数字化学习资源的建设——教材配套网站的设计及发展趋势/常德政府网站
  • 乐清英文网站建设/甘肃搜索引擎网络优化
  • 新网备案成功了怎么做网站/2024年最新时事新闻
  • 买虚机送网站建设/网页制作官方网站
  • wordpress get permalink/seo独立站优化
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt
  • 26-数据仓库与Apache Hive
  • k8s常见问题
  • 【慕伏白】Android Studio 配置国内镜像源
  • WPF 按钮背景色渐变