此文章主要解决三个问题

1.高德导航的时候打电话会出现混音问题。

2.蓝牙音乐在播放的时候导航界面语音播报蓝牙音乐会暂停,播报结束会恢复播放不能同时输出问题。

3.蓝牙音乐在播放的时候和导航界面的语音播报混音输出的时候会有蓝牙音乐非常频繁且非常短暂卡顿的问题。

涉及的路径:

packages/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
packages/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamingStateMachine.java
system/bt/btif/src/btif_avrcp_audio_track.cpp 

一,关于蓝牙电话和导航混音的问题

原因在于导航界面的语音播报是持续的并且是连续的,而且每次导航音频的播报都会有音频焦点抢占和播放的动作。而在7.1蓝牙中,只是对蓝牙电话焦点进行了一次抢占,这样就导致了 导航播报的时候会再次抢占到点形成了混音的问题,需要做的就是在蓝牙电话拨出或者接听的时候将系统的焦点修改为

mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

的方式进行抢占关于Android 7.1 的patch

diff --git a/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
index 66e25c8..3968429 100755
--- a/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
+++ b/apps/Bluetooth/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
@@ -330,6 +330,24 @@ final class HeadsetClientStateMachine extends StateMachine {
if (state == c.getState()) {
return;
}
+
+ if (state == BluetoothHeadsetClientCall.CALL_STATE_TERMINATED) {
+ if (c.getState() == BluetoothHeadsetClientCall.CALL_STATE_WAITING) {
+ Log.d(TAG, "Reject waiting call");
+ } else if (getCall(BluetoothHeadsetClientCall.CALL_STATE_HELD) != null) {
+ Log.d(TAG, "Has held call");
+ } else {
+ if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ Log.d(TAG, "abandonAudioFocus ");
+ // abandon audio focus after the mode has been set back to normal
+ mAudioManager.abandonAudioFocusForCall();
+ }
+ }
+ }
+
c.setState(state);
sendCallChangedIntent(c);
Log.d(TAG, "Exit setCallState()");
@@ -902,6 +920,36 @@ final class HeadsetClientStateMachine extends StateMachine {
Log.d(TAG, "updateCallsDone new call id:" + entry.getValue().getId());
sendCallChangedIntent(entry.getValue());
}
+
+ if ((getCurrentState() == mAudioOn) && (entry.getValue().getState() == BluetoothHeadsetClientCall.CALL_STATE_ACTIVE)) {
+ Log.d(TAG, "mode is AudioOn");
+ int newAudioMode = AudioManager.MODE_IN_CALL;
+ int currMode = mAudioManager.getMode();
+ if (currMode != newAudioMode) {
+ // request audio focus before setting the new mode
+ mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+ Log.d(TAG, "setAudioMode Setting audio mode from "
+ + currMode + " to " + newAudioMode);
+ mAudioManager.setMode(newAudioMode);
+ Log.d(TAG,"hfp_enable=true");
+ Log.d(TAG,"mAudioWbs is " + mAudioWbs);
+ if (mAudioWbs) {
+ Log.d(TAG,"Setting sampling rate as 16000");
+ mAudioManager.setParameters("hfp_set_sampling_rate=16000");
+ }
+ else {
+ Log.d(TAG,"Setting sampling rate as 8000");
+ mAudioManager.setParameters("hfp_set_sampling_rate=8000");
+ }
+ mAudioManager.setParameters("hfp_enable=true");
+ }
+ } else {
+ Log.d(TAG, "mode is NOT AudioOn; Don't change audio mode.");
+ }
}mCalls = mCallsUpdate;
@@ -2098,6 +2146,27 @@ final class HeadsetClientStateMachine extends StateMachine {
// Ringing is not handled at this indication and rather should be
// implemented (by the client of this service). Use the
// CALL_STATE_INCOMING (and similar) handle ringing.
+
+ int newAudioMode = AudioManager.MODE_RINGTONE;
+ int currMode = mAudioManager.getMode();
+ if (currMode != newAudioMode) {
+ /// M: PTS TC_HF_ICA_BV_05_I {@
+ if ((currMode == AudioManager.MODE_IN_CALL) &&
+ (mInBandRingtone == HeadsetClientHalConstants.IN_BAND_RING_NOT_PROVIDED)) {
+ disconnectAudioNative(getByteAddress(mCurrentDevice));
+ mAudioManager.abandonAudioFocusForCall();
+ }
+ /// @}
+ // request audio focus before setting the new mode
+ mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_RING,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+ Log.d(TAG, "setAudioMode Setting audio mode from "
+ + currMode + " to " + newAudioMode);
+ mAudioManager.setMode(newAudioMode);
+ }
+
break;
case EVENT_TYPE_CGMI:
Log.d(TAG, "cgmi:" + event.valueString);
@@ -2149,6 +2218,18 @@ final class HeadsetClientStateMachine extends StateMachine {
case HeadsetClientHalConstants.CONNECTION_STATE_DISCONNECTED:
Log.d(TAG, "Connected disconnects.");
// AG disconnects
+
+ if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ Log.d(TAG, "abandonAudioFocus");
+ // abandon audio focus after the mode has been set back to normal
+ mAudioManager.abandonAudioFocusForCall();
+ }
+ Log.d(TAG,"hfp_enable=false");
+ mAudioManager.setParameters("hfp_enable=false");
+
if (mCurrentDevice.equals(device)) {
broadcastConnectionState(mCurrentDevice,
BluetoothProfile.STATE_DISCONNECTED,
@@ -2196,6 +2277,11 @@ final class HeadsetClientStateMachine extends StateMachine {// We need to set the volume after switching into HFP mode as some Audio HALs
// reset the volume to a known-default on mode switch.
+
+ /*
final int amVol =
mAudioManager.getStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO);
final int hfVol = amToHfVol(amVol);
@@ -2213,6 +2299,41 @@ final class HeadsetClientStateMachine extends StateMachine {
Log.d(TAG, "hf_volume " + hfVol);
mAudioManager.setParameters("hfp_enable=true");
mAudioManager.setParameters("hfp_volume=" + hfVol);
+ */
+ //New code
+ BluetoothHeadsetClientCall c = getCall(BluetoothHeadsetClientCall.CALL_STATE_INCOMING);
+ if (mInBandRingtone == HeadsetClientHalConstants.IN_BAND_RING_PROVIDED && c != null) {
+ // Purpose: To workaroud audio driver limitation
+ Log.d(TAG, "Skip In-Band ringtone");
+ } else {
+ int newAudioMode = AudioManager.MODE_IN_CALL;
+ int currMode = mAudioManager.getMode();
+ if (currMode != newAudioMode) {
+ // request audio focus before setting the new mode
+ mAudioManager.requestAudioFocusForCall(AudioManager.STREAM_VOICE_CALL,
+ AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+ Log.d(TAG, "setAudioMode Setting audio mode from "
+ + currMode + " to " + newAudioMode);
+ mAudioManager.setMode(newAudioMode);
+ }
+ Log.d(TAG,"hfp_enable=true");
+ Log.d(TAG,"mAudioWbs is " + mAudioWbs);
+ if (mAudioWbs) {
+ Log.d(TAG,"Setting sampling rate as 16000");
+ mAudioManager.setParameters("hfp_set_sampling_rate=16000");
+ }
+ else {
+ Log.d(TAG,"Setting sampling rate as 8000");
+ mAudioManager.setParameters("hfp_set_sampling_rate=8000");
+ }
+ mAudioManager.setParameters("hfp_enable=true");
+ }
+ broadcastAudioState(device, BluetoothHeadsetClient.STATE_AUDIO_CONNECTED,
+ BluetoothHeadsetClient.STATE_AUDIO_CONNECTING);
+
+
transitionTo(mAudioOn);
break;
case HeadsetClientHalConstants.AUDIO_STATE_CONNECTING:
@@ -2339,6 +2460,18 @@ final class HeadsetClientStateMachine extends StateMachine {
if (mCurrentDevice.equals(device)) {
processAudioEvent(HeadsetClientHalConstants.AUDIO_STATE_DISCONNECTED,
device);
+
+ if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ Log.d(TAG, "abandonAudioFocus");
+ // abandon audio focus after the mode has been set back to normal
+ mAudioManager.abandonAudioFocusForCall();
+ }
+ Log.d(TAG,"hfp_enable=false");
+ mAudioManager.setParameters("hfp_enable=false");broadcastConnectionState(mCurrentDevice,
BluetoothProfile.STATE_DISCONNECTED,
BluetoothProfile.STATE_CONNECTED);
@@ -2371,6 +2504,20 @@ final class HeadsetClientStateMachine extends StateMachine {
// (such as Telecom) and hence this will still keep the call around, there
// is not much we can do here since dropping the call without user consent
// even if the audio connection snapped may not be a good idea.+ BluetoothHeadsetClientCall c = getCall(BluetoothHeadsetClientCall.CALL_STATE_ACTIVE);
+ if (c==null) {
+ if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
+ mAudioManager.setMode(AudioManager.MODE_NORMAL);
+ Log.d(TAG, "abandonAudioFocus");
+ // abandon audio focus after the mode has been set back to normal
+ mAudioManager.abandonAudioFocusForCall();
+ }
+ }
Log.d(TAG,"hfp_enable=false");
mAudioManager.setParameters("hfp_enable=false");
broadcastAudioState(device,

二,关于蓝牙音乐和导航语音播报的时候不能混音输出的问题。

原因是航界面的语音播报是持续的并且是连续的,而7.1的蓝牙在收到焦点切换的时候会进行蓝牙音乐的释放与焦点转换,这个问题的处理方式是对音频焦点切换的时候不做处理,让蓝牙音乐继续之前的播放,这样就可以在蓝牙音乐播放的同事,导航的音频也可以持续的输出,形成混音同时输出

patch如下:

diff --git a/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamingStateMachine.java b/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamingStateMachine.java
index b8b11d1..4c36729 100644
--- a/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamingStateMachine.java
+++ b/apps/Bluetooth/src/com/android/bluetooth/a2dpsink/A2dpSinkStreamingStateMachine.java
@@ -365,7 +365,8 @@ final class A2dpSinkStreamingStateMachine extends StateMachine {
if (newAudioFocus == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {- sendAvrcpPause();
//sendAvrcpPause();
- transitionTo(mFTransient);
+ //transitionTo(mFTransient);
}
if (newAudioFocus == AudioManager.AUDIOFOCUS_LOSS) {
sendAvrcpPause();
@@ -417,7 +418,8 @@ final class A2dpSinkStreamingStateMachine extends StateMachine {
if (newAudioFocus == AudioManager.AUDIOFOCUS_GAIN)- sendAvrcpPlay();
//sendAvrcpPlay();
- transitionTo(mFGranted);
+ //transitionTo(mFGranted);
if (newAudioFocus == AudioManager.AUDIOFOCUS_LOSS) {
abandonAudioFocus();

三,蓝牙音乐和导航播报连续短暂卡顿问题

这个问题是属于蓝牙音乐和导航播报走的是不同的音频流,音频流流频繁切换导致方法是使用别的音频流通道

diff --git a/bt/btif/src/btif_avrcp_audio_track.cpp b/bt/btif/src/btif_avrcp_audio_track.cpp
index 89d2a5f..6e6377e 100644
--- a/bt/btif/src/btif_avrcp_audio_track.cpp
+++ b/bt/btif/src/btif_avrcp_audio_track.cpp
@@ -43,7 +43,7 @@
sp<android::AudioTrack> track =
new android::AudioTrack(AUDIO_STREAM_MUSIC, trackFreq, AUDIO_FORMAT_PCM_16_BIT,
channelType, (size_t) 0 /*frameCount*/,
- (audio_output_flags_t)AUDIO_OUTPUT_FLAG_FAST,
+ (audio_output_flags_t)AUDIO_OUTPUT_FLAG_DEEP_BUFFER,
NULL /*callback_t*/, NULL /*void* user*/, 0 /*notificationFrames*/,
AUDIO_SESSION_ALLOCATE, android::AudioTrack::TRANSFER_SYNC);
assert(track != NULL);

Android 7.1 高德导航和蓝牙音乐卡顿问题 蓝牙电话和高德语音播报混音问题相关推荐

  1. 解决WIN10 连接蓝牙音响卡顿的问题

    解决WIN10 连接蓝牙音响卡顿的问题 问题:在更新电脑驱动或者做一些其他事情. 解决方法:卸载蓝牙耳机驱动,重启电脑. 注:我这个是是win10 小新.如果以下步骤和你的不一样或许可以参考以下,却载 ...

  2. 蓝牙音乐和导航语音播放混音卡顿问题

    最近发现公司自研的智能车载设备上存在一个问题:手机通过蓝牙连接车机,在手机上播放音乐车机上发声然后跟车机上的导航语音播报一起混音播出的时候会出现卡顿的现象:但是在车机上播放音乐和导航混音就正常.另外需 ...

  3. android 高德地图移动卡顿_不只是高德地图 评天猫精灵高德版车盒

    [汽车之家 互联出行] 一辆汽车的研发周期一般需要3-5年甚至更长,作为关乎生命安全的工具,这是合理且必要的,但对重体验而基本不涉及安全的娱乐网联模块来说,这个速度实在太让产品经理们抓狂了.在这个2年 ...

  4. android 播放音乐卡顿,Android MediaPlayer+SeekBar播放音频出现卡顿边长可能问题

    开发过程中总是会碰到一些"什么鬼,原来这么简单"等等的问题,比如今天碰到 Android MediaPlayer+SeekBar播放音频出现卡顿可能问题? 代码段一: seekBa ...

  5. 杰理AC692X---U盘播放无损音乐卡顿问题

    692X在播放无损格式音乐的时候,蓝牙和PC模式都没问题, 唯独U盘和T卡一直会卡顿,把解码时钟改为192M也一样, 最后发现把以下宏定义改大就可以了: #define OUTPUT_BUF_SIZE ...

  6. android 加载h5页面部分机型滑动卡顿回弹_网易爆款H5 的交互方法参考

    在早些年,H5其实更像是手机上的PPT,只支持点击.滑动这些基础手势操作.以内容展示为主,交互形式为辅. 但到了今天,H5的玩法已经有了质的突破.不仅交互形式超多,形式与内容也能紧密结合,产生1+1大 ...

  7. 解决使用 Bluetooth Audio Receiver 蓝牙传音卡顿问题

    很多朋友在使用 Bluetooth Audio Receiver 蓝牙投屏声音时发生了问题,我也查找了很久,终于自己尝试出了解决方案  好像查了个寂寞 解决方案: 1.打开控制面板 (Win+R运行输 ...

  8. 苹果电脑win10蓝牙音响卡顿_Win10使用蓝牙鼠标老是卡顿的原因及解决方法

    随着科技的发展,很多用户开始倾向于在自己的win10电脑配对蓝牙耳机,在使用过程中蓝牙鼠标老是卡顿,影响正常使用.这个问题之前在win7系统就遇到过,到了win10系统依旧如此.如果蓝屏鼠标设备是正常 ...

  9. Android 性能监测工具,优化内存、卡顿、耗电、APK的方法

    导语     安卓大军浩浩荡荡,发展已近十个年头,技术优化月新日异,如今 Android 9.0 代号P  都发布了,Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得 ...

最新文章

  1. 2017-2018 ACM-ICPC Asia East Continent League Final (ECL-Final) 题解(10 / 13)
  2. java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置
  3. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)
  4. Java中的String类
  5. QT的QLibrary类的使用
  6. LCD也可以模拟?这款模拟器别错过了!
  7. IOS开发高级之点餐系统的实现-01
  8. codeforces 600D Area of Two Circles' Intersection
  9. VSCode.exe扩展主机意外终止。请重新加载窗口以恢复。
  10. C# 与C++的数据转换
  11. 【微分方程数值解】常\偏微分方程及其常用数值解法概述
  12. 解决XP精简版(无IIS的XP系统)安装IIS服务器的问题
  13. 软件需求分析——UML用例图
  14. Java自动生成5道100以内的加减法口算题
  15. 03-java制作统计图(柱状,饼状,折线状)
  16. linux网站杀毒软件,linux下的杀毒软件----ClamAV
  17. 老版本 linux 浮点,Linux-浮点运算
  18. 云服务器有token_配置node服务器并且链接微信公众号接口配置
  19. Excel中怎么把一数列数据,用逗号隔开合并到一行
  20. 在文章中主标题和副标题的格式问题

热门文章

  1. pairing function
  2. qt中toLocal8Bit和toUtf8()有什么区别
  3. uniapp移除原生导航栏后页面与手机状态栏重叠问题
  4. 随笔记:利用Apache设置反向代理
  5. 随笔记:PPT渐变色
  6. RPLIDAR思岚雷达学习记录--1--初识a1并跑通
  7. html安全区怎么设置,[GEE引擎]自定义安全区形状的设置方法
  8. 学习突围5 - 关于计划
  9. CUDA-Pinned Host Memory
  10. 技术债务的高息信用卡:深入了解那些知名的端到端机器学习平台