最近,许多读者对如何解除蓝牙耳机的静音模式有疑问。有网友整理了相关内容,希望能回答你的疑惑。关于如何解除蓝牙耳机的静音模式vivo,这个网站已经为你找到了问题的答案,希望对你有所帮助。
蓝牙音乐静音
每个人都必须熟悉静音功能,这个功能在相关场景中非常实用。现在终端设备上有整个音频系统的静音,当然也有局部功能的静音,其中蓝牙音乐也提供静音操作。在本期中,我将简要分享安卓系统中蓝牙音乐静音的实现。
蓝牙音乐的音频数据基本遵循以下流程 SRC 传送到 SNK:
从上图来看,蓝牙音乐静音的实现方案也非常明确,目前的安卓系统主要是在音频数据上报到SNK端的蓝牙协议栈时不保存的,从而将未解码的音频数据发送到AudiotrackAudiotrack。
上述方案的实现主要取决于协议栈btif_a2dp_sink.cc全球变量的定义btif_a2dp_sink_cb两个基本变量:
rx_focus_state 蓝牙服务层控制变量,顾名思义,变量意味着当前的蓝牙音乐是否有音频焦点,而布尔值 rx_flush 表示接收到的音频数据是否保存,其和 rx_focus_state 是一对应的关系:
这样,蓝牙服务将间接通过 rx_flush 在函数btif_a2dp_sink_enqueue_buf()蓝牙音乐的静音已经实现。
蓝牙服务层的接口是蓝牙服务层A2dpSinkStateMachine.informAudioFocusStateNative(),还需在 framework 将接口函数添加到层中,打开从应用层到蓝牙服务的呼叫,相信大家都能轻松实现。
蓝牙音乐静音功能的问题:
静音成功后,解除静音,重播蓝牙音乐往往伴随着pop音乐
要解决这个问题,首先要分析蓝牙协议栈是否将解码的音频数据发送到AudioTrack,打开宏变量 DUMP_PCM_DATA 记录蓝牙音乐音频数据PCM流,用PCM流检查工具打开,发现给系统的PCM流很正常。
最后,在了解原因之前,咨询了系统音频的同事。当蓝牙协议栈静音时,停止向系统Audioflinger编写数据。Audioflinger将检测通道中是否有数据。这样,在没有数据超过一定时间后,Audioflinger将关闭蓝牙协议栈对应的音频通道。然后解除静音系统将重新打开音频通道。因为打开通道需要时间,蓝牙协议栈在解除静音后开始将数据写入Audiotrack。因为这样的时间问题,会伴随着pop的声音。
基于AudioFlinger会检测是否有数据的特点,理想的修复方案是蓝牙协议栈静音后经常给AudioFlinger 为了避免写空数据,避免写空数据 AudioFlinger 在没有发送数据的情况下,检测通道关闭通道。
解决方案:SNK端蓝牙协议栈或正常接收音频数据添加btif_a2dp_sink_cb.rx_audio_queue队列保存,处理函数只需在音频数据解码中完成btif_a2dp_sink_on_decode_complete()根据判断,如果目前处于静音状态,可以直接将解码的数据memset重置为0。
蓝牙音乐的静音分享到此结束。有兴趣的朋友欢迎私信讨论,一起学习,一起进步!
蓝牙音乐的静音分享到此结束。有兴趣的朋友欢迎私信讨论,一起学习,一起进步!
主题测试文章,只做测试使用。发布者:艾迪号,转转请注明出处:https://www.cqaedi.cn/baike/114665.html