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