OpenHarmony5.0.3设置媒体默认输出最大音量
摘要: 本文分析了OpenHarmony 5.0.3 Release系统中媒体音量默认设置为最大值一半的问题。通过grep搜索"defaultLevel"关键字定位到音量配置文件audio_volume_parser.cpp,梳理了音量配置的解析流程。研究发现系统从audio_volume_config.xml配置文件中读取defaultidx属性值作为默认音量级别。文章提供了
·
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 效果
开机后插上耳机 =》点击音乐播放器,播放音乐 =》声音很大,满足我的需求了
可以看 设置=》声音 =》媒体的音量条也是拉满了

更多推荐



所有评论(0)