Android audio 8.0 AudiopolicyManage 分析设置音量时序分析及checkAndSetVolume解析


//如果请求的流已经被Mute, 则不能调节该流的音量判断AUDIO_STREAM_VOICE_CALL或AUDIO_POLICY_FORCE_BT_SCO的情况如果传入的设备是空,
//使用output当前使用的音量获得需要调节音量的分贝值把音量传到AudioFlinger计算并设置Voice的音量


status_t AudioPolicyManager::checkAndSetVolume(audio_stream_type_t stream,
                                                   int index,
                                                   const sp& outputDesc,
                                                   audio_devices_t device,
                                                   int delayMs,
                                                   bool force)
{
    // do not change actual stream volume if the stream is muted
    if (outputDesc->mMuteCount[stream] != 0) {
        ALOGVV("checkAndSetVolume() stream %d muted count %d",
              stream, outputDesc->mMuteCount[stream]);
        return NO_ERROR;
    }
    audio_policy_forced_cfg_t forceUseForComm =
            mEngine->getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION);
    // do not change in call volume if bluetooth is connected and vice versa
    if ((stream == AUDIO_STREAM_VOICE_CALL && forceUseForComm == AUDIO_POLICY_FORCE_BT_SCO) ||
        (stream == AUDIO_STREAM_BLUETOOTH_SCO && forceUseForComm != AUDIO_POLICY_FORCE_BT_SCO)) {
        ALOGV("checkAndSetVolume() cannot set stream %d volume with force use = %d for comm",
             stream, forceUseForComm);
        return INVALID_OPERATION;
    }

    if (device == AUDIO_DEVICE_NONE) {
        device = outputDesc->device();
    }
    // 4. 获得需要调节音量的分贝值
    //  这里主要是调用volIndexToDb完成,
    float volumeDb = computeVolume(stream, index, device);
    if (outputDesc->isFixedVolume(device)) {
        volumeDb = 0.0f;
    }
    // 5. 把音量传到AudioFlinger
    //  AudioFlinger是音量调节的执行者,AudioPolicy是决策者,AudioOutputDescriptor
    //在SwAudioOutputDescriptor类中AudioOutputDescriptor.cpp
    outputDesc->setVolume(volumeDb, stream, device, delayMs, force);

    if (stream == AUDIO_STREAM_VOICE_CALL ||
        stream == AUDIO_STREAM_BLUETOOTH_SCO) {
        float voiceVolume;
        // Force voice volume to max for bluetooth SCO as volume is managed by the headset
        if (stream == AUDIO_STREAM_VOICE_CALL) {
            // 计算出Voice流的音量
            voiceVolume = (float)index/(float)mVolumeCurves->getVolumeIndexMax(stream);
        } else {
            // 对于AUDIO_STREAM_BLUETOOTH_SCO流,蓝牙侧会调节音量,所以这里会使用最大音量值
            voiceVolume = 1.0;
        }

        if (voiceVolume != mLastVoiceVolume) {
            //直接调用AudioFlinger的接口setVoiceVolume
            mpClientInterface->setVoiceVolume(voiceVolume, delayMs);
            mLastVoiceVolume = voiceVolume;
        }
    }

    return NO_ERROR;
}

Android audio 8.0 AudiopolicyManage 分析设置音量时序分析及checkAndSetVolume解析_第1张图片 标题

 

你可能感兴趣的:(Audio)