流程框图

初始化
开机的时候,系统会从数据库中更新当前的音量值给各个音频流
// 根据数据库的配置创建流的状态
private void createStreamStates() {
int numStreamTypes = AudioSystem.getNumStreamTypes();
VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes];
for (int i = 0; i < numStreamTypes; i++) {
streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i); // VolumeStreamState 构造
}
checkAllAliasStreamVolumes(); // 更新音量到设备中
}
// 在数据库中读取每个设备的流音量
private VolumeStreamState(String settingName, int streamType) {
mVolumeIndexSettingName = settingName;
mStreamType = streamType;
mIndexMax = MAX_STREAM_VOLUME[streamType];
AudioSystem.initStreamVolume(streamType, 0, mIndexMax);
mIndexMax *= 10;
// mDeathHandlers must be created before calling readSettings()
mDeathHandlers = new ArrayList<VolumeDeathHandler>();
readSettings(); // 从数据库中读取数据,每个设备有自己独立的音量
}
// 数据库中键值的拼接方法,exp: volume_music_speaker
public String getSettingNameForDevice(int device) {
String name = mVolumeIndexSettingName;
String suffix = AudioSystem.getDeviceName(device);
if (suffix.isEmpty()) {
return name;
}
return name + "_" + suffix;
}
// 更新音量到设备中
private void checkAllAliasStreamVolumes() {
int numStreamTypes = AudioSystem.getNumStreamTypes();
for (int streamType = 0; streamType < numStreamTypes; streamType++) {
if (streamType != mStreamVolumeAlias[streamType]) {
mStreamStates[streamType].
setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]]);
}
// apply stream volume
if (!mStreamStates[streamType].isMuted()) {
mStreamStates[streamType].applyAllVolumes(); // 更新设备音量
}
}
}
音量调整
上层通过java层接口设置音量,该流程主要分析 AudioService.java 提供的 setStreamVolume 接口
// AudioService.java 设置音量入口
public void setStreamVolume(int streamType, int index, int flags) {
IAudioService service = getService();
try {
if (mUseMasterVolume) {
service.setMasterVolume(index, flags, m

本文详细介绍了Android系统音频流的初始化、音量调整过程,包括从数据库读取音量、设置音量的步骤。同时,提供了常用的调试手段,如使用DumpSys查询系统音量,通过sqlite3查看音量设置,并展示了如何打开Audio模块的日志以及查询Mixer设备状态。此外,还介绍了如何通过命令行工具amix和alsa_amixer查询和修改设备音量。
最低0.47元/天 解锁文章
3630

被折叠的 条评论
为什么被折叠?



