1 /****************************************************************************** 2 * 3 * Copyright (C) 2016 The Android Open Source Project 4 * Copyright (C) 2009-2012 Broadcom Corporation 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at: 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 ******************************************************************************/ 19 20 #define LOG_TAG "bt_btif_a2dp" 21 22 #include <stdbool.h> 23 24 #include "audio_a2dp_hw/include/audio_a2dp_hw.h" 25 #include "bt_common.h" 26 #include "bta_av_api.h" 27 #include "btif_a2dp.h" 28 #include "btif_a2dp_control.h" 29 #include "btif_a2dp_sink.h" 30 #include "btif_a2dp_source.h" 31 #include "btif_av.h" 32 #include "btif_util.h" 33 #include "osi/include/log.h" 34 35 void btif_a2dp_on_idle(void) { 36 APPL_TRACE_EVENT("## ON A2DP IDLE ## peer_sep = %d", btif_av_get_peer_sep()); 37 if (btif_av_get_peer_sep() == AVDT_TSEP_SNK) { 38 btif_a2dp_source_on_idle(); 39 } else if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 40 btif_a2dp_sink_on_idle(); 41 } 42 } 43 44 bool btif_a2dp_on_started(tBTA_AV_START* p_av_start, bool pending_start) { 45 bool ack = false; 46 47 APPL_TRACE_EVENT("## ON A2DP STARTED ##"); 48 49 if (p_av_start == NULL) { 50 /* ack back a local start request */ 51 btif_a2dp_command_ack(A2DP_CTRL_ACK_SUCCESS); 52 return true; 53 } 54 55 if (p_av_start->status == BTA_AV_SUCCESS) { 56 if (!p_av_start->suspending) { 57 if (p_av_start->initiator) { 58 if (pending_start) { 59 btif_a2dp_command_ack(A2DP_CTRL_ACK_SUCCESS); 60 ack = true; 61 } 62 } else { 63 /* We were remotely started, make sure codec 64 * is setup before datapath is started. 65 */ 66 btif_a2dp_source_setup_codec(); 67 } 68 69 /* media task is autostarted upon a2dp audiopath connection */ 70 } 71 } else if (pending_start) { 72 APPL_TRACE_WARNING("%s: A2DP start request failed: status = %d", __func__, 73 p_av_start->status); 74 btif_a2dp_command_ack(A2DP_CTRL_ACK_FAILURE); 75 ack = true; 76 } 77 return ack; 78 } 79 80 void btif_a2dp_on_stopped(tBTA_AV_SUSPEND* p_av_suspend) { 81 APPL_TRACE_EVENT("## ON A2DP STOPPED ##"); 82 83 if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 84 btif_a2dp_sink_on_stopped(p_av_suspend); 85 return; 86 } 87 88 btif_a2dp_source_on_stopped(p_av_suspend); 89 } 90 91 void btif_a2dp_on_suspended(tBTA_AV_SUSPEND* p_av_suspend) { 92 APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##"); 93 if (btif_av_get_peer_sep() == AVDT_TSEP_SRC) { 94 btif_a2dp_sink_on_suspended(p_av_suspend); 95 } else { 96 btif_a2dp_source_on_suspended(p_av_suspend); 97 } 98 } 99 100 void btif_a2dp_on_offload_started(tBTA_AV_STATUS status) { 101 tA2DP_CTRL_ACK ack; 102 APPL_TRACE_EVENT("%s status %d", __func__, status); 103 104 switch (status) { 105 case BTA_AV_SUCCESS: 106 ack = A2DP_CTRL_ACK_SUCCESS; 107 break; 108 case BTA_AV_FAIL_RESOURCES: 109 APPL_TRACE_ERROR("%s FAILED UNSUPPORTED", __func__); 110 ack = A2DP_CTRL_ACK_UNSUPPORTED; 111 break; 112 default: 113 APPL_TRACE_ERROR("%s FAILED: status = %d", __func__, status); 114 ack = A2DP_CTRL_ACK_FAILURE; 115 break; 116 } 117 btif_a2dp_command_ack(ack); 118 } 119 120 void btif_debug_a2dp_dump(int fd) { 121 btif_a2dp_source_debug_dump(fd); 122 btif_a2dp_sink_debug_dump(fd); 123 } 124