干,认识Audio框架还因此发现一个雷
我们最近出了一个问题,我们点击播放音乐,然后再点击停止播放的时候,喇叭还会输出一段杂音后喇叭才会停止输出。
经过排查发现,在代码里面就做了这个功能
代码在AudioFlinger.h 里
frameworks/av/services/audioflinger/AudioFlinger.h
为啥有这个功能?
我咨询了一个大佬,是这样回复的
这个操作应该是做来解决一直开关导致的po音的 看看有没有数据帧的callback在停的时候有没有再被调用,你关了3S秒是有可能有popo音的
再声明下,这个 3s 的时间是Google默认设定的时间,如果是做音频的同学,可以关注一下这个特性,而且是自己的产品的话,需要根据自己的要求进行修改。
来一张audio框架图片
Audio代码位置
AudioTrack.java
framework/base/media/java/com/android/media/AudioTrack.java
android_media_track.cpp
framework/base/core/jni/android_media_track.cpp
MemoryHeapBase
framework/base/libs/binder/MemoryHeapBase.cpp
MemoryBase.h
framework/base/include/binder/MemoryBase.h
AudioTrack.cpp
framework/base/libmedia/AudioTrack.cpp
audio_track_cblk_t声明
framework/base/include/private/media/AudioTrackShared.h
audio_track_cblk_t定义
framework/base/media/libmedia/AudioTrack.cpp
Main_MediaServer.cpp
framework/base/media/mediaserver/Main_MediaServer.cpp
AudioFlinger.cpp
framework/base/libs/audioFlinger/AudioFlinger.cpp
AudioHardwareInterface.h 不同厂商的HAL位置会不同
hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h
AudioMixer.cpp
framework/base/libs/audioflinger/AudioMixer.cpp
AudioSystem.h
framework/base/include/media/AudioSystem.h
AudioSystem.cpp
framework/base/media/libmedia/AudioSystem.cpp
AudioPolicyInterface.h
hardware/libhardware_legacy/include/hardware_legacy
AudioPolicyManagerBase.cpp
framework/base/libs/audioflinger/AudioPolicyManagerBase.cpp
AudioService.java
framework/base/media/java/com/android/media/AudioService.java
Android_media_AudioSystem.cpp
framework/base/core/Jni/Android_media_AudioSystem.cpp
主要要关注audioflinger和audiopolicy这两个服务
再看看一些调用关系的图片
AudioTrack
AudioTrack属于Audio系统对外提供的API接口类,在java层和native层都有对应类。
AudioFlinger
AudioFlinger是audio的核心,AudioTrack的数据需要经过AudioFlinger进行混音等处理,这里的数据最终会写入到Audio 的HAL层。
audioFlinger和audiopolicy实例化
AudioFlinger::instantiate();
AudioPolicyService::instantiate();
AudioPolicy
AudioFlinger控制的是输入和输出,AudioPolicyService控制着整个音频系统,所以AudioPolicy创建完成后,音频系统也就开始工作了。
我们在很多地方看到有资料说的,AudioPolicy是音频系统的策略管理系统,也就是这个意思。
评论