蓝牙通话音频简介

模块介绍

蓝牙通话模块流程分为以下部分:

1.bluetoothclient:蓝牙的调用入口。

2.TonePlayerImpl:创建按键音调播放接口。

3.AudioService:处理分布式音频服务的音效添加事件

4.model:HDF层中加载音效配置和创建音效控制器

整体结构如图

蓝牙通话运行

入口通过napi调用TonePlayerImpl和start的接口运行。通过BluetoothRendererSinkInner::Start开启蓝牙渲染器。

TonePlayerImpl部分

创建拨号播放接口,播放按键音。

start部分

同时开启capture和render的start。开始通话铃声播放,从源文件中读取音频信息,最后进行播放。

蓝牙传送通话声音

        蓝牙电话应用最根本的目的是传输双方的通话声音,既要将远端的输入语音经本端手机的电话模块接收到后再通过蓝牙模块AG侧传送到HF侧播放出来,也要将本端的输出语音通过HF侧传送到AG侧,再通过本端手机的电话模块发送出去。传输通话音频的通道主要是通话链路也就是大家平常说的SCO或eSCO链路。

SCO或eSCO的建立依赖于HFP协议的Service Level Connection连接成功,再通过HCI命令建立通话音频链路。

音频链路当前有两种编码方式,分别为CVSD和mSBC。采用哪种编码方式是有建立连接的双方协商决定的,AT命令“+BRSF”中HF和AG双方会分别发送自己支持的features给对方,如果双方都支持编码协商即标志位Codec Negotiation,HF侧主动通过“AT+BAC”的AT命令告知AG侧两种编码方式的编号分别为:1-CVSD,2-mSBC,并且在建立音频链路时多采用mSBC的编码方式,否则都是CVSD编码。

音频链路连接对应的HCI命令为:Setup Synchronous Connection Command,如果本端Controller支持Enhanced Setup Synchronous Connection指令(详情请查看Read Local Supported Commands Command的HCI命令),则创建连接的HCI命令为:Enhanced Setup Synchronous Connection Command

音频链路SCO建立成功后,通话语音就能在AG(手机)、HF(耳机)两侧正常传输了。

以上就是蓝牙电话通话中需要了解的最重要的两点,HF侧的上层蓝牙电话可以使用提供的接口 audio_bluetooth_manager.h 实现同步连接导向链路(SCO)的蓝牙呼叫。

上层蓝牙电话可以使用提供的接口:

    static void RegisterBluetoothScoListener();注册一个监听器,监听蓝牙SCO连接的状态变化

    static void UnregisterBluetoothScoListener();

    static int32_t SetActiveHfpDevice(const std::string &macAddress);置当前活动的HFP设备,通过其MAC地址指定

    static std::string GetActiveHfpDevice();

    static int32_t ConnectScoWithAudioScene(AudioStandard::AudioScene scene);根据指定的音频场景(如通话、音乐等)建立SCO连接。

    static int32_t DisconnectSco();断开当前的SCO连接。

    static int8_t GetScoCategoryFromScene(AudioStandard::AudioScene scene);

    static void DisconnectBluetoothHfpSink();

    static void UpdateCurrentActiveHfpDevice(const BluetoothRemoteDevice &device);

    static std::string GetCurrentActiveHfpDevice();

    static void UpdateAudioScene(AudioStandard::AudioScene scene);

    static void CheckHfpDeviceReconnect();

    static AudioStandard::AudioScene GetCurrentAudioScene();

    static AudioStandard::AudioScene GetPolicyAudioScene();

    static void SetAudioSceneFromPolicy(AudioStandard::AudioScene scene);

    static int32_t HandleScoWithRecongnition(bool handleFlag, BluetoothRemoteDevice &device);处理与识别相关的SCO连接

    static ScoCategory GetScoCategory();

拨打电话-AG(Audio Gateway,音频网关)时需要通过AT指令通信。

    拨打电话大体分为拨号、响铃、通话这三个部分,状态变化后AG侧都会主动通知HF侧,HF侧再通过“AT+CLCC”获取详细的电话参数信息。 AT+CLCC是AT命令集中的一条指令,用于查询当前通话的信息或控制通话状态。在蓝牙电话应用中,HF侧可以通过该命令获取AG(Audio Gateway,音频网关)侧提供的通话状态、通话时长、通话类型等详细参数信息。获取拨打电话的状态,如拨号中、响铃中、通话中等。

 

Logo

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

更多推荐