首先讲一下:调用简单过程app->native方法->(framework/base/media/libmedia)libmedia->(framework/base/service)audioflinger----aps->(hardware)上次父类都调用此子类AudioPolicyManagerBase.cpp->(alsa驱动前一级)alsa.so(在这一层是修改bug切换状态最多的地方)->底层驱动->硬件
1.
package/app--所有需要用到音频系统的app,调用音频设备的接口AudioSystem.setDeviceConnectionState 此方法在frameworks/base/media/java/android/media/AudioSystem.java中定义native类型(native的方法在AudioSystem.cpp的中定义----libmedia.so中)
-----上层的接口举例,具体实现在framework
上层使用哪种STREAM 在AudioManager.java中声明,并且在AudioSystem.java中赋值
例如,要使用通话音public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL; public static final int STREAM_VOICE_CALL = 0;
2.framework/base/media/libmedia/此接口实现在libmedia.so中/AudioSystem.cpp中
3.framework/base/services/audioflinger/AudioFlinger.cpp AudioPolicyService.cpp 到这里都是标准的audioflinger层
4. hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp||hardware/libhardware_legacy/audio/AudioPolicyCompatClient.cpp
5.alsa层
6.底层驱动层
7.硬件
整个android手机音频输出分类(select_output_device)
分如下3中mode,分如下输出设备:earpiece;spreaker;headset || headphone
1.in_call(在通话状态下,听筒的声音是通过AT命令直接调整2G/3g模块)
a:earpiece
b:spreaker
c:headset || headphone
d:bluetooth
2.ringtone
强制spreaker
3.normal
a:spreaker
b:headset || headphone
c:FM(单独的设备需要自己添加,android源码不支持这种设备)
d:FM&spreaker
e:alarm(从上层设下了是强制speaker)