Android音量设置流程及调试方法

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

流程框图

在这里插入图片描述

初始化

开机的时候,系统会从数据库中更新当前的音量值给各个音频流

// 根据数据库的配置创建流的状态
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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值