Android Framework学习笔记 -- Audio调节音量流程

本文详细介绍了Android音量调节的流程,涉及AudioStream类型、SDK API、Java Service、C++ AudioSystem、AudioPolicyService及AudioFlinger等多个层面。在不同设备和流类型下,音量调节操作通过AudioPolicyManager进行音频策略判断,并通过AudioFlinger最终设置到具体播放线程,实现音量的调整。
摘要由CSDN通过智能技术生成

Audio调节音量流程

流程图 Audio音量调节是一级一级调节,而且分不同的流类型,如响铃,通话,多媒体等。不同的设备(蓝牙设备)的设置方法有所区别。

sdk的api,设置相应流的音量。不同的流index的范围不一样

//--->frameworks/base/media/java/android/media/AudioManager.java
public void setStreamVolume(int streamType, int index, int flags) {
    IAudioService service = getService();
    try {
        service.setStreamVolume(streamType, index, flags, 
            getContext().getOpPackageName());
    } catch (RemoteException e) {
        Log.e(TAG, "Dead object in setStreamVolume", e);
    }
}

java层Service实现,volume的调节的实现是用state模式来实现,可能需要原子性或不同的模式下调节音量的操作不同。

//--->frameworks/base/services/core/java/com/android/server/audio/AudioService.java
private void setStreamVolume(int streamType, int index, int flags, 
    String callingPackage,String caller, int uid) {

    ...(检查参数)
    ...(转换参数)

    // 获取设备
    final int device = getDeviceForStream(streamType);
    ...(特殊处理a2dp)
    ...(检查uid,实体按键调节音量需要判断当前用户?)

    synchronized (mSafeMediaVolumeState) {
        mPendingVolumeCommand = null;
        oldIndex = streamState.getIndex(device);
        index = rescaleIndex(index * 10, streamType, streamTypeAlias);

        ...(特殊处理a2dp)
        ...(特殊处理HDMI)
        ...(设置一些标志位,如标记一些不可调节音量的设备)

        //检查当前是否可设置音量
        if (!checkSafeMediaVolume(streamTypeAlias, index, device)) {
            // 不可以则生成PendingCommand,等待合适的时机
            mVolumeController.postDisplaySafeVolumeWarning(flags);
            mPendingVolumeCommand = new StreamVolumeCommand(
                streamType, index, flags, device);
        } else {
            // 设置音量
            onSetStreamVolume(streamType, index, flags, device, 
                caller);
            index = mStreamStates[streamType].getIndex(device);
        }
    }

    // 发送更新音量信息
    sendVolumeUpdate(streamType, oldIndex, index, flags);
}

private void onSetStreamVolume(int streamType, int index, int flags, 
    int device,String caller) {
    final int stream = mStreamVolumeAlias[streamType];
    // 设置音量
    setStreamVolumeInt(stream, index, device, false, caller);

    ...(判断音量是否为0,调节模式(静音或响铃))
    mStreamStates[stream].mute(index == 0);
}

private void setStreamVolumeInt(int streamType,int index,int device,
    boolean force,String caller) {
    VolumeStreamState streamState = mStreamStates[streamType];
    if (streamState.setIndex(index, device, caller) || force) {
        // Post me
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值