Home | History | Annotate | Download | only in src
      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