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 知识分享

除了以上四种类型,音频流还有其他多种类型定义,如还涉及其他音频流类型,客户需要根据自身需求增加中断策略中音频流信息的配置,然后对应修改解析代码。

Logo

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

更多推荐