来电铃声有系统变量控制,而媒体和电话音量等由配置文件audio_volume_config.xml控制。 具体实现在audio_adapter_manager.cpp的init函数audiovolumeParser->LoadConfig(streamVolumeInfos_)加载配置。

#foundation/multimedia/audio_framework/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp

// LCOV_EXCL_START
bool AudioAdapterManager::Init()
{
    char testMode[10] = {0}; // 10 for system parameter usage
    auto res = GetParameter("debug.audio_service.testmodeon", "0", testMode, sizeof(testMode));
    if (res == 1 && testMode[0] == '1') {
        AUDIO_DEBUG_LOG("testMode on");
        testModeOn_ = true;
    }

    std::unique_ptr<AudioVolumeParser> audiovolumeParser = make_unique<AudioVolumeParser>();
    if (!audiovolumeParser->LoadConfig(streamVolumeInfos_)) {//在这里加载配置
        AUDIO_INFO_LOG("Audio Volume Config Load Configuration successfully");
        useNonlinearAlgo_ = 1;
        UpdateVolumeMapIndex();
    }

    // init volume before kvstore start by local prop for bootanimation
    char currentVolumeValue[3] = {0};
    auto ret = GetParameter("persist.multimedia.audio.ringtonevolume", "7",
        currentVolumeValue, sizeof(currentVolumeValue));
    if (ret > 0) {
        int32_t ringtoneVolumeLevel = atoi(currentVolumeValue);
        volumeDataMaintainer_.SetStreamVolume(STREAM_RING, ringtoneVolumeLevel);
        AUDIO_INFO_LOG("Init: Get ringtone volume to map success %{public}d",
            volumeDataMaintainer_.GetStreamVolume(STREAM_RING));
    } else {
        AUDIO_ERR_LOG("Init: Get volume parameter failed %{public}d", ret);
    }

进一步跟踪audiovolumeParser->LoadConfig函数,发现配置来自文件AUDIO_VOLUME_CONFIG_FILE

#server/src/service/config/audio_volume_parser.cpp
int32_t AudioVolumeParser::LoadConfig(StreamVolumeInfoMap &streamVolumeInfoMap)
{
    AUDIO_INFO_LOG("Load Volume Config xml");
    int ret = ERROR;
#ifdef USE_CONFIG_POLICY
    CfgFiles *cfgFiles = GetCfgFiles(AUDIO_VOLUME_CONFIG_FILE);
    if (cfgFiles == nullptr) {
        AUDIO_ERR_LOG("Not found audio_volume_config.xml!");
        std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
            Media::MediaMonitor::AUDIO, Media::MediaMonitor::LOAD_CONFIG_ERROR,
            Media::MediaMonitor::FAULT_EVENT);
        bean->Add("CATEGORY", Media::MediaMonitor::AUDIO_VOLUME_CONFIG);
        Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
        return ERROR;
    }

    for (int32_t i = MAX_CFG_POLICY_DIRS_CNT - 1; i >= 0; i--) {
        if (cfgFiles->paths[i] && *(cfgFiles->paths[i]) != '\0') {
            AUDIO_INFO_LOG("volume config file path:%{public}s", cfgFiles->paths[i]);
            ret = ParseVolumeConfig(cfgFiles->paths[i], streamVolumeInfoMap);
            break;
        }
    }
    FreeCfgFiles(cfgFiles);
#else
    ret = ParseVolumeConfig(AUDIO_VOLUME_CONFIG_FILE, streamVolumeInfoMap);
    AUDIO_INFO_LOG("use default volume config file path:%{public}s", AUDIO_VOLUME_CONFIG_FILE);
#endif
    return ret;
}

在audio_volume_parser.h中可以查到AUDIO_VOLUME_CONFIG_FILE定义。这就是默认的参数来源

 ./foundation/multimedia/audio_framework/services/audio_policy/server/config/audio_volume_config.xml

#ifdef USE_CONFIG_POLICY
static constexpr char AUDIO_VOLUME_CONFIG_FILE[] = "etc/audio/audio_volume_config.xml";
#else
static constexpr char AUDIO_VOLUME_CONFIG_FILE[] = "system/etc/audio/audio_volume_config.xml";
#endif

#./foundation/multimedia/audio_framework/services/audio_policy/etc/audio_config.para
persist.multimedia.audio.ringtonevolume = 7

#./foundation/multimedia/audio_framework/services/audio_policy/server/config/audio_volume_config.xml
<audio_volume_config>
    <volume_type type="VOICE_CALL" minidx="1" maxidx="15" defaultidx="12">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-4200"/>
            <point idx="33"  decibel="-2800"/>
            <point idx="66"  decibel="-900"/>
            <point idx="100" decibel="-0"/>
        </volumecurve>
        <volumecurve deviceClass="speaker">    
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <point idx="66"  decibel="-900"/>
            <point idx="100" decibel="-0"/>
        </volumecurve>
        <volumecurve deviceClass="headset">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <point idx="66"  decibel="-900"/>
            <point idx="100" decibel="-0"/>
        </volumecurve>
    </volume_type>
    <volume_type type="MUSIC" minidx="0" maxidx="15" defaultidx="12">
......
    </volume_type>
    <volume_type type="RING" minidx="0" maxidx="15" defaultidx="12">
......

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐