一、架构

二、MediaServer初始化

所有的media服务都在进程mediaserver里。其代码在framework/base/media/mediaserver/main_mediaserver.cpp中。初始化过程如下。

1. 先初始化AudioFlinger

其初始化通过AudioFlinger的父类BindService创建唯一的AudioFlinger实例。

2. 然后初始化MediaPlayerService和CameraService

3. 最后初始化AudioPolicyService

三、 AudioFlinger分析

AudioFlinger负责管理每个音轨AudioTrack及RecordTrack,主音量控制,每种声音流的属性设置,设备控制,音效控制。

四、 AudioPolicyService分析

AudioPolicyService用于声音策略管理

客户端代码在framework/base/media/libmedia/AudioSystem.cpp中,其实该客户端只是监测AudioPolicyService是否死亡(binderDied)。真正的客户端为BpAudioPolicyService类,在framework/base/media/libmedia/IAudioPolicyService.cpp中。

接口

 adjustVolume
adjustSuggestedStreamVolume
adjustStreamVolume
setStreamVolume
setStreamSolo
setStreamMute
getStreamVolume
getStreamMaxVolume
setRingerMode
getRingerMode
setVibrateSetting
getVibrateSetting
shouldVibrate
setMode
getMode
playSoundEffect
playSoundEffectVolume
loadSoundEffects
unloadSoundEffects
reloadAudioSettings
setSpeakerphoneOn
isSpeakerphoneOn
setBluetoothScoOn
isBluetoothScoOn
requestAudioFocus
abandonAudioFocus
unregisterAudioFocusClient
registerMediaButtonEventReceiver
unregisterMediaButtonEventReceiver
startBluetoothSco
stopBluetoothSco

服务端代码在framework/base/services/audioflinger/AudioPolicyService.cpp中,实现了AudioPolicyService本地代码及服务内部使用的AudioPolicyClientInterface接口,该接口被AudioPolicyManager调用。

 openOutput
openDuplicateOutput
closeOutput
suspendOutput
restoreOutput
openInput
loseInput
setStreamVolume
setStreamOutput
setParameters
getParameters
startTone
stopTone
setVoiceVolume
moveEffects

AudioPolicyService会启动两个AudioCommandThread类的线程mTonePlaybackThread和mAudioCommandThread,然后构造AudioPolicyManager的实例mpPolicyManager。基本上所有的服务接口都会在检查权限后调用mpPolicyManager的相应实现。

mTonePlaybackThread用户播放通话中的通知音

mAudioCommandThread用于设置AudioFlinger的一些设置(为什么使用AudioCommandThread,然后调用AudioSystem中接口控制AudioFlinger?)

五、 AudioManager分析

1. 音频焦点转

 requestAudioFocus         请求焦点
abandonAudioFocus 放弃焦点

requestAudioFocus的第一参数是Listener,可以是下面枚举的后三个值

第二个参数是当前流类型

最后一个参数可以是以下的前三个值

 AUDIOFOCUS_GAIN
AUDIOFOCUS_GAIN_TRANSIENT
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = ;
AUDIOFOCUS_LOSS = - * AUDIOFOCUS_GAIN;
AUDIOFOCUS_LOSS_TRANSIENT = - * AUDIOFOCUS_GAIN_TRANSIENT;
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK =
- * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;

六、 AudioPolicyManager分析

流类型stream_type(在 AudioSystem中定义)

TYPE                          VALUE                                STRATEGY
DEFAULT(->MUSIC) - STRATEGY_MEDIA()
VOICE_CALL STRATEGY_PHONE()
SYSTEM STRATEGY_MEDIA()
RING STRATEGY_SONIFICATION()
MUSIC STRATEGY_MEDIA()
ALARM STRATEGY_SONIFICATION()
NOTIFICATION STRATEGY_SONIFICATION()
BLUETOOTH_SCO STRATEGY_PHONE()
// Sounds that cannot be muted by user and must be routed to speaker
ENFORCED_AUDIBLE STRATEGY_SONIFICATION()
DTMF STRATEGY_DTMF()
TTS STRATEGY_MEDIA()
HDMI MV的自定义类型 STRATEGY_MEDIA()
FM MV的自定义类型 STRATEGY_MEDIA()

音频状态audio_mode(在 AudioSystem中定义)

1  enum audio_mode {
MODE_INVALID = -,
MODE_CURRENT = -,
MODE_NORMAL = ,
MODE_RINGTONE,
MODE_IN_CALL,
MODE_IN_COMMUNICATION,
NUM_MODES // not a valid entry, denotes end-of-list
};

策略类型routing_strategy:

STRATEGY_MEDIA
STRATEGY_PHONE
STRATEGY_SONIFICATION
STRATEGY_DTMF

设备类型audio_devices:

 enum audio_devices {
// output devices
DEVICE_OUT_EARPIECE = 0x1,
DEVICE_OUT_SPEAKER = 0x2,
DEVICE_OUT_WIRED_HEADSET = 0x4,
DEVICE_OUT_WIRED_HEADPHONE = 0x8,
DEVICE_OUT_BLUETOOTH_SCO = 0x10,
DEVICE_OUT_BLUETOOTH_SCO_HEADSET = 0x20,
DEVICE_OUT_BLUETOOTH_SCO_CARKIT = 0x40,
DEVICE_OUT_BLUETOOTH_A2DP = 0x80,
DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100,
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200,
DEVICE_OUT_AUX_DIGITAL = 0x400,
DEVICE_OUT_DEFAULT = 0x8000,
DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE | DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADSET |
DEVICE_OUT_WIRED_HEADPHONE | DEVICE_OUT_BLUETOOTH_SCO | DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
DEVICE_OUT_BLUETOOTH_SCO_CARKIT | DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | DEVICE_OUT_AUX_DIGITAL | DEVICE_OUT_DEFAULT),
DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER), // input devices
DEVICE_IN_COMMUNICATION = 0x10000,
DEVICE_IN_AMBIENT = 0x20000,
DEVICE_IN_BUILTIN_MIC = 0x40000,
DEVICE_IN_BLUETOOTH_SCO_HEADSET = 0x80000,
DEVICE_IN_WIRED_HEADSET = 0x100000,
DEVICE_IN_AUX_DIGITAL = 0x200000,
DEVICE_IN_VOICE_CALL = 0x400000,
DEVICE_IN_BACK_MIC = 0x800000,
DEVICE_IN_DEFAULT = 0x80000000, DEVICE_IN_ALL = (DEVICE_IN_COMMUNICATION | DEVICE_IN_AMBIENT | DEVICE_IN_BUILTIN_MIC |
DEVICE_IN_BLUETOOTH_SCO_HEADSET | DEVICE_IN_WIRED_HEADSET | DEVICE_IN_AUX_DIGITAL |
DEVICE_IN_VOICE_CALL | DEVICE_IN_BACK_MIC | DEVICE_IN_DEFAULT)
};

流程分析:

1.音量控制

initStreamVolume
setStreamVolumeIndex
setPhoneState

2.播放控制

入口函数

 startOutput

 getStrategy

 getDeviceForStrategy

 setOutputDevice

 applyStreamVolume

 checkAndSetVolume

Android Audio 分析的更多相关文章

  1. Android Audio遇到播放无声时的分析

    在Android Audio开发过程中,有遇到播放ringtone时无声,但播放Music可以听到声音,关于无声问题的分析,在此做个笔记,方便以后回顾. 分析方向: 1:在音量控制面板中确认该音频流对 ...

  2. Android源代码分析之拍照、图片、录音、视频和音频功能

    Android源代码分析之拍照.图片.录音.视频和音频功能   //选择图片 requestCode 返回的标识 Intent innerIntent = new Intent(Intent.ACTI ...

  3. Android内存分析工具

    在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...

  4. Android多线程分析之五:使用AsyncTask异步下载图像

    Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...

  5. Android多线程分析之四:MessageQueue的实现

    Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...

  6. Android多线程分析之三:Handler,Looper的实现

    Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...

  7. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处   在前文<Android多线程分析之一 ...

  8. Android多线程分析之一:使用Thread异步下载图像

    Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处   打算整理一下对 Android F ...

  9. Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换

    已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...

随机推荐

  1. CSharp - Comparison between IComparer and IComparable

    /* Author: Jiangong SUN */ I've already written an article introducing the usage of comparer here. I ...

  2. 关于PreferenceActivity的使用和一些问题的解决(自己定义Title和取值)

    android的Setting往往用PreferenceActivity来写的 我们在建立layout文件: <PreferenceScreen xmlns:android="http ...

  3. [Webpack 2] Hashing with Webpack for long term caching

    Leveraging the browser cache is an important part of page load performance. A great way to utilize t ...

  4. CentOS6.4下使用默认的文档查看器打开PDF文档乱码的解决方案

     最近在CentOS6.4下使用其默认的文档查看器打开PDF文档时出现乱码的方块,有两种方法可以解决.    方法一:修改/etc/fonts/conf.d/49-sansserif.conf文件,如 ...

  5. mysql的limit、order by和group by的用法

    程序执行会重复 用mysql很长时间,limit是分页的一个好工具, select * from table_a where num = 4 limit 1,10, select * from tab ...

  6. hdu2025java字符题

    查找最大元素 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. Java基础知识强化之IO流笔记23:计算机是如何识别把两个字节拼接为中文(附加)

    1. 计算机是如何识别什么时候该把两个字节转换为一个中文呢? 在计算机中中文的存储分两个字节: • 第一个字节肯定是负数. • 第二个字节常见的是负数,可能有正数.但是没影响. 2. 代码示例: pa ...

  8. eclipse同时开两个tomcat

    首先设置环境变量: 接着修改其中一个tomcat下bin文件夹的startup.bat和catalina.bat 将里面所有CATALINA_HOME都修改为CATALINA_HOME2 然后 修改c ...

  9. BrainTree信用卡包

    BrainTree是一个国外集成信用卡支付的卡包. 沙盒登陆地址: https://sandbox.braintreegateway.com/login 登陆沙盒得到商户ID.公钥.私钥. 1.配置w ...

  10. Bootstrap后台使用问题汇总(一)

    第一次自己汇总写博客啊,不懂规矩,大家包涵~~ 最近进行的项目中需要一个后台,于是在网上Down了许多Bootstrap后台源码.精挑细选决定用“ACE后台管理系统”(因为是中文的,英文三级狗的小鹿还 ...