鸿蒙HarmonyOS NEXT开发(5.0)音频并发策略扩展(C/C++)

 鸿蒙HarmonyOS开发实战往期必看文章:(持续更新......)

HarmonyOS NEXT应用开发性能实践总结(持续更新......)

HarmonyOS NEXT应用开发案例实践总结合集(持续更新......)

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


HarmonyOS音频系统本身会根据播放音频的流类型指定默认并发策略,音频会话是HarmonyOS音频系统对默认音频并发策略的一个扩展,应用可以使用音频会话来定制化自身应用并发时的策略,满足应用特定的使用场景。

  • 应用连续播放短音频时不希望后台被暂停的媒体应用漏音,可以通过申请音频会话来确保整个播放过程的有机统一。

  • 系统默认的并发策略不满足应用播放诉求时,应用通过申请音频会话并指定特定策略来实现应用自身并发的诉求。

音频会话流程示意图:

使用入门

应用要使用OHAudio提供的音频会话管理能力,需要添加对应的头文件。

在 CMake 脚本中链接动态库

target_link_libraries(sample PUBLIC libohaudio.so)

添加头文件

应用通过引入native_audio_session_manager.h头文件,使用音频播放相关API。

#include <ohaudio/native_audio_session_manager.h>

音频会话策略

在多音频并发,即多个音频流同时播放场景下,应用可以主动设置音频会话策略,控制当前应用获取音频焦点后其它正在播放音频应用的行为。

音频并发模式

当默认模式下的策略不能满足应用需求场景时应用可通过配置音频并发模式改变默认策略。

音频并发模式预设了四种音频并发模式:

下列各模式下的适用场景分别描述配置该模式前的焦点策略和配置该模式后的焦点策略,应用可根据需求选择需要配置的音频并发模式。

  • 默认模式(CONCURRENCY_DEFAULT):即未使用音频会话策略时的默认并发策略。

  • 混音模式(CONCURRENCY_MIX_WITH_OTHERS):和其它正在播放应用进行混音。

    正在播放的应用采取了混音模式和后来申请播放的应用的作用关系:

    配置该模式前的应用行为配置该模式后的应用行为
    正在播放的应用拒绝后来申请播放的应用正在播放的应用可以和后来申请播放的应用混音播放
    正在播放的应用暂停后来申请播放的应用正在播放的应用可以和后来申请播放的应用混音播放
    正在播放的应用压低后来申请播放的应用的音量正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用压低正在播放的应用的音量若正在播放的应用和后来申请播放的应用具有相近的类型,则正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用暂停正在播放的应用若正在播放的应用和后来申请播放的应用具有相近的类型,则正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用停止正在播放的应用若正在播放的应用和后来申请播放的应用具有相近的类型,则正在播放的应用可以和后来申请播放的应用混音播放

    后来播放的应用采取了混音模式和正在播放的应用的作用关系:

    配置该模式前的应用行为配置该模式后的应用行为
    正在播放的应用拒绝后来申请播放的应用若正在播放的应用和后来申请播放的应用具有相近的类型,正在播放的应用可以和后来申请播放的应用混音播放
    正在播放的应用暂停后来申请播放的应用若正在播放的应用和后来申请播放的应用具有相近的类型,正在播放的应用可以和后来申请播放的应用混音播放
    正在播放的应用压低后来申请播放的应用的音量若正在播放的应用和后来申请播放的应用具有相近的类型,正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用压低正在播放的应用的音量正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用暂停正在播放的应用正在播放的应用可以和后来申请播放的应用混音播放
    后来申请播放的应用停止正在播放的应用正在播放的应用可以和后来申请播放的应用混音播放
  • 混音降低音量模式(CONCURRENCY_DUCK_OTHERS):后来播放应用压低正在播放应用的音量。

    后来申请播放的应用采取了压低音量的策略和正在播放的应用的作用关系:

    配置该模式前的应用行为配置该模式后的应用行为
    后来申请播放的应用暂停正在播放的应用后来申请播放的应用压低正在播放应用的音量
    后来申请播放的应用停止正在播放的应用后来申请播放的应用压低正在播放应用的音量
  • 暂停模式(CONCURRENCY_PAUSE_OTHERS):后来播放应用暂停正在播放应用。

    后来申请播放的应用采取了暂停的策略和正在播放的应用的作用关系:

    配置该模式前的应用行为配置该模式后的应用行为
    后来申请播放的应用停止正在播放的应用后来申请播放的应用暂停正在播放的应用

音频会话停用事件

在应用激活音频会话时,推荐应用监听音频会话停用事件,当音频会话停止事件发生时,系统会根据音频会话停用原因,对相关音频流做出相应的操作。

若应用想重新通过音频会话定制并发策略,需要重新激活音频会话。

音频会话停用原因

音频会话停用原因预设了两种停用原因:

  • 应用焦点被抢占(DEACTIVATED_LOWER_PRIORITY):清除其占位焦点,伴随正在播放的应用的焦点释放。

  • 超时(DEACTIVATED_TIME_OUT):应用创建音频会后或者播放停流超过系统默认的时长后,系统会上报会话超时事件。这时被该会话压低音量的播放应用音量恢复为原来大小,被该会话暂停的播放应用会收到停止播放的焦点事件。

获取音频会话管理器

创建OH_AudioSessionManager实例。在使用音频会话管理功能前,需要先通过OH_AudioManager_GetAudioSessionManager创建音频会话管理实例。

OH_AudioSessionManager *audioSessionManager;
OH_AudioManager_GetAudioSessionManager(&audioSessionManager);

激活音频会话

应用可以通过OH_AudioSessionManager_ActivateAudioSession接口激活当前应用的音频会话。

OH_AudioSession_Strategy strategy = {CONCURRENCY_MIX_WITH_OTHERS};

OH_AudioSessionManager_ActivateAudioSession(audioSessionManager, &strategy);

停用音频会话

使用结束后,应用确保通过OH_AudioSessionManager_DeactivateAudioSession接口停用当前应用的音频会话。

OH_AudioSessionManager_DeactivateAudioSession(audioSessionManager);

查询音频会话是否已激活。

应用可以通过OH_AudioSessionManager_IsAudioSessionActivated接口检查当前应用的音频会话是否已激活。

bool isActivated = OH_AudioSessionManager_IsAudioSessionActivated(audioSessionManager);

注册音频会话停用事件回调&取消注册音频会话停用事件回调

定义回调函数

int32_t MyAudioSessionDeactivatedCallback(OH_AudioSession_DeactivatedEvent event)
{
switch(event.reason) {
case DEACTIVATED_LOWER_PRIORITY:
// 应用焦点被抢占
return 0;
case DEACTIVATED_TIMEOUT:
// 超时
return 0;
}
}

注册音频会话停用事件回调

应用可以通过OH_AudioSessionManager_RegisterSessionDeactivatedCallback接口监听音频会话停用事件。

OH_AudioSessionManager_RegisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);

取消注册音频会话停用事件回调

应用可以通过OH_AudioSessionManager_UnregisterSessionDeactivatedCallback接口取消监听音频会话停用事件。

OH_AudioSessionManager_UnregisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);

完整示例

参考以下示例,完成音频会话从创建到激活并监听的过程。

#include <cstdint>
#include "ohaudio/native_audio_session_manager.h"

int32_t MyAudioSessionDeactivatedCallback(OH_AudioSession_DeactivatedEvent event)
{
  switch(event.reason) {
    case DEACTIVATED_LOWER_PRIORITY:
      // 应用焦点被抢占
      return 0;
    case DEACTIVATED_TIMEOUT:
      // 超时
      return 0;
  }
}

OH_AudioSessionManager *audioSessionManager;

// 创建音频会话管理器
OH_AudioCommon_Result resultManager = OH_AudioManager_GetAudioSessionManager(&audioSessionManager);

OH_AudioSession_Strategy strategy = {CONCURRENCY_MIX_WITH_OTHERS};

// 设置音频并发模式并激活音频会话
OH_AudioCommon_Result resultActivate = OH_AudioSessionManager_ActivateAudioSession(audioSessionManager, &strategy);

// 查询音频会话是否已激活。
bool isActivated = OH_AudioSessionManager_IsAudioSessionActivated(audioSessionManager);

// 监听音频会话停用事件
OH_AudioCommon_Result resultRegister = OH_AudioSessionManager_RegisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);

// 音频会话激活后应用在此处正常执行音频播放、暂停、停止、释放等操作即可。 

// 取消监听音频会话停用事件
OH_AudioCommon_Result resultUnregister = OH_AudioSessionManager_UnregisterSessionDeactivatedCallback(audioSessionManager, MyAudioSessionDeactivatedCallback);

// 停用音频会话
OH_AudioCommon_Result resultDeactivate = OH_AudioSessionManager_DeactivateAudioSession(audioSessionManager);

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记  希望这一份鸿蒙学习文档能够给大家带来帮助~

这份鸿蒙(HarmonyOS NEXT)包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值