首页 > 其他分享 >Gaming Dongle Feature Application Note

Gaming Dongle Feature Application Note

时间:2024-07-01 08:59:00浏览次数:1  
标签:Gaming 06 16 app dongle Dongle Application data APP

References:

dongle发送给headset的spp指令格式

image

(PS:这部分指令的的接收可以在headset的app_dongle_spp_cback函数看到,但在dongle部分的发送指令源码似乎在sdk中看不到Σ(っ °Д °;)っ)

功能实现函数

headset部分

// headset和dongle连接且dongle判断到pc/cellphone正在通话中,则dongle
// 会向headset发送打开enable mic的spp指令
// 处理enable mic的spp指令的回调函数如下
static void app_dongle_spp_cback(T_BT_EVENT event_type, void *event_buf, uint16_t buf_len)
{
	...
    case BT_EVENT_SPP_DATA_IND:
        {
	...
		// 此处判断Command type(Byte 3)是否为0x03,即DONGLE_CMD_REQ_OPEN_MIC
		else if (p_data[3] == DONGLE_CMD_REQ_OPEN_MIC)
		{
#if F_APP_APT_SUPPORT
                                uint8_t action = MMI_NULL;
#endif
				// 此处判断Byte 4 为0x01(turn on mic)或0x00(turn off mic)
                                if (p_data[4] == 1)
                                {
                                    app_dongle_updata_mic_data_idx(true);
                                    app_transfer_queue_reset(CMD_PATH_SPP);

#if F_APP_APT_SUPPORT
                                    if (app_cfg_const.normal_apt_support &&
                                        app_apt_is_apt_on_state((T_ANC_APT_STATE)app_db.current_listening_state))
                                    {
                                        action = MMI_AUDIO_APT;
                                        app_db.dongle_is_disable_apt = true;
                                        app_dongle_control_apt(action);
                                    }
#endif
                                    app_bt_policy_qos_param_update(app_db.br_link[app_idx].bd_addr, BP_TPOLL_SPP_ENABLE);

#if F_APP_24G_BT_AUDIO_SOURCE_CTRL_SUPPORT
                                    if ((app_cfg_const.enable_24g_bt_audio_source_switch
                                         && (app_cfg_nv.allowed_source != ALLOWED_SOURCE_24G))
                                        || (app_hfp_get_call_status() != APP_CALL_IDLE))
                                    {
                                        // not to start recording, restore recording if needed.
                                        app_db.restore_dongle_recording = true;
                                    }
                                    else
#endif
                                    {
                                        app_dongle_update_is_mic_enable(true);
                                        app_dongle_start_recording(app_db.br_link[app_idx].bd_addr);
                                    }
                                }
                                else
                                {
                                    app_db.restore_dongle_recording = false;
                                    app_dongle_updata_mic_data_idx(true);
                                    app_dongle_update_is_mic_enable(false);
                                    app_dongle_stop_recording(app_db.br_link[app_idx].bd_addr);

                                    app_bt_policy_qos_param_update(app_db.br_link[app_idx].bd_addr, BP_TPOLL_SPP_DISABLE);

#if F_APP_APT_SUPPORT
                                    if (app_db.dongle_is_disable_apt &&
                                        (!app_apt_is_apt_on_state((T_ANC_APT_STATE)app_db.current_listening_state)))
                                    {
                                        action = MMI_AUDIO_APT;
                                        app_db.dongle_is_disable_apt = false;
                                        app_dongle_control_apt(action);
                                    }
#endif
                                }
                            }
                            else if (p_data[3] == DONGLE_CMD_SET_VOL_BALANCE)
                            {
                                if (p_data[4] == 1) // dongle to earphone
                                {
                                    // update record
                                    app_db.gaming_balance = p_data[5];
                                    app_db.chat_balance = p_data[6];
                                    app_dongle_volume_balance_report(DONGLE_CMD_ACK);
                                }
                            }
                            else if (p_data[3] == DONGLE_CMD_CTRL_RAW_DATA)
                            {
                                app_dongle_rcv_ctrl_data(p_data + 4, data_len - 4);
                            }
                            else if (p_data[3] == DONGLE_CMD_PASS_THROUGH_DATA)
                            {
                                if (p_data[4] == CMD_SYNC_BYTE) //AudioConnect cmd header check
                                {
                                    uint16_t cmd_len = (p_data[6] | (p_data[7] << 8)) + 4; //sync_byte, seqn, length_low, length_high
                                    uint8_t seqn = p_data[5];

                                    APP_PRINT_TRACE2("app_dongle_cmd_pass_through: 0x%02X, 0x%02X", cmd_len, seqn);

                                    app_cmd_handler(&p_data[8], (cmd_len - 4), CMD_PATH_SPP, seqn, app_idx);
                                }
                            }
#endif
#if F_APP_CFU_SPP_SUPPORT
                            else if (p_data[3] == DONGLE_CMD_CFU_DATA)
                            {
                                T_APP_CFU_DATA cfu_data;
                                memcpy(cfu_data.spp_data.bd_addr, param->spp_data_ind.bd_addr, 6);
                                if (app_cfu_spp_header_parse(payload_len - 1, p_data + 4, &cfu_data))
                                {
                                    app_cfu_handle_report(cfu_data.spp_data.report_id, APP_CFU_REPORT_SOURCE_SPP, &cfu_data);
                                }

                            }
#endif
#if F_APP_CUSTOMIZED_SBC_VP_FLOW_SUPPORT
                            else if (p_data[3] == DONGLE_CMD_ERASE_FLASH)
                            {
                                //Do erase & Send ack
                                app_dongle_receive_erase_cmd(p_data + 4);
                            }
                            else if (p_data[3] == DONGLE_CMD_WRITE_CUSTOMIZED_VP)
                            {
                                //Do write & Send ack
                                app_dongle_receive_customized_vp_data(payload_len - 1, p_data + 4);
                            }
                            else if (p_data[3] == DONGLE_CMD_WRITE_VP_FINISH)
                            {
                                //Dongle notifies write finish
                                app_dongle_write_vp_finish();
                            }
#endif
                        }
                    }
                }
            }
        }
        break;


}

连接dongle通话headset自动打开mic log

 0008451  06-03#16:59:28.948  064  0044991.291  [BTM] bt_mgr_dispatch: msg 0x0704
 0008452  06-03#16:59:28.948  065  0044991.315  [BTM] !**bt_mgr_event_post: event_type 0x3005
 0008453  06-03#16:59:28.948  066  0044991.434  [PROFILE] !**spp_send_credit: addr[11::22::33::44::55::FE] server chann[0x11] credit[1]
 0008454  06-03#16:59:28.948  067  0044991.490  [RFCOMM] rfc_data_cfm: dlci 0x22, given credits 1
 0008455  06-03#16:59:28.948  068  0044991.510  [APP] app_dongle_spp_cback: 0x01, 0x02
 0008456  06-03#16:59:28.948  069  0044991.535  [APP] !**app_dongle_spp_cback 52, 01, 02, 03, 01, 54,
 0008457  06-03#16:59:28.948  070  0044991.655  [APP] !!*app_stop_timer: handle error 0, pointer 0x2c13f0
 0008458  06-03#16:59:28.948  071  0044991.961  [APP] app_bt_policy_qos_param_update: event 18, sco 0, a2dp_idx 0, avrcp 1, stream 1, active_tpoll 0, inactive_idx 4, bau_idx 4
 0008459  06-03#16:59:28.948  072  0044991.979  [APP] app_bt_policy_qos_param_update: enable_mic 0, gaming 1
 0008460  06-03#16:59:28.948  073  0044992.014  [APP] app_dongle_update_is_mic_enable: 1
 0008461  06-03#16:59:28.948  080  0044994.235  [APP] !**app_dongle_start_recording

dongle部分

该部分代码涉及到usb部分知识,因为不熟悉usb所以无能为力,但是在log部分可以看到一些通话开启时usb的状态变化

Line  8607:  0008607  06-27#16:19:18.743  160  0029084.647  [USB] !**usb_audio_driver_streaming_activate:dir:1,bit_width:16, cur_sample_rate:48000, chann_num:2, sample_rate_max_tolerance:48000
Line  8633:  0008633  06-27#16:19:18.757  188  0029091.647  [APP] !**ds_moniter_timeout_handle: set ds_streaming true
Line 19702:  0019702  06-27#16:19:33.031  132  0043350.966  [USB] !**usb_audio_driver_streaming_deactivate:1

标签:Gaming,06,16,app,dongle,Dongle,Application,data,APP
From: https://www.cnblogs.com/archerqvq/p/18267854

相关文章

  • Spring MVC 获取三个域(request请求域,session 会话域,application 应用域)对象的方式
    1.SpringMVC获取三个域(request请求域,session会话域,application应用域)对象的方式@目录1.SpringMVC获取三个域(request请求域,session会话域,application应用域)对象的方式2.Servlet中的三个域对象3.准备工作3.1创建模块,添加依赖3.2添加web支持3.3编写web.xml文......
  • 【FAS】《Application of machine learning to face Anti-spoofing detection》
    文章目录原文相关工作方法静态Gabor小波和动态LBP的融合特征基于GAN的数据增强人脸活体检测方法半监督学习用于图像修复的人脸活体检测点评原文李莉.反欺骗人脸活体图像的机器学习方法研究[D].广东工业学,2020.DOI:10.27029/d.cnki.ggdgu.2020.001204.相关......
  • application.yml与bootstrap.yml的区别
    原文链接:application.yml与bootstrap.yml的区别–每天进步一点点(longkui.site)SpringBoot默认支持properties(.properties)和YAML(.yml.yaml)两种格式的配置文件,yml和properties文件都属于配置文件,功能一样。SpringCloud构建于SpringBoot之上,在SpringBoot......
  • flask-SQLAlchemy解决报错 Working outside of application context.
    尝试想要写自己的自动化测试框架,使用的是flask,想要使用SQLAlchemy实现数据库的模型映射,但是按照官方文档创建好module后执行时,会报错Workingoutsideofapplicationcontext.经过一番查找,存在flask的上下文问题,以下是解决过程官网案例:http://www.pythondoc.com/flask-sqlalche......
  • HCIP-HarmonyOS Application DeveloperV1.0 考点
    系统及应用场景介绍系统及应用场景介绍HarmonyOS三大特征:“硬件互助,资源共享”、“一次开发,多端部署”、“统一OS,弹性部署”HarmonyOSConnect(中文名称:鸿蒙智联)是华为消费者业务面向生态智能硬件的全新技术品牌。HarmonyOSConnect来自WorksWithHUAWEIHiLink品牌......
  • KAN:使用 Microsoft 的 KubeAI Application Nucleus简化边缘 AI
    我们需要的是在Kubernetes上构建和管理边缘机器学习应用程序的一致方法,一种可以加快开发和交付速度的方法。这就是KAN的作用,即KubeAIApplicationNexus。正如介绍性博客文章所指出的那样,这个名字来自一个普通话动词,翻译为“观看”或“看”。KAN是一个开源项目,托管在GitHub......
  • Spring中Bean的初始化创建AbastractApplicationContext.FinishBeanFactoryInitializat
    AbastractApplicationContext.FinishBeanFactoryInitialization模版调用子类DefaultListableBeanFacotry.preInstantiateSingletons通过循环子类DefaultListableBeanFactory中收集到的所有beanDefinitionNames,对满足条件的Bean进行初始化,getBean操作会调用父类AbstractBean......
  • java:【@ComponentScan】和【@SpringBootApplication】扫包范围的冲突
    #代码结构如下:注意【com.chz.myBean.branch】和【com.chz.myBean.main】这两个包是没有生重叠的。主程序【MyBeanTest1、MyBeanTest2、MyBeanTest3】这两个类是在包【com.chz.myBean.main】下#示例代码【pom.xml】<dependency><groupId>org.springframework.bo......
  • 将 office 的注册应用 applications 的 API 密钥设置更长的期限
    首先官方文档https://learn.microsoft.com/zh-cn/graph/api/application-addpassword?view=graph-rest-1.0&tabs=http 操作如下,必须用管理员账户登录操作 1:进入https://developer.microsoft.com/zh-cn/graph/graph-explorer,并在请求输入url处右上方确保登录2:登陆url......
  • ApplicationListener的简单使用
    ApplicationListener在Spring框架中的作用是监听并处理应用程序中的事件。ApplicationListener接口定义了一个onApplicationEvent方法,当监听器监听到事件发布后,会执行这个方法。这使得开发者能够灵活地响应应用程序中的各种事件,实现发布-订阅模式的功能。通过这种方式,Spring框架......