BES音频框架分析---Audioflinger

这篇具有很好参考价值的文章主要介绍了BES音频框架分析---Audioflinger。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Audioflinger模块

音频策略的执行者,负责输入输出流设备的管理及音频流数据的处理传输。 Audioflinger.c完成af创建及音频流管理。

 af_open()

函数的调用:app_init(void)--->af_open();

函数内流程:

(1)初始化struct af_stream_cfg_t *role相关参数

(2)创建af_thread,并使用信号量机制完成线程同步,同时af线程内af_thread_stream_handler()会对是否信号丢失、dma地址指针非法,语音数据处理回调超时等做判断。

af_thread_tid = osThreadCreate(osThread(af_thread), NULL);
af_default_priority = af_get_priority();
osSignalSet(af_thread_tid, 0x0);

(3)af_thread_tid信号量的产生过程参考af_stream_open()

 App_audio 模块

app_audio_open()

函数的调用:app_init(void)--->app_audio_open();

函数内流程:

(1)初始化提示音模块,调用app_prompt_list_init()完成了内存空间申请,app_prompt_list申请,app_prompt_handler_tid创建;

 if (NULL == app_prompt_request_mempool)
    {
        app_prompt_request_mempool = osPoolCreate(osPool(app_prompt_request_mempool));
    }
    app_prompt_list = list_new(app_prompt_list_free, NULL, NULL);
    app_prompt_handler_tid = osThreadCreate(osThread(app_prompt_handler_thread), NULL);

(2)设置APP_MODUAL_AUDIO模块的回调app_audio_handle_process(),根据当前设置的APP_BT_SETTING_T完成音频流的开启app_bt_stream_open或关闭app_bt_stream_close处理,其内部维护了一个audio队列,依赖于宏定义 __AUDIO_QUEUE_SUPPORT__;

app_set_threadhandle(APP_MODUAL_AUDIO, app_audio_handle_process);

enum APP_BT_SETTING_T {
    APP_BT_SETTING_OPEN = 0,
    APP_BT_SETTING_CLOSE,
    APP_BT_SETTING_SETUP,
    APP_BT_SETTING_RESTART,
    APP_BT_SETTING_CLOSEALL,
    APP_BT_SETTING_CLOSEMEDIA,
    APP_BT_SETTING_NUM,
};

app_audio_list_append(&aud_status)//打开一个流需将其加入队列
app_audio_list_rmv_callback(&a2ud_status, &next_status, APP_BT_SETTING_Q_POS_HEAD)//关闭一个流需将其从队列中删除

(3)bt流触发器初始化app_bt_stream_init(),创建定时器,在音乐或电话流开启时启动定时器回调app_bt_stream_trigger_timeout_cb()向模块APP_MODUAL_AUDIO发消息进入回调app_audio_handle_process完成相应操作

osTimerCreate(osTimer(APP_BT_STREAM_TRIGGER_TIMEOUT), osTimerOnce, NULL);
app_audio_sendrequest_param(APP_BT_STREAM_A2DP_SBC, (uint8_t)APP_BT_SETTING_RESTART, 0, 0)
app_audio_sendrequest(APP_BT_STREAM_HFP_PCM, (uint8_t)APP_BT_SETTING_RESTART, 0);

(3) APP_BT_SETTING_T的产生过程参考bt_media_start()

 App_bt_media_manager模块

app_audio_manager_open()

函数的调用:app_init(void)--->app_audio_manager_open();

函数内流程:

(1)设置APP_MODUAL_AUDIO_MANAGE模块回调app_audio_manager_handle_process(),根据当前BT_MEDIA_MANAGER完成音乐、电话、提示音的开启bt_media_start或关闭bt_media_stop处理。

app_set_threadhandle(APP_MODUAL_AUDIO_MANAGE, app_audio_manager_handle_process);

enum APP_BT_MEDIA_MANAGER_ID_T {
    APP_BT_STREAM_MANAGER_START = 0,
    APP_BT_STREAM_MANAGER_STOP,
    APP_BT_STREAM_MANAGER_STOP_MEDIA,
    APP_BT_STREAM_MANAGER_UPDATE_MEDIA,
    APP_BT_STREAM_MANAGER_SWAP_SCO,
    APP_BT_STREAM_MANAGER_CTRL_VOLUME,
    APP_BT_STREAM_MANAGER_TUNE_SAMPLERATE_RATIO,
    APP_BT_STREAM_MANAGER_NUM,
};

(2) 通过调用audio_prompt_init_handler()---> memset((uint8_t *)&audio_prompt_env, 0, sizeof(audio_prompt_env));将提示音AUDIO_PROMPT_ENV_T初始化为0;

(3) APP_BT_SETTING_T的产生过程分音乐、电话、提示音三部分介绍

提示音流模块

app_voice_report()

函数的调用:在需要播放提示音的地方直接调用该接口

函数内流程:

(1) app_voice_report(APP_STATUS_INDICATION_T status, uint8_t device_id)是提示音总入口函数,APP_STATUS_INDICATION_T 枚举类型参数表示提示音序号,用来索引提示音ID  ,device_id  表示设备号,一般是0.

typedef enum APP_STATUS_INDICATION_T {
    APP_STATUS_INDICATION_POWERON = 0,
	APP_STATUS_INDICATION_AWAKEN,
              ······
}

(2)根据相关宏定义选择不同的提示音播放方式

void media_PlayAudio_locally(AUD_ID_ENUM id, uint8_t device_id)//仅本地播放
void media_PlayAudio_standalone_locally(AUD_ID_ENUM id, uint8_t device_id)//打断播放
void media_PlayAudio(AUD_ID_ENUM id,uint8_t device_id)//混合播放

(3) 如果是从耳发送命令给对端主耳播放app_tws_let_peer_device_play_audio_prompt()----->tws_ctrl_send_cmd(),如果是主耳发送提示音任务请求app_prompt_push_request()---->app_prompt_list_append(app_prompt_list, &req);---->osSignalSet(app_prompt_handler_tid, PROMPT_HANDLER_SIGNAL_NEW_PROMPT_REQ);

app_prompt_handler_thread()

函数的调用:app_prompt_list_init()--->app_prompt_handler_thread()

函数内流程: 

(1)收到信号PROMPT_HANDLER_SIGNAL_NEW_PROMPT_REQ后,根据当前是否有正在播放的提示音以及app_prompt_list是否为空,通过调用app_prompt_refresh_list来实现相关功能。

 (2)收到信号PPROMPT_HANDLER_SIGNAL_CLEAR_REQ后,先清除app_prompt_list,然后混合模式下发送PROMPT_HANDLER_SIGNAL_PLAYING_COMPLETED信号停止提示音,最后通过app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE, devId)---->app_audio_handle_process()完成提示音流的关闭。

(3)收到信号PROMPT_HANDLER_SIGNAL_PLAYING_COMPLETED,先标识当前没有正在播放的提示音,然后停止提示音保护定时器app_prompt_protector_timer,最后,调用app_prompt_refresh_list来实现相关功能。

app_prompt_refresh_list()

 函数的调用:app_prompt_handler_thread()--->app_prompt_refresh_list()

函数内流程: 

(1)如果当前有正在播放的提示音则退出,没有则继续判断app_prompt_list是否为空,如果为空则退出。

(2)如果app_prompt_list不为空,先标识当前有正在播放的提示音,然后调用app_prompt_文章来源地址https://www.toymoban.com/news/detail-412824.html

到了这里,关于BES音频框架分析---Audioflinger的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 安卓机型不需要解锁bl 不需要root 即可安装模块 框架 VirtualXposed使用步骤分析

    ​​​​​​安卓玩机教程---全机型安卓4----安卓12 框架xp edx lsp安装方法【一】 安卓系列机型 框架LSP 安装步骤 支持多机型 LSP框架通用安装步骤 通过以上两个博文基本可以了解手机正常安装框架的步骤。但很多机型局限于不能解锁bl和root,那么这些机型能不能使用框架和模

    2024年02月03日
    浏览(54)
  • Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块

    Sip网络音频对讲广播模块, sip网络寻呼话筒音频模块 一、模块介绍 SV-2101VP和 SV-2103VP网络音频对讲广播模块 是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议和音频编解码协议,可

    2024年02月10日
    浏览(35)
  • SIP网络音频模块SV-2401V网络对讲音频模块(支持POE)

    音频工作方式: 音频解码:即音频播放。接收来自网络的音频流,经过模块解码后通过线路输出高质量音频信号。目前支持可以播放以下音频格式:MP3、WAV (PCM +IMA ADPCM)、G.711、G.722等,可以播放最高48k采样率320kps的音频流。 接收网络中TCP、UDP、RTP、组播、广播等方式发过来

    2024年02月12日
    浏览(39)
  • FPGA-音频模块开发(一)

    本实验将实现音频模块和FPGA之间的数据通信,通过音频模块把麦克风输入的语音数据存储到SDRAM存储器里,再把音频数据发送给音频模块,从耳机接口进行语音的播放,从而实现录音和播放的功能。 这里简单介绍一下音频模块AN831用到的音频编/解码芯片WM8731。该芯片在本设计

    2023年04月10日
    浏览(32)
  • 【音频分析】音频短时时域分析

    音频文件或音频流的采样率通常是8K,16K,48K之类的,即每秒钟有8000、16000、48000个样本。以16K采样率为例,一个信号仅耗时0.0625ms,显然逐信号处理的富余时间太短了。因此和视频传输类似,音频的传输单位,是一个较短时间窗口的采样累积,广义地也可以称之为帧(frame)。传

    2023年04月08日
    浏览(27)
  • 展锐平台音频框架

    Audio DT介绍 1.概述 DT(Device Tree)是一种描述硬件的数据结构,DTS即设备树源码。 2.Audio DTS 文件架构 bspkernelkernel.4.14archarm64bootsprd ums512.dts   //SOC级相关节点 ——sc2730.dtsi  //Codec ——sharkl5Pro.dtsi  //Platform、VBC、I2S、audio misc ——sprd-sound-fe-be.dtsi //headsetsound card ——extr

    2024年02月10日
    浏览(39)
  • 音频开发之ALSA框架

    ALSA(Advanced Linux Sound Architecture)是Linux操作系统上用于提供音频和MIDI功能的软件架构。它为Linux系统提供了强大的音频支持,包括音频录制、播放和处理,它设计用于提供高性能、低延迟、高质量的音频处理,并为开发者提供了一组API和工具。 ALSA的涉及本身比较复杂,如果

    2024年01月23日
    浏览(100)
  • 2.4G无线麦克风无线音频传输模块

    模块概述 M01主要是一个2.4G无线音频传输模块,模组RF电路设计配合独有的软件跳频机制,有效提高了RF的抗干扰能力及传输距离。模组内置高性能的音频转换器,支持48K/24bit高品质的音频采样、支持麦克风的主动降噪,实现了无压缩的数字音频传输。 一、产品图片 说明:正

    2024年02月15日
    浏览(46)
  • Android 音频框架之配置文件解析

    理解Android 框架代码的一些基础,框架中操作的各种模块、设备、流、路由都是从哪里定义的?以及是怎么定义的?这个也是理解AAOS 中caraudioservice的基础,也是后续有关Audiopatch、AudioFlinger、Audiopolicy的基础。 本文从java层getDevice获取设备展开到框架中理解audio_policy_configurati

    2024年02月09日
    浏览(38)
  • alsa框架与音频芯片移植基础

    Alsa是Advanced Linux Sound Architecture的缩写,即高级Linux声音架构,在Linux操作系统上提供了对音频和MIDI的支持。在Linux 2.6的内核版本后,Alsa目前已经成为了linux的主流音频体系结构。 除了 alsa-driver,ALSA 包含在用户空间的 alsa-lib 函数库,具有更加友好的编程接口,并且完全兼容于

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包