1)文章由移远通信技术股份有限公司提供
   2)以下内容包含了个人理解,仅供参考,如有不合理处,请联系笔者修改/删除,18777493676(微信同号)。

一、关键字

OpenHarmony 5.0.3 Release;媒体;最大音量;volume

二、问题描述

2.1 运行环境

  • 系统版本:OpenHarmony-5.0.3-Release(以该版本为基线)
  • 硬件:RK3562

2.2 问题现象

系统默认媒体声音是最大音量的一半

2.3 预期效果

由于我的板子上没有喇叭,接耳机声音感觉太小,
我希望声音默认就是最大

三、找到音量配置文件

3.1 通过defaultLevel关键字找到解析音量配置的cpp文件

quectel@6bfac9e0cb88:/home/openharmony$ grep -nr "defaultLevel" foundation/multimedia/audio_framework/
foundation/multimedia/audio_framework/services/audio_policy/server/include/service/common/audio_volume_config.h:40:    int defaultLevel;
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp:175:    streamVolInfo->defaultLevel = atoi(pValue);
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/audio_policy_service.cpp:8564:        AppendFormat(dumpString, "defaultLevel = %d\n", streamVolumeInfo->defaultLevel);
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/manager/audio_adapter_manager.cpp:1806:        volumeDataMaintainer_.SetStreamVolume(streamVolInfo->streamType, streamVolInfo->defaultLevel);
quectel@6bfac9e0cb88:/home/openharmony$

通过名字可以知道audio_volume_parser.cpp文件是解析音量配置的

3.2 梳理解析逻辑

//foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp
AudioVolumeParser::LoadConfig
	CfgFiles *cfgFiles = GetCfgFiles(AUDIO_VOLUME_CONFIG_FILE);
	AudioVolumeParser::ParseVolumeConfig
		AudioVolumeParser::ParseStreamInfos
			AudioVolumeParser::ParseStreamVolumeInfoAttr
				    pValue = reinterpret_cast<char*>(xmlGetProp(currNode,reinterpret_cast<xmlChar*>(const_cast<char*>("defaultidx"))));
				    streamVolInfo->defaultLevel = atoi(pValue);                   <===========获取默认音量 
//foundation/multimedia/audio_framework/services/audio_policy/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;
}

//foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp
int32_t AudioVolumeParser::ParseVolumeConfig(const char *path, StreamVolumeInfoMap &streamVolumeInfoMap)
{
    xmlDoc *doc = nullptr;
    xmlNode *rootElement = nullptr;
    doc = xmlReadFile(path, nullptr, 0);
    if (doc == nullptr) {
        WriteVolumeConfigErrorEvent();
        return ERROR;
    }
    rootElement = xmlDocGetRootElement(doc);
    xmlNode *currNode = rootElement;
    CHECK_AND_RETURN_RET_LOG(currNode != nullptr, ERROR, "root element is null");
    if (xmlStrcmp(currNode->name, reinterpret_cast<const xmlChar*>("audio_volume_config"))) {
        AUDIO_ERR_LOG("Missing tag - audio_volume_config in : %s", path);
        WriteVolumeConfigErrorEvent();
        xmlFreeDoc(doc);
        return ERROR;
    }
    if (currNode->children) {
        currNode = currNode->children;
    } else {
        AUDIO_ERR_LOG("empty volume config in : %s", path);
        WriteVolumeConfigErrorEvent();
        xmlFreeDoc(doc);
        return ERROR;
    }

    while (currNode != nullptr) {
        if ((currNode->type == XML_ELEMENT_NODE) &&
            (!xmlStrcmp(currNode->name, reinterpret_cast<const xmlChar*>("volume_type")))) {
            ParseStreamInfos(currNode, streamVolumeInfoMap);       <=====走这里
            break;
        } else {
            currNode = currNode->next;
        }
    }

    xmlFreeDoc(doc);
    return SUCCESS;
}

//foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp
void AudioVolumeParser::ParseStreamInfos(xmlNode *node, StreamVolumeInfoMap &streamVolumeInfoMap)
{
    xmlNode *currNode = node;
    AUDIO_DEBUG_LOG("AudioVolumeParser::ParseStreamInfos");
    while (currNode) {
        if (currNode->type == XML_ELEMENT_NODE
            && (!xmlStrcmp(currNode->name, reinterpret_cast<const xmlChar*>("volume_type")))) {
            std::shared_ptr<StreamVolumeInfo> streamVolInfo = std::make_shared<StreamVolumeInfo>();
            ParseStreamVolumeInfoAttr(currNode, streamVolInfo);                 <=====走这里
            ParseDeviceVolumeInfos(currNode->children, streamVolInfo);
            AUDIO_DEBUG_LOG("Parse streamType:%{public}d ", streamVolInfo->streamType);
            streamVolumeInfoMap[streamVolInfo->streamType] = streamVolInfo;
        }
        currNode = currNode->next;
    }
}

//foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp
void AudioVolumeParser::ParseStreamVolumeInfoAttr(xmlNode *node, std::shared_ptr<StreamVolumeInfo> &streamVolInfo)
{
    xmlNode *currNode = node;
    AUDIO_DEBUG_LOG("AudioVolumeParser::ParseStreamVolumeInfoAttr");
    char *pValue = reinterpret_cast<char*>(xmlGetProp(currNode,
        reinterpret_cast<xmlChar*>(const_cast<char*>("type"))));
    streamVolInfo->streamType = audioStreamMap_[pValue];
    AUDIO_DEBUG_LOG("stream type: %{public}s; currNode->name %{public}s;", pValue, currNode->name);
    xmlFree(pValue);

    pValue = reinterpret_cast<char*>(xmlGetProp(currNode,
        reinterpret_cast<xmlChar*>(const_cast<char*>("minidx"))));
    streamVolInfo->minLevel = atoi(pValue);
    AUDIO_DEBUG_LOG("minidx: %{public}d", atoi(pValue));
    xmlFree(pValue);

    pValue = reinterpret_cast<char*>(xmlGetProp(currNode,
        reinterpret_cast<xmlChar*>(const_cast<char*>("maxidx"))));
    streamVolInfo->maxLevel = atoi(pValue);
    AUDIO_DEBUG_LOG("minidx: %{public}d", atoi(pValue));
    xmlFree(pValue);

    pValue = reinterpret_cast<char*>(xmlGetProp(currNode,
        reinterpret_cast<xmlChar*>(const_cast<char*>("defaultidx"))));
    streamVolInfo->defaultLevel = atoi(pValue);                   <===========获取默认音量            
    AUDIO_DEBUG_LOG("defaultidx: %{public}d", atoi(pValue));
    xmlFree(pValue);
}

3.3找到音量配置文件

  • 源码中搜索
quectel@6bfac9e0cb88:/home/openharmony$  grep -nr "AUDIO_VOLUME_CONFIG_FILE" foundation/multimedia/audio_framework/
foundation/multimedia/audio_framework/services/audio_policy/server/include/service/config/audio_volume_parser.h:33:static constexpr char AUDIO_VOLUME_CONFIG_FILE[] = "etc/audio/audio_volume_config.xml";
foundation/multimedia/audio_framework/services/audio_policy/server/include/service/config/audio_volume_parser.h:35:static constexpr char AUDIO_VOLUME_CONFIG_FILE[] = "system/etc/audio/audio_volume_config.xml";
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp:108:    CfgFiles *cfgFiles = GetCfgFiles(AUDIO_VOLUME_CONFIG_FILE);
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp:128:    ret = ParseVolumeConfig(AUDIO_VOLUME_CONFIG_FILE, streamVolumeInfoMap);
foundation/multimedia/audio_framework/services/audio_policy/server/src/service/config/audio_volume_parser.cpp:129:    AUDIO_INFO_LOG("use default volume config file path:%{public}s", AUDIO_VOLUME_CONFIG_FILE);
quectel@6bfac9e0cb88:/home/openharmony$
//foundation/multimedia/audio_framework/services/audio_policy/server/include/service/config/audio_volume_parser.h
#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

  • 日志中也有打印
AudioVolumeParser: [LoadConfig]Load Volume Config xml
AudioVolumeParser: [LoadConfig]volume config file path:/system/etc/audio/audio_volume_config.xml
  • 找到源码中的xml文件
quectel@6bfac9e0cb88:/home/openharmony$ find foundation/multimedia/audio_framework/ -name audio_volume_config.xml
foundation/multimedia/audio_framework/services/audio_policy/server/config/audio_volume_config.xml
quectel@6bfac9e0cb88:/home/openharmony$

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="7">
        <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="7">   <=====这正是我们想找到的
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-3000"/>
            <point idx="33"  decibel="-2600"/>
            <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="RING" minidx="0" maxidx="15" defaultidx="7">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <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="VOICE_ASSISTANT" minidx="1" maxidx="15" defaultidx="7">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <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="ALARM" minidx="1" maxidx="15" defaultidx="7">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <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="ACCESSIBILITY" minidx="1" maxidx="15" defaultidx="7">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <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="ULTRASONIC" minidx="0" maxidx="15" defaultidx="15">
        <volumecurve deviceClass="earpiece">
            <point idx="0"   decibel="-2700"/>
            <point idx="33"  decibel="-1800"/>
            <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>
</audio_volume_config>

四、将音乐播放的音量默认设置为最大

4.1 修改源代码

修改/foundation/multimedia/audio_framework/services/audio_policy/server/config/audio_volume_config.xml
文件将媒体声音默认设置为最大

4.2 效果

开机后插上耳机 =》点击音乐播放器,播放音乐 =》声音很大,满足我的需求了

可以看 设置=》声音 =》媒体的音量条也是拉满了

在这里插入图片描述

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐