108406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov/****************************************************************************** 208406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * 308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * Copyright (C) 2016 The Android Open Source Project 408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * Copyright (C) 2009-2012 Broadcom Corporation 508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * 608406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * Licensed under the Apache License, Version 2.0 (the "License"); 708406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * you may not use this file except in compliance with the License. 808406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * You may obtain a copy of the License at: 908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * 1008406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * http://www.apache.org/licenses/LICENSE-2.0 1108406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * 1208406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * Unless required by applicable law or agreed to in writing, software 1308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * distributed under the License is distributed on an "AS IS" BASIS, 1408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * See the License for the specific language governing permissions and 1608406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * limitations under the License. 1708406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov * 1808406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov ******************************************************************************/ 1908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 2008406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#define LOG_TAG "bt_btif_a2dp" 2108406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 2208406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include <stdbool.h> 2308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 24304ceeb5202060a9c625a55369cbf28d72f5e2d9Pavlin Radoslavov#include "audio_a2dp_hw/include/audio_a2dp_hw.h" 2508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "bt_common.h" 2608406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "bta_av_api.h" 2708406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "btif_a2dp.h" 2808406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "btif_a2dp_control.h" 2908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "btif_a2dp_sink.h" 3008406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "btif_a2dp_source.h" 31397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov#include "btif_av.h" 3208406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "btif_util.h" 3308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov#include "osi/include/log.h" 3408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 35397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovvoid btif_a2dp_on_idle(void) { 366c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov APPL_TRACE_WARNING("## ON A2DP IDLE ## peer_sep = %d", 376c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov btif_av_get_peer_sep()); 38397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (btif_av_get_peer_sep() == AVDT_TSEP_SNK) { 39397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_source_on_idle(); 40397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } else if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 41397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_sink_on_idle(); 42397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 4308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 4408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 45397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovbool btif_a2dp_on_started(tBTA_AV_START* p_av_start, bool pending_start) { 46397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov bool ack = false; 4708406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 486c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov APPL_TRACE_WARNING("## ON A2DP STARTED ##"); 4908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 50397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (p_av_start == NULL) { 51397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov /* ack back a local start request */ 52397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_command_ack(A2DP_CTRL_ACK_SUCCESS); 53397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov return true; 54397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 5508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 566c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov APPL_TRACE_WARNING( 576c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov "%s: pending_start = %d status = %d suspending = %d initiator = %d", 586c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov __func__, pending_start, p_av_start->status, p_av_start->suspending, 596c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov p_av_start->initiator); 606c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov 61397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (p_av_start->status == BTA_AV_SUCCESS) { 62397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (!p_av_start->suspending) { 63397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (p_av_start->initiator) { 64397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (pending_start) { 65397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_command_ack(A2DP_CTRL_ACK_SUCCESS); 66397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov ack = true; 6708406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov } 68397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } else { 69397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov /* We were remotely started, make sure codec 70397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov * is setup before datapath is started. 71397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov */ 72397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_source_setup_codec(); 73397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 74397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov 75397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov /* media task is autostarted upon a2dp audiopath connection */ 7608406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov } 77397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } else if (pending_start) { 78397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP start request failed: status = %d", __func__, 79397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov p_av_start->status); 80397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_command_ack(A2DP_CTRL_ACK_FAILURE); 81397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov ack = true; 82397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 83397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov return ack; 8408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 8508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 86397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND* p_av_suspend) { 876c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov APPL_TRACE_WARNING("## ON A2DP STOPPED ##"); 8808406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 89397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 90397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_sink_on_stopped(p_av_suspend); 91397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov return; 92397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 9308406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 94397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_source_on_stopped(p_av_suspend); 9508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 9608406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 97397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND* p_av_suspend) { 986c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov APPL_TRACE_WARNING("## ON A2DP SUSPENDED ##"); 99397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 100397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_sink_on_suspended(p_av_suspend); 101397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } else { 102397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_source_on_suspended(p_av_suspend); 103397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 10408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 10508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 106397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovvoid btif_a2dp_on_offload_started(tBTA_AV_STATUS status) { 107397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov tA2DP_CTRL_ACK ack; 108397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov APPL_TRACE_EVENT("%s status %d", __func__, status); 10908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 110397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov switch (status) { 11108406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov case BTA_AV_SUCCESS: 112397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov ack = A2DP_CTRL_ACK_SUCCESS; 113397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov break; 11408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov case BTA_AV_FAIL_RESOURCES: 115397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov APPL_TRACE_ERROR("%s FAILED UNSUPPORTED", __func__); 116397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov ack = A2DP_CTRL_ACK_UNSUPPORTED; 117397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov break; 11808406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov default: 119397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov APPL_TRACE_ERROR("%s FAILED: status = %d", __func__, status); 120397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov ack = A2DP_CTRL_ACK_FAILURE; 121397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov break; 122397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov } 123397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_command_ack(ack); 12408406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 12508406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov 126397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavovvoid btif_debug_a2dp_dump(int fd) { 127397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_source_debug_dump(fd); 128397e5a5d6a6e14779af8431734ff605ccc49b2a7Pavlin Radoslavov btif_a2dp_sink_debug_dump(fd); 12908406e93e6027082f8102df21f7e59f27c502c18Pavlin Radoslavov} 130