Android4.4蓝牙耳机HFP流程分析-3

本文详细介绍了手机通过蓝牙耳机进行通话的过程,包括AT命令的发送与接收、通话状态的同步、音量控制及通话状态变化的处理等。重点分析了蓝牙耳机接听与挂断电话的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手机连接蓝牙耳机后,当手机的CALL STATE 发生改变时,会通过PhoneStateChanged和HFP Bluetooth Interface同步CALL STATE,然后发送相应的AT命令给蓝牙耳机。

蓝牙耳机也可以发送AT命令给AG(语音网关)。然后通过JNI回调函数返回给上层,上层通过层层判断之后,会将相关信息传递到RILJ,然后封装好后使用AT指令的方式发送到Modem端执行相应操作。

音量控制主要是Headset状态机通过消息和AudioManager/AudioService的交互

通话状态的变化主要是CALL STATE状态的同步,Headset状态机通过BluetoothPhoneServer和RIL同步状态。

例如来电时用蓝牙耳机接听电话流程:

当收到蓝牙耳机发送过来的AT命令BTA_AG_HF_CMD_A时,通过btif_hf_upstreams_evt函数调用answer_call_cmd_cb,JNI对应的回调函数answer_call_callback,返回给Headset状态机onAnswerCall发送消息EVENT_TYPE_ANSWER_CALL,处理函数为processAnswerCall,通过Bluetooth  Headset PhoneServer(BluetoothPhoneServer.java)处理后会调用acceptCall最终会调用到RILJ的acceptCall,使用AT指令的方式发送到Modem端,当手机的CALL STATE 发生改变时,会通过PhoneStateChanged和HFP BluetoothInterface同步CALL STATE,然后发送相应的AT命令给蓝牙耳机,同步蓝牙耳机和手机的通话状态。

蓝牙耳机挂断流程和接听的处理流程几乎一样。

1、AT命令的发送和接收。

(1).接收到AT命令的处理过程:

当从RFCOMM接收到数据的时候,先调用bta_ag_at_parse()进行AT命令的判断,

如果是正确的AT命令就会调用bta_ag_process_at()函数,解析出来AT命令参数,

调用bta_ag_at_hsp_cback()或者bta_ag_at_hfp_cback()来进行AT命令的处理。

在bta_ag_at_hfp_cback()函数里根据cmd来进行相应的处理,

通过bta_ag_send_ok()或者bta_ag_send_error()发送应答给RFCOMM,

最后调用bte_hf_evt()根据event消息(cmd)来判断是否需要返回给上层进行相应的处理。

(2).上层发送AT命令的处理过程:

上层的广播经过消息的分发和处理会发送给HeadsetStateMachine,

在状态机里有对每个消息的具体处理,然后通过JNI调用HAL层接口的函数指针结构体bthf_interface_t。在函数指针里会调用BTA_AgResult发送AT命令到RFCOMM。

2、Headset状态机的处理:

    Headset和A2DP的蓝牙耳机连接过程基本一致。都是根据mTargetDevice、

mCurrentDevice、mIncomingDevice这三个变量来改变状态机。

在Headset状态机里会处理很多来自上层的广播分发出来的消息,然后通过JNI调用HAL层结构体bthf_interface_t里的函数指针发送给协议栈。

具体函数指针定义请参考Bt_hf.h里的bthf_interface_t。

协议栈返回的消息通过HAL层结构体bthf_callbacks_t返回到JNI,然后调用Headset状态机对消息进行分发处理。

具体回调函数定义请参考Bt_hf.h里的bthf_callbacks_t。

(1).init初始化流程图

(2).连接过程

当底层调用connection_state_cb第一次返回时,返回的是BTHF_CONNECTION_STATE_CONNECTED已连接的消息,状态机此时在Pending状态,会调用

mCurrentDevice =mTargetDevice;

mTargetDevice = null;

transitionTo(mConnected);

第二次返回时,返回的是BTHF_CONNECTION_STATE_SLC_CONNECTED消息,状态机此时在mConnected状态,会调用processSlcConnected()函数

mPhoneState.listenForPhoneState(true);

mPhoneProxy.queryPhoneState();

流程图如下:

(3).SCO的建立

当底层audio_state_cb返回BTHF_AUDIO_STATE_CONNECTED的消息时,状态机此时在mConnected状态,会调用

mAudioManager.setBluetoothScoOn(true);直接设置音频策略为BT_SCO

broadcastAudioState(device,BluetoothHeadset.STATE_AUDIO_CONNECTED,

      BluetoothHeadset.STATE_AUDIO_CONNECTING);

transitionTo(mAudioOn);

流程图如下:

3.5毫米(3.5mm)和4.4毫米(4.4mm)音频插孔都是用来传输模拟信号的连接端口,但两者之间存在一些差异。 物理尺寸不同: - 3.5mm插头直径大约为3.5毫米,是目前最常用的耳机插孔规格之一,在手机、平板电脑和其他便携式电子设备上广泛采用。 - 4.4mm插头比3.5mm更大,通常用于更专业的音响设备或是需要更高音质的应用场景中。 触点数量与功能分配有所区别: - 传统的3.5mm TRS/TRRS插孔一般有三至四个接触环,分别负责左右声道输出及麦克风输入等用途;而TRRRS标准则支持立体声加单声道麦克风加上接地线共四条线路。 - 4.4mm Pentaconn Earphone 插座拥有五个独立的导电片,这使得其能实现更好的分离度,减少串扰,并且可以承载更大的电流以驱动高阻抗耳机。此外,多出来的触点也可以被配置来传递控制指令或其他附加信息。 声音质量方面: 由于4.4mm接口提供了更多的单独通道并且理论上减少了干扰的可能性,因此在高端市场里被认为能够带来更为纯净的声音再现效果。不过实际听感上的提升取决于多种因素包括但不限于源文件的质量和个人听力敏感程度等因素影响。 应用场景的不同: 鉴于体积较小的优势,大多数移动装置倾向于配备3.5mm接头;相反地,对于追求极致性能的专业级器材来说,则可能更多选择4.4mm这样的大型化设计。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值