录音机和播放器会同时播放音频无法互相中断问题分析报告
1 关键字 audio_policy, interrupt 2 问题描述 OpenHarmony版本:3.1 Release 问题现象:在3.1 Release 版本中, 录音机和播放器播放音频会同时播放, 不会互相打断 3 问题原因 3.1 正常机制 当用录音机播放音频时,播放器的音频应该中断,反之亦然。 3.2 异常机制 当用录音机播放音频时,播放器的音频没有中断,仍在播放。 4 解决方案
1 关键字
audio_policy, interrupt
2 问题描述
OpenHarmony版本:3.1 Release
问题现象:在3.1 Release 版本中, 录音机和播放器播放音频会同时播放, 不会互相打断
3 问题原因
3.1 正常机制
当用录音机播放音频时,播放器的音频应该中断,反之亦然。
3.2 异常机制
当用录音机播放音频时,播放器的音频没有中断,仍在播放。
4 解决方案
修改音频中断策略配置文件foundation\multimedia\audio_standard\services\src\audio_policy\server\etc\audio_interrupt_policy_config.xml
4.1 在STREAM_MUSIC配置块中新增STREAM_MEDIA配置行
4.2 新增STREAM_MEDIA配置块
<audio_focus_policy> <stream_type value="STREAM_MUSIC"> <focus_table> <deny>nil</deny> <private> ... <stream_type value="STREAM_MEDIA" is_forced="true" action_type="PAUSE" action_on="existing"/> </private> </focus_table> </stream_type> <stream_type value="STREAM_MEDIA"> <focus_table> <deny>nil</deny> <private> <stream_type value="STREAM_MUSIC" is_forced="true" action_type="STOP" action_on="existing"/> <stream_type value="STREAM_VOICE_CALL" is_forced="true" action_type="PAUSE" action_on="existing"/> <stream_type value="STREAM_RING" is_forced="true" action_type="PAUSE" action_on="existing"/> <stream_type value="STREAM_MEDIA" is_forced="true" action_type="STOP" action_on="existing"/> </private> </focus_table> </stream_type> ... </audio_focus_policy>
4.3 audio_info.h中将MAX_NUM_STREAMS=3改为4
4.4 audio_focus_parser.cpp负责加载中断策略配置文件,其 streamMap 中新增STREAM_MEDIA关系
streamMap = { {"STREAM_RING", STREAM_RING}, {"STREAM_MUSIC", STREAM_MUSIC}, {"STREAM_VOICE_CALL", STREAM_VOICE_CALL}, {"STREAM_MEDIA", STREAM_MEDIA}, };
5 定位过程
5.1 音频中断策略的主要功能
当启动另一个音频,实现对当前音频的暂停、停止、静音等一系列策略性操作。因此从这里入手查找问题所在。
5.2 加载音频中断策略配置文件
默认的配置文件中只有通话、音乐、铃声这三种类型,对应的代码也只针对这三种类型进行了解析
MAX_NUM_STREAMS = 3
//执行中断策略的音频类型定义
enum AudioStreamType {
STREAM_VOICE_CALL = 0, //通话
STREAM_MUSIC = 1, //音乐
STREAM_RING = 2, //铃声
//闹钟,媒体,蓝牙,通知 ...
}
streamMap = {{"STREAM_RING", STREAM_RING}, {"STREAM_MUSIC", STREAM_MUSIC}, {"STREAM_VOICE_CALL", STREAM_VOICE_CALL} };
actionMap = { {"DUCK", INTERRUPT_HINT_DUCK}, {"PAUSE", INTERRUPT_HINT_PAUSE}, {"REJECT", INTERRUPT_HINT_NONE}, {"STOP", INTERRUPT_HINT_STOP}};
targetMap = { {"new", INCOMING}, {"existing", CURRENT}, {"both", BOTH} };
forceMap = { {"true", INTERRUPT_FORCE}, {"false", INTERRUPT_SHARE} };
//非deny节点的解析函数
void AudioFocusParser::ParseAllowedStreams(xmlNode *node, char *curStream)
{
...
AudioFocusEntry *pAction = pIntrAction + (streamMap[curStream] * MAX_NUM_STREAMS) + streamMap[newStream];
pAction->actionOn = targetMap[aTarget]; //对应‘action_on’属性, 配合其他属性进行逻辑处理
pAction->hintType = actionMap[aType]; //对应‘action_type‘属性,执行暂停,停止或静音
pAction->forceType = forceMap[isForced]; //对应'is_forced'属性
pAction->isReject = false; //如果为true,则拒绝执行中断操作,在‘deny’节点下解析的音频策略,该属性默认为true
...
}
5.3 代码分析
根据代码分析,AudioCapturerParams参数中声音抓取类型为STREAM_MEDIA,中断策略中没有配置该类型,所以在配置中需要增加该类型,具体修改方法参考第四步解决方案。
6 知识分享
除了以上四种类型,音频流还有其他多种类型定义,如还涉及其他音频流类型,客户需要根据自身需求增加中断策略中音频流信息的配置,然后对应修改解析代码。
更多推荐
所有评论(0)