知识分享小达人
本博客是全网最大分享安卓模块知识的博客,通过基础知识、安卓源码介绍、项目实践等方式,全面剖析手机各个模块的内容,使阅读者能够更好的理解,和应用到项目实践中,如果阅读过程中遇到不理解的,欢迎私信交流,本博主尽最大可能进行答疑解惑。
展开
-
android蓝牙a2dp协议流程分析(十)--Audio和蓝牙的交互
Audio将要播放的音频数据交给蓝牙协议栈,也就是我们a2dp来进行播放,那么是通过什么将Audio和a2dp连接起来的呢,就是我们的media进程,专门用于发送和接收media数据,在media线程创建了socket,管理socket的文件为UIPC,所以在我们a2dp初始化过程中,使用btif_a2dp_start_media_task函数创建了media线程。在这里,我们创建media线程,在media线程了创建了控制socket,用于Audio和蓝牙之间进行命令的交互,至于数据的通道在后面会说到。原创 2024-02-02 16:11:02 · 397 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(九.2)--avdtp协议流程详解之start
btif层状态机的新状态为start,所以调用btif层事件处理函数,也就是btif_av_state_started_handler函数来处理BTIF_SM_ENTER_EVT事件,最终调用到btif_report_audio_state函数。bta_av_proc_stream_evt函数中进行事件转换,将avdt事件转换为bta层事件,发送给到btu_task进程,根据事件类型,我们知道处理该事件的是bta_av_ssm_execute函数。原创 2024-02-02 16:04:08 · 272 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(九.1)--avdtp协议流程详解之start
在这个函数中将我们btif层状态机的状态正式切换为open状态,然后向新状态的btif状态机发送BTIF_SM_ENTER_EVT事件,open状态下的btif层事件处理函数是btif_av_state_opened_handler函数,由于这个函数对事件BTIF_SM_ENTER_EVT没有做什么处理,所以我们这里省略。在转换数组中,看到将我们发送的AVDT_OPEN_CFM_EVT事件转换成BTA_AV_STR_OPEN_OK_EVT事件。根据动作选择对应的事件处理函数执行。原创 2024-02-02 15:54:56 · 182 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(八.3)--avdtp协议流程详解
当我们调用L2CA_ConnectReq函数向对端蓝牙设备发送连接请求命令建立连接后,对端蓝牙设备返回连接请求的响应消息,这时我们调用之前已经注册的avdt_l2c_connect_cfm_cback回调函数来进行处理,之前也提到过,l2cap通道是先建立,后配置,所以在完成通道的建立以后,调用L2CA_ConfigReq函数来完成l2cap通道的配置。在这个函数中,由于我们现在已经是媒体通道了,所以调用avdt_scb_event函数向scb状态机发送AVDT_SCB_TC_OPEN_EVT事件。原创 2024-02-02 15:27:01 · 104 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(八.2)--avdtp协议流程详解
avdt_ccb_event已经介绍过多次,当前ccb状态机的状态为open,所以我们直接来到avdt_ccb_st_open数组中,我们传递过来的event事件为UL_OPEN_EVT,对应要执行的处理函数对应的动作为AVDT_CCB_CHK_TIMER,查阅了一下,这个函数没有什么作用,而ccb状态的下一个状态还是open,没有改变,所有整个这个向ccb状态机发送UL_OPEN_EVT事件没有做什么有用的事件。来到scb的状态转换表中,avdt scb状态机的初始状态为idle。原创 2024-02-02 15:16:43 · 140 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(八.1)--avdtp协议流程详解
在这个响应处理函数中,我们调用了之前传递的回调处理函数,也就是bta_av_dt_cback函数集合,也就是里面的bta_av_stream0_cback回调函数,传递的事件为AVDT_GETCAP_CFM_EVTc。当btu_task进程收到bta层的事件后,调用bta_av_hdl_event函数来进行处理,根据事件类型不同,调用不同处理函数,在这里,我们调用的是bta_av_ssm_execute函数来处理。原创 2024-02-02 15:11:38 · 155 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(八)--stream control block回调
来到AVDT_CreateStream函数中,在这个函数中为stream control block申请内存空间,传递了我们从bta_av_api_register函数中传递过来的参数cs,这样就把这个参数继续向下进行传输。再avdt_scb_alloc函数中,我们看到了最想看到的,把我们从bta_av_api_register函数中传递的cs参数赋值给到了p_scb的cs成员。在我们后面使用到p_scb->cs.p_ctrl_cback的回调函数以后就知道调用的是哪个回调函数。原创 2024-02-02 15:03:57 · 104 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(八)--a2dp协议连接成功后状态回调
在我们a2dp协议的流媒体通道建立后打开后,a2dp连接的最后,调用了btif_av_state_opening_handler函数,在这里调用了btif_report_connection_state函数来进行状态的回调,此时我们的第一个参数state被赋值为BTAV_CONNECTION_STATE_CONNECTED,我们继续往下看。在函数中,由于bt_av_src_callbacks在a2dp初始化的时候被赋值,所以这里调用bt_av_src_callbacks里面对应的回调函数。原创 2024-02-02 15:00:18 · 119 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(七)--bte_av_cb回调函数赋值
在bta_av_api_enable函数中,参数p_data就是前面函数一直传递下来的参数,里面的p_cback变量就保存着回调函数bte_av_callback,所以这里bta_av_cb.p_cback=p_data->api_enable.p_cback=bte_av_callback,所以bta_av_cb.p_cback就是在这里完成了赋值。来到bta_av_hdl_event消息处理函数中,根据消息类型,我们选择bta_av_nsm_act函数调用,同时将消息体向下传递。原创 2024-02-02 14:57:21 · 117 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(六.3)--avdtp协议交互流程
我们bta_av_stream0_cback函数,经过调用后来到bta_av_proc_stream_evt,这个函数也很熟悉,将底层传递过来的AVDT_OPEN_CFM_EVT事件转换成BTA层的BTA_AV_STR_OPEN_EVT事件,然后使用bta_sys_sendmsg函数将事件发送给btu_task进程,根据事件类型,处理这个事件的状态机是BTA ssm,也就是由bta_av_ssm_execute函数来处理这个事件。选择bta_av_str_opened函数执行。原创 2024-02-02 14:53:52 · 119 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(六.2)--avdtp协议交互流程
由于之前scb状态机已经切换为conf状态,所以avdt_scb_event函数中这次使用的是avdt_scb_st_conf数组,同时传递的请求命令是API_OPEN_REQ_EVT,所以调用AVDT_SCB_SND_OPEN_REQ对应的函数,同时我们scb状态机的状态没有改变,还是conf状态。我们的avdt_scb_st_tbl表和avdt_ccb_st_tbl表一样,初始状态都是idle,所以使用的是avdt_scb_st_idle函数集合。原创 2024-02-02 14:47:38 · 435 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(六.1)--avdtp协议交互流程
这个函数里面,进行了事件转换,将底层发送过来的AVDT_DISCOVER_CFM_EVT事件转换为BTA层的BTA_AV_STR_DISC_OK_EVT事件,然后使用我们非常熟悉的bta_sys_sendmsg函数发送给btu_task进程,通过判断这个event事件类型,调用的是bta_av_ssm_execute函数来处理这个函数。来到bta_av_stream0_cback回调函数中,我们一路往下,调用bta_av_proc_stream_evt。原创 2024-02-02 14:25:47 · 129 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(五.2)--avdtp协议连接
第二个执行函数avdt_ccb_ll_opened,首先判断p_ccb->p_conn_cback是否存在,而在之前的avdt_ccb_set_conn函数中p_ccb->p_conn_cback被我们设置为bta_av_dt_cback函数指针集合,之前注册的回调函数终于在这里被调用共了,所以这里调用的是bta_av_stream0_cback回调函数,event事件为AVDT_CONNECT_IND_EVT。函数,当向btu_task进程发送完消息后,还调用了bta_av_conn_cback函数。原创 2024-02-02 14:19:02 · 170 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(五.1)--avdtp协议连接
在AVDT_ConnectReq函数将bta_av_dt_cback回调函数赋值给了evt.connect.p_cback,而在avdt_ccb_event函数中将evt传递给了p_data,所以这里的p_ccb->p_conn_cback = p_data->connect.p_cback = bta_av_dt_cback。在avdt_ccb_action列表中找到我们要执行的两个函数,avdt_ccb_set_conn,avdt_ccb_chan_open。原创 2024-02-02 14:12:45 · 311 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(四)--avdtp简介
上面整个的avdtp协议就是我们avdtp代码流程的全部过程,也是为我们后面阅读代码大侠基础,下期我们来说说avdtp交互流程。AVDTP:音视频分发协议,定义了基础的音视频分发,音视频的参数协商,但是没有音视频的编解码,是A2DP的基础协议。A2DP:高级音视频分发协议,协商使用哪种编解码器,使用哪种比特率传输音视频。AVDTP在协议栈上的结构:向上层提供了三个接口,向下层提供了2个接口。值得注意的是,我们avdtp整个代码,都是按照下面的交互流程来执行的。AVRCP:音视频控制协议,定义了播放暂停等。原创 2024-02-02 14:07:15 · 326 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(三.2)--a2dp连接
当我们搜索服务成功后,发送BTA_AV_SDP_DISC_OK_EVT事件给到btu_task,根据这个事件类型,还是由bta_av_ssm_execute函数来处理,这里又回到我们之前所讲的根据当前状态查阅状态转换表调用不同函数来处理,我们之前已经由init状态变为opening状态,所以根据状态转换表,这次调用的是bta_av_sst_opening状态转换表。音频流状态机根据对应的事件调用对应的函数执行,处理函数和事件是一一对应的关系,这里我们调用的是bta_av_do_disc_a2d函数。原创 2024-01-28 17:05:11 · 171 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(三.1)--a2dp连接
在初始化a2dp协议中,btif_av_cb.sm_handle被赋值为btif_av_state_idle_handle函数,在我们的connect_int函数我们调用这个回调函数,并且传入BTIF_AV_CONNECT_REQ_EVT参数。在queue_int_handle_evt中,根据前面的event,这里执行的是queue_int_add,也就是在这里将组装好的连接请求节点加入队列,然后调用queue_int_connect_next,处理队列中的连接请求。原创 2024-01-28 16:58:06 · 215 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(二.2)--使能a2dp协议
还是在bta_av_nsm_act列表中,这次传入的BTA_AV_API_REGISTER_EVT,所以这次调用bta_av_api_register。bta_av_nsm_act是一个函数指针数组,根据我们传入的索引选择调用不同的函数来处理,所以这里选择bta_av_api_enable来执行。我们看到bta_av_a2d_cos也是一个函数指针数组,它的init函数是bta_av_co_audio_init。进入到函数里面,我们看到做了一些赋值操作,存储参数,完成后,调用了之前注册的回调函数。原创 2024-01-28 16:50:50 · 118 阅读 · 0 评论 -
android蓝牙a2dp协议流程分析(二.1)--使能a2dp协议
我们看看将传入的handle处理函数给到了p_cb,然后根据传入的event来调用,我们又知道传入的handle为btif_av_cb.sm_handle,这个是我们之前定义赋值过的btif_av_state_idle_handler函数,所以btif_av_state_idle_handler函数根据传入的event事件来调用来完成事件的回调。我们之前再btif_av_init函数中调用btif_enable_service的时候传入的参数BTA_A2DP_SERVICE_ID,所以这里这个分支继续。原创 2024-01-28 16:43:25 · 157 阅读 · 0 评论 -
Android 蓝牙高通6225平台项目特性(一)
dump文件路径:data/vendor/log/ramdump/ramdump_bt_fw_crashdump_***.bin,size打开几百KB.adb push 固件 /vendor/bt_firmware/image //将固件push 到对应目录下即可。adb shell "umount /vendor/bt_firmware" //将原有放置固件的目录卸载掉。setporp persist.service.bdroid.soclog true //开启固件日志开关。原创 2024-01-26 10:21:29 · 251 阅读 · 0 评论 -
Android 蓝牙高通6225平台项目特性(二)
APM_AudioPolicyManager:setDeviceConnectionStateInt()device:0x10,state 1,name ...//SCO out处于连接状态。加载wifi驱动:insmod /vendor/lib/modules/qca_cld3_wlan.ko //找到对应项目的驱动文件,进行加载。卸载驱动:rmmod /system/lib/modules/wlan.ko //因为wlan驱动加载上之后默认modules为wlan,原创 2024-01-26 10:18:33 · 145 阅读 · 0 评论 -
Android 蓝牙A2dp 协议流程(一)
a2dp(Advanced Audio Distribution Profile):叫做蓝牙音频分发协议,也就是传输音频数据,是蓝牙应用中使用比较多的场景,我们也是从初始化开始来介绍 还记得我们在蓝牙初始化的时候介绍过,在蓝牙初始化的时候会去启动所有的蓝牙服务,我们的a2dp协议初始化也从这里开始,在processStart函数中调用了setProfileServiceState这个函数来启动所有服务在PROFILE_SERVICES这个数组中包含了蓝牙初始化过程中我们索要启动的服务,其中就包括了今天我们要原创 2022-07-03 16:31:23 · 3598 阅读 · 1 评论