项目场景:
step1: 手机连接车载,手机打开导航,导航音频从车载侧传出。
问题描述:
音质不好,尾音有杂音,卡顿现象。原因分析:
导航语音太频繁的 suspend 和 start 的时候就会卡顿,MTK将改了google的 a2dpStandByTime的黑名单方案,将Google的3000ms改为500ms,所以在重复暂停和播放的过程中,上一句没有播放完的语音buffer会被缓存或被清空,导致本句最后一个字或者下一句首个字会杂音。
黑名单相关代码:
system/bt/btif/src/btif_av.cc
465 /**
466 * Set the active peer.
467 *
468 * @param peer_address the active peer address or RawAddress::kEmpty to
469 * reset the active peer
470 * @return true on success, otherwise false
471 */
472 bool SetActivePeer(const RawAddress& peer_address,
473 std::promise<void> peer_ready_promise) {
474 LOG(INFO) << __PRETTY_FUNCTION__ << ": peer: " << peer_address;
475
476 if (active_peer_ == peer_address) {
477 peer_ready_promise.set_value();
478 return true; // Nothing has changed
479 }
480 /** M: IOT device has pop sound when doing music pause,set standbytime as 3s @{ */
481 #if defined(MTK_INTEROP_EXTENSION) && (MTK_INTEROP_EXTENSION == TRUE)
482 if (!peer_address.IsEmpty() && interop_mtk_match_addr_name(
483 INTEROP_MTK_A2DP_SET_STANDBY_TIME, &peer_address/*&peer->PeerAddress()*/)) {
484 BTIF_TRACE_ERROR("%s: Set %s A2dp Standby time to 3s.", __func__,
485 peer_address.ToString().c_str());
486 osi_property_set("persist.vendor.bluetooth.a2dpstandbytime", "3000"); //Google 默认为30000ms
487 } else {
488 BTIF_TRACE_ERROR("%s: Set %s A2dp Standby time to 500ms.", __func__,
489 peer_address.ToString().c_str());
490 osi_property_set("persist.vendor.bluetooth.a2dpstandbytime", "500"); //未加入黑名单时a2dpstandbytime为500ms,可能不能把缓存及时清除完
491 }
492 #endif
......
... }
解决方案相关代码:
platform / system / bt /mediatek / conf / bt_mtk_iot_list.conf
#{ 0xb0 , 0x1f , 0x81 }, /GAC BT 4528/
AddressBlacklist = 9c:8d:7c,d4:ca:6e,b0:1f:81,
在AddressBlacklist 后面加上该厂商设备的蓝牙地址的高8位和无意义位。 b0:1f:81
mediatek / include / interop_database_mtk.h
{ { { 0xb0 , 0x1f , 0x81 ,0 ,0 ,0 } },INTEPOR_MTK_A2DP_SET_STANDBY_TIME },