关于蓝牙耳机通话,切换声音路径
2013-10-22 15:20
357 查看
今天遇到一个问题,不大不小:
1.声音从本机切换到蓝牙耳机
(1)如果此时静音功能关闭,切换到BT耳机后,静音功能仍关闭,[静音]菜单显示正常,之后开启、关闭操作也正常;
(2)如果此时静音功能开启,切换到BT耳机后,静音功能被关闭,但是[静音]菜单的显示仍然是开启,即:切换声音路径到BT耳机时,自动关闭了静音功能,但是[静音]菜单的显示没有响应的变化,导致错误。2.声音从蓝牙耳机切换到本机
现象类似。
一路追踪代码,过程如下:
1. [静音]菜单的操作函数:mmi_ucm_set_mute()
2.切换声音路径的操作:
(1)mmi_ucm_bt_set_audio_path()-->
(2)mmi_bt_switch_voice_path_incall( )-->
(3)(*g_mmi_bt_scr_cntx.stack_cb_tbl.mmi_bt_switch_voice_path_incall) (is_on); is_on=1表示切换声音到蓝牙耳机。这是个函数指针,在函数
mmi_bt_init_stack_cb()中调用mmi_bt_reg_stack_cb()注册的即:
(4)mmi_bth_switch_voice_path_incall()-->
(4-1)mmi_profiles_bt_connect_req(MMI_PROFILES_BT_HFP_SCO); 切换到蓝牙耳机
mdi_audio_bt_open_stream()-->
aud_send_bt_audio_open_req( )-->
aud_send_msg_to_med( MSG_ID_MEDIA_BT_AUDIO_OPEN_REQ)
底层aud_bt_main()函数接收到这个消息后,执行:
aud_bt_audio_open_req_hdlr()-->
aud_bt_hfp_open_req_hdlr()--> 执行if分支:
aud_bt_hfp_sco_connect_req( )-->
aud_bt_hfp_set_audio_path_on( )-->设置音频输出路径
bt_hfg_send_sco_connect_req(MOD_MED, aud_bt_hfp_ctx.connect_id); 发送消息:MSG_ID_BT_HFG_SCO_CONNECT_REQ
蓝牙返回MSG_ID_BT_HFG_SCO_CONNECT_CNF,在aud_bt_main()中被捕捉到,进入:
aud_bt_hfp_sco_connect_cnf_hdlr() -->
aud_send_bt_audio_open_ind( )-->
aud_send_msg_from_med(MSG_ID_MEDIA_BT_AUDIO_OPEN_IND),进入函数:
mdi_audio_bt_open_stream_ind()--即:(5)中所注册的回调函数
aud_bt_hfp_set_audio_path(KAL_TRUE); 比较关键的函数
aud_bt_hfp_set_audio_path_on();
aud_bt_hfp_set_speech_path_on(); 先调用L1SP_MuteMicrophone(KAL_TRUE);开启静音,然后启动一定时器,定时器响应关闭静音!
(4-2) mmi_profiles_bt_disconnect_req(MMI_PROFILES_BT_HFP_SCO); 切换到本机
mdi_audio_bt_close_stream( )-->
media_aud_bt_audio_close( )-->
aud_send_bt_audio_close_req( )-->
aud_send_msg_to_med(MSG_ID_MEDIA_BT_AUDIO_CLOSE_REQ )
底层aud_bt_main()函数接收到这个消息后,执行:
aud_bt_audio_close_req_hdlr()-->
aud_bt_hfp_close_req_hdlr( )-->
aud_bt_hfp_set_audio_path( FALSE)--> 比较关键的函数!!!
aud_bt_hfp_set_audio_path_off();
aud_bt_hfp_set_speech_path_off();-->L1SP_MuteMicrophone(KAL_FALSE); 关闭静音功能!!!!!
aud_send_bt_audio_close_cnf()-->
aud_send_msg_from_med(MSG_ID_MEDIA_BT_AUDIO_CLOSE_CNF),进入函数:
mdi_audio_bt_close_stream_cnf()--即:(5)中所注册的回调函数
(5)在函数mdi_audio_init_event_hdlrs()中注册了:
SetProtocolEventHandler(mdi_audio_bt_close_stream_cnf, MSG_ID_MEDIA_BT_AUDIO_CLOSE_CNF);
SetProtocolEventHandler(mdi_audio_bt_close_stream_ind, MSG_ID_MEDIA_BT_AUDIO_CLOSE_IND);
SetProtocolEventHandler(mdi_audio_bt_open_stream_cnf, MSG_ID_MEDIA_BT_AUDIO_OPEN_CNF);
SetProtocolEventHandler(mdi_audio_bt_open_stream_ind, MSG_ID_MEDIA_BT_AUDIO_OPEN_IND);
以上4个响应函数都调用mdi_audio_bt_cntx.close_hdlr[profile]注册的函数。而这个函数的注册是在:InitProfileApp()-->
mdi_audio_bt_init(BT_HFP, mmi_profiles_bt_open_stream_callback, mmi_profiles_bt_close_stream_callback);来完成的。
即:mmi_profiles_bt_open_stream_callback( ),mmi_profiles_bt_close_stream_callback( )这2个函数是切换声音路径最后调用的函数。
(6-1) mmi_profiles_bt_open_stream_callback()--> 切换到BT耳机
mmi_profiles_bt_connect_callback(MMI_PROFILES_BT_HFP_SCO, MMI_PROFILES_BT_RSP, res);-->
mmi_bth_sco_connect_ind_hdler( )
(*g_mmi_bth_cntx.scr_cb_tbl.mmi_bt_scr_cb_sco_ind)( ) 函数指针,即:mmi_bt_sco_ind(res)。res=1表示切换到BT耳机。
如果当前开启免提,则把免提关闭;显示提示信息:声音转至免持装置。
然后启动定时器mmi_profiles_bt_sco_timeout(),定期检查蓝牙耳机是否断开,是的话执行mmi_profiles_bt_disconnect_sco()。
(6-2)mmi_profiles_bt_close_stream_callback()--> 切换到本机
mmi_profiles_bt_disconnect_callback(MMI_PROFILES_BT_HFP_SCO, MMI_PROFILES_BT_RSP, MMI_PROFILES_BT_OK);-->
mmi_bth_sco_disconnect_ind_hdler()
(*g_mmi_bth_cntx.scr_cb_tbl.mmi_bt_scr_cb_sco_ind)( ) 函数指针,即:mmi_bt_sco_ind(res)
提示信息:声音转回手机端
即:切换声音完成之后,都会进入函数mmi_bt_sco_ind()中,显示提示信息。
1.声音从本机切换到蓝牙耳机
(1)如果此时静音功能关闭,切换到BT耳机后,静音功能仍关闭,[静音]菜单显示正常,之后开启、关闭操作也正常;
(2)如果此时静音功能开启,切换到BT耳机后,静音功能被关闭,但是[静音]菜单的显示仍然是开启,即:切换声音路径到BT耳机时,自动关闭了静音功能,但是[静音]菜单的显示没有响应的变化,导致错误。2.声音从蓝牙耳机切换到本机
现象类似。
一路追踪代码,过程如下:
1. [静音]菜单的操作函数:mmi_ucm_set_mute()
2.切换声音路径的操作:
(1)mmi_ucm_bt_set_audio_path()-->
(2)mmi_bt_switch_voice_path_incall( )-->
(3)(*g_mmi_bt_scr_cntx.stack_cb_tbl.mmi_bt_switch_voice_path_incall) (is_on); is_on=1表示切换声音到蓝牙耳机。这是个函数指针,在函数
mmi_bt_init_stack_cb()中调用mmi_bt_reg_stack_cb()注册的即:
(4)mmi_bth_switch_voice_path_incall()-->
(4-1)mmi_profiles_bt_connect_req(MMI_PROFILES_BT_HFP_SCO); 切换到蓝牙耳机
mdi_audio_bt_open_stream()-->
aud_send_bt_audio_open_req( )-->
aud_send_msg_to_med( MSG_ID_MEDIA_BT_AUDIO_OPEN_REQ)
底层aud_bt_main()函数接收到这个消息后,执行:
aud_bt_audio_open_req_hdlr()-->
aud_bt_hfp_open_req_hdlr()--> 执行if分支:
aud_bt_hfp_sco_connect_req( )-->
aud_bt_hfp_set_audio_path_on( )-->设置音频输出路径
bt_hfg_send_sco_connect_req(MOD_MED, aud_bt_hfp_ctx.connect_id); 发送消息:MSG_ID_BT_HFG_SCO_CONNECT_REQ
蓝牙返回MSG_ID_BT_HFG_SCO_CONNECT_CNF,在aud_bt_main()中被捕捉到,进入:
aud_bt_hfp_sco_connect_cnf_hdlr() -->
aud_send_bt_audio_open_ind( )-->
aud_send_msg_from_med(MSG_ID_MEDIA_BT_AUDIO_OPEN_IND),进入函数:
mdi_audio_bt_open_stream_ind()--即:(5)中所注册的回调函数
aud_bt_hfp_set_audio_path(KAL_TRUE); 比较关键的函数
aud_bt_hfp_set_audio_path_on();
aud_bt_hfp_set_speech_path_on(); 先调用L1SP_MuteMicrophone(KAL_TRUE);开启静音,然后启动一定时器,定时器响应关闭静音!
(4-2) mmi_profiles_bt_disconnect_req(MMI_PROFILES_BT_HFP_SCO); 切换到本机
mdi_audio_bt_close_stream( )-->
media_aud_bt_audio_close( )-->
aud_send_bt_audio_close_req( )-->
aud_send_msg_to_med(MSG_ID_MEDIA_BT_AUDIO_CLOSE_REQ )
底层aud_bt_main()函数接收到这个消息后,执行:
aud_bt_audio_close_req_hdlr()-->
aud_bt_hfp_close_req_hdlr( )-->
aud_bt_hfp_set_audio_path( FALSE)--> 比较关键的函数!!!
aud_bt_hfp_set_audio_path_off();
aud_bt_hfp_set_speech_path_off();-->L1SP_MuteMicrophone(KAL_FALSE); 关闭静音功能!!!!!
aud_send_bt_audio_close_cnf()-->
aud_send_msg_from_med(MSG_ID_MEDIA_BT_AUDIO_CLOSE_CNF),进入函数:
mdi_audio_bt_close_stream_cnf()--即:(5)中所注册的回调函数
(5)在函数mdi_audio_init_event_hdlrs()中注册了:
SetProtocolEventHandler(mdi_audio_bt_close_stream_cnf, MSG_ID_MEDIA_BT_AUDIO_CLOSE_CNF);
SetProtocolEventHandler(mdi_audio_bt_close_stream_ind, MSG_ID_MEDIA_BT_AUDIO_CLOSE_IND);
SetProtocolEventHandler(mdi_audio_bt_open_stream_cnf, MSG_ID_MEDIA_BT_AUDIO_OPEN_CNF);
SetProtocolEventHandler(mdi_audio_bt_open_stream_ind, MSG_ID_MEDIA_BT_AUDIO_OPEN_IND);
以上4个响应函数都调用mdi_audio_bt_cntx.close_hdlr[profile]注册的函数。而这个函数的注册是在:InitProfileApp()-->
mdi_audio_bt_init(BT_HFP, mmi_profiles_bt_open_stream_callback, mmi_profiles_bt_close_stream_callback);来完成的。
即:mmi_profiles_bt_open_stream_callback( ),mmi_profiles_bt_close_stream_callback( )这2个函数是切换声音路径最后调用的函数。
(6-1) mmi_profiles_bt_open_stream_callback()--> 切换到BT耳机
mmi_profiles_bt_connect_callback(MMI_PROFILES_BT_HFP_SCO, MMI_PROFILES_BT_RSP, res);-->
mmi_bth_sco_connect_ind_hdler( )
(*g_mmi_bth_cntx.scr_cb_tbl.mmi_bt_scr_cb_sco_ind)( ) 函数指针,即:mmi_bt_sco_ind(res)。res=1表示切换到BT耳机。
如果当前开启免提,则把免提关闭;显示提示信息:声音转至免持装置。
然后启动定时器mmi_profiles_bt_sco_timeout(),定期检查蓝牙耳机是否断开,是的话执行mmi_profiles_bt_disconnect_sco()。
(6-2)mmi_profiles_bt_close_stream_callback()--> 切换到本机
mmi_profiles_bt_disconnect_callback(MMI_PROFILES_BT_HFP_SCO, MMI_PROFILES_BT_RSP, MMI_PROFILES_BT_OK);-->
mmi_bth_sco_disconnect_ind_hdler()
(*g_mmi_bth_cntx.scr_cb_tbl.mmi_bt_scr_cb_sco_ind)( ) 函数指针,即:mmi_bt_sco_ind(res)
提示信息:声音转回手机端
即:切换声音完成之后,都会进入函数mmi_bt_sco_ind()中,显示提示信息。
相关文章推荐
- mt6735 [Audio Policy]连接蓝牙耳机,通话时声音路径切换到听筒或者喇叭,触屏时听不到触屏音
- 关于ftp上传changeWorkingDirectory()方法的路径切换问题
- Windows平台蓝牙耳机玩游戏没有声音
- 关于电脑重装系统后,耳机插后面有声音,前面插口没声音
- 蓝牙切换耳机和蓝牙耳机的时候卡住了。
- 用蓝牙耳机拨打电话时的音频通路是如何切换的呢?
- 关于耳机插入,设备管理中:声音设置中却显示"没有耳机插入"
- ubuntu切换到win10之后耳机没声音
- 建立通话,如何连接蓝牙耳机SCO
- 关于切换活动后继续使用蓝牙发送数据的解决办法
- 解决WP7手机使用蓝牙耳机播放视频时无法启动A2DP(没有声音)
- 关于 win7 和 ubuntu 10.04 双系统 在ubuntu系统下扬声器有声音,耳机没有声音的问题。
- iOS 蓝牙耳机切换
- 关于deepin外放有声音,耳机没有声音的奇葩解决方案
- 关于ASUS X55V win7音响或者耳机没有声音的问题
- 解决win10蓝牙耳机正确连接却无法播放网页声音的问题
- 蓝牙耳机拨打电话和VOIP通话两种方式对于上层来说创建SCO过程的区别
- new File(path)关于这个path的绝对与相对路径问题(ps部分 dos下切换盘符,user.dir解释)
- ubuntu 16.04切换到windows 10系统后,耳机没有声音
- 关于电脑前置耳机插孔没声音的问题