热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BES(恒玄)提示音解析

今天,继续讲解BES平台UI最后模块---提示音.提示音这一块比较繁琐,也很容易出问题,我们就提示音实现机制,问题点做个全

今天,继续讲解BES平台 UI 最后模块--- 提示音.

提示音这一块比较繁琐,也很容易出问题,我们就 提示音实现机制,问题点 做个全面的讲解。

BES 提示音分为两种 触发模式 ,第一种是打断的 ,第二种是mix类型的 。

首先,说下 BES单机模式下 提示音执行流程和机制。

一、单机模式下的提示音流程

BES 提示音的 总入口 是 :app_voice_report(APP_STATUS_INDICATION_T status, uint8_t device_id)

其中 :APP_STATUS_INDICATION_T 枚举类型数据 提示音序号,用来索引提示音ID  ,device_id  表示设备号,一般是0.

通过“void trigger_media_play(AUD_ID_ENUM id, uint8_t devicSe_id, uint16_t aud_pram)”向主线程发出提示音任务请求.

然后跳转到 “app_audio_manager_handle_process”执行.

最后所有的提示音都会跑到“int app_play_audio_onoff(bool onoff, APP_AUDIO_STATUS* status)”里面,在这个函数里面可以设置提示音声道 /采样率 等属性。

最后在函数 “void media_Play_init_audio(uint16_t aud_id)”获取 SBC 数据(media_runtime_audio_prompt_update).

这个修改项一般 相对简单,对应ID 修改SBC原文件就好,例如:

在 res_audio_data.h 里面 找到对用的 提示音源文件并修改。

提示音SBC源文件在工程文件 目录下/config/_default_cfg_src_/res/en 里面

TWS 模式下的 提示音播放 就是在 提示音消息发出之前 增加 一些条件判断和同步等待。

二 、Merge 提示音

上面说的 都是 打断的提示音(会中断当前的音乐/通话),现在说下 mixer的提示音。

和SBC数据不一样,Merge提示音需要PCM(3:1) 格式的数据,所以需要占用更多的存储空间,源文件一般保存在/config/_default_cfg_src_/ring 里面

由于打断类型的提示音需要重复开关codec ,在通话的时候容易产生电流声进而传输带远端,所有在BES2300系列的软件里面需要用到merge提示音.

在WT230U 2300IU  2300IU1 2300ZP 系列早期的SDK 都需要关闭混合提示音的宏。

export MIX_AUDIO_PROMPT_WITH_A2DP_MEDIA_ENABLED ?= 0
export TWS_PROMPT_SYNC ?= 0

使用接口函数 :merge_startint app_ring_merge_start(void);merge_stop :int app_ring_merge_stop(void);

需要注意的是,这个接口都是单边有效,如果在TWS模式,需要自己添加提示音同步机制

当然后面出来的 2500系类 和 2300YP 后期SDK 已经解决了打开混合 提示音宏定义 导致的 死机或者卡顿问题,可以在target.mk里面直接打开

export MIX_AUDIO_PROMPT_WITH_A2DP_MEDIA_ENABLED ?= 1 也就不需要用到以上接口了 .

 

三、提示音常见问题:

1. 播放提示音没有声音

a. 设置声音过小导致:

早期代码在 Tgt_hardware.c里面配置提示音音量大小(第一个)

后面SDK更新后 提示音大小设置到了 app_media_player.cpp 里面设置

b.无法找到相关SBC数据文件,

一般我会在media_runtime_audio_prompt_update 函数最后添加打印“TRACE(1,"media_runtime_audio_prompt_update,current id is %d\n",id);”确认是否关联到了对应的SBC文件。

c.其他原因被打断的,根据上述提示音播放流程逐步跟踪。

d.merge提示音无法播放:

通话或者音乐播放的函数里面确认app_ring_merge_more_data 是否被执行。

2.TWS 提示音播放不同步 或者 副耳无提示音的问题

a. 单边播放问题 :检查当前提示音是否为 单边播放或只设置了单声道

b. 由于延迟偏差不同步导致的副耳无法播放:修改提示音TWS播放等待延迟.在app_ibrt_voice_report_trigger_init 函数里面修改 延迟.(具体数值以实际调试为准,下面数值仅作参考)

例如 :

if (report_role == VOICE_REPORT_MASTER){app_ibrt_voice_report_info_t voice_report_info;switch(aud_id){ /**Different prompt tone delays adjust for TWS sync by sanke**/case AUD_ID_BT_MIC_MUTE:case AUD_ID_BT_MIC_UNMUTE:case AUD_ID_BT_CONNECTED:tg_tick = curr_ticks + US_TO_BTCLKS(APP_PLAY_CONNECTED_AUDIO_SYNC_DELAY_US);tg_tick_tiemout = APP_PLAY_CONNECTED_AUDIO_SYNC_TRIGGER_TIMEROUT;break;case AUD_ID_BT_PAIRING:tg_tick = curr_ticks + US_TO_BTCLKS(APP_PLAY_AUDIO_SYNC_DELAY_US*2);tg_tick_tiemout = APP_PLAY_AUDIO_SYNC_TRIGGER_TIMEROUT*2;break;default:tg_tick = curr_ticks + US_TO_BTCLKS(APP_PLAY_AUDIO_SYNC_DELAY_US);tg_tick_tiemout=APP_PLAY_AUDIO_SYNC_TRIGGER_TIMEROUT;break;}
}
....///
else if (report_role == VOICE_REPORT_SLAVE){tg_tick = app_ibrt_voice_tg_tick;if (curr_ticks //......
}

 

修改函数app_ibrt_voice_report_set_trigger_time为如下:

static void app_ibrt_voice_report_set_trigger_time(uint32_t tg_tick,uint32_t tg_tick_timeout)
{if (tg_tick){ibrt_ctrl_t *p_ibrt_ctrl = app_ibrt_if_get_bt_ctrl_ctx();btif_connection_role_t connection_role = app_tws_ibrt_get_local_tws_role();btdrv_syn_trigger_codec_en(0);btdrv_syn_clr_trigger(0);btdrv_enable_playback_triggler(ACL_TRIGGLE_MODE);if (connection_role == BTIF_BCR_MASTER){bt_syn_set_tg_ticks(tg_tick, p_ibrt_ctrl->tws_conhandle, BT_TRIG_MASTER_ROLE,0);}else if (connection_role == BTIF_BCR_SLAVE){bt_syn_set_tg_ticks(tg_tick, p_ibrt_ctrl->tws_conhandle, BT_TRIG_SLAVE_ROLE,0);}btdrv_syn_trigger_codec_en(1);app_ibrt_voice_report_trigger_checker_start(tg_tick_timeout);TRACE_VOICE_RPT_I("[TRIG] set trigger tg_tick:%08x", tg_tick);}else{btdrv_syn_trigger_codec_en(0);btdrv_syn_clr_trigger(0);bt_syn_cancel_tg_ticks(0);app_ibrt_voice_report_trigger_checker_stop();TRACE_VOICE_RPT_I("[TRIG] trigger clear");}
}

3.混合提示音 声音大小:(audio_prompt_sbc.cpp)

在较新SDK里面打开 MIX_AUDIO_PROMPT_WITH_A2DP_MEDIA_ENABLED 后 如果在音乐播放状态容易出现 提示音播放导致声音忽大忽小的问题,请调整以下参数

DEFAULT_COEFF_FOR_MIX_PROMPT_FOR_MUSIC  

4. 固定提示音采样率(需要与SBC源文件采样率匹配)

5. 由于音频中断但merge_prompt还在运行播放导致的死机问题:

在int bt_sco_player(bool on, enum APP_SYSFREQ_FREQ_T freq) 和 int bt_sbc_player(enum PLAYER_OPER_T on, enum APP_SYSFREQ_FREQ_T freq) 处添加:

if(app_ring_merge_isrun()){app_ring_merge_stop();
} /***To slove painc case ,while call or music stop but tone is merge start !sanke***/

 

以上大致就是BES提示音 讲解和 常见问题点分析,有不当之处,请指正,谢谢!

后续会更新 IRBT对耳通讯和 EQ/ANC调试,敬请期待!


推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Annotation的大材小用
    为什么80%的码农都做不了架构师?最近在开发一些通用的excel数据导入的功能,由于涉及到导入的模块很多,所以开发了一个比较通用的e ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
author-avatar
时尚淘宝交__流站
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有