Android Audio 分析
一、架构

二、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 分析的更多相关文章
- Android Audio遇到播放无声时的分析
在Android Audio开发过程中,有遇到播放ringtone时无声,但播放Music可以听到声音,关于无声问题的分析,在此做个笔记,方便以后回顾. 分析方向: 1:在音量控制面板中确认该音频流对 ...
- Android源代码分析之拍照、图片、录音、视频和音频功能
Android源代码分析之拍照.图片.录音.视频和音频功能 //选择图片 requestCode 返回的标识 Intent innerIntent = new Intent(Intent.ACTI ...
- Android内存分析工具
在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...
- Android多线程分析之五:使用AsyncTask异步下载图像
Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...
- Android多线程分析之四:MessageQueue的实现
Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...
- Android多线程分析之三:Handler,Looper的实现
Android多线程分析之三:Handler,Looper的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多 ...
- Android多线程分析之二:Thread的实现
Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前文<Android多线程分析之一 ...
- Android多线程分析之一:使用Thread异步下载图像
Android多线程分析之一:使用Thread异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android F ...
- Android Launcher分析和修改13——实现Launcher编辑模式(1) 壁纸更换
已经很久没更新Launcher系列文章,今天不分析源码,讲讲如何在Launcher里面添加桌面设置的功能.目前很多第三方Launcher或者定制Rom都有简单易用的桌面设置功能.例如小米MIUI的La ...
随机推荐
- 理解标签重置reset
/*样式表文件来自 懒人css http://lrcss.lrjz100.com *//*---------重置---------*/html{font-size: 100%;-webkit-text ...
- 读书雷达 l 业务分析师(BA)篇
http://chuansong.me/n/412991951441 ThoughtWorks BA社区从2011年起就建立了BA书橱,根据大家的推荐选择了来自软件需求.商业分析.设计思维.软技能,以 ...
- 关于编译Lambda时报告返回的为void的错误
这个错误的信息是这样的: a lambda that has been specified to have a void return type cannot return a value 报告错误的 ...
- ArcGIS API for Javascript配置
1.去官网下载最新版: ArcGIS API for JavaScript 3.9 API 参考文档:https://developers.arcgis.com/javascr 智能提示下载:http ...
- 用bootstrap的tab插件做一个图层切换效果(感觉会误导淫们,大家当乐子看吧)
小伙伴们啊,我JS真的是个渣渣,所以总想要偷懒,于是为了实现效果就把tab插件给改了(各位大神轻拍啊,我是小白,很纯洁滴,小心脏也很脆弱)…… 最近做的项目为了考虑以后的移动设备兼容性,所以用了Boo ...
- Java SE (1)之 JFrame 组件 BorderLayout 布局
JAVA 初期,练习SE ,桌面程序, package com.sunzhiyan; import java.awt.*; import java.awt.event.*; import javax. ...
- 反射+javacsv+scv文件构建资源获取
1.反射之前已经写过,大家可以在http://www.cnblogs.com/myadmin/p/5282628.html中大概了解下.同时请大家指正. javacsv.jar:java中用来处理cs ...
- webrtc学习———记录三:mediaStreamTrack
参考: https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamTrack 转自http://c.tieba.baidu.com/p/3 ...
- Handler 原理分析和使用之HandlerThread
前面已经提到过Handler的原理以及Handler的三种用法.这里做一个非常简单的一个总结: Handler 是跨线程的Message处理.负责把Message推送到MessageQueue和处理. ...
- 通过javascript,使用struts2的ognl获取JavaBean的属性.
1)在Action中,声明一个Lock对象,并生成好setter/getter,在Action调用方法中(这里是findOnMap,需要先调用setLock方法设置好信息) private Lock ...