/** @file * @brief Advance Audio Distribution Profile. */ /* * Copyright (c) 2015-2016 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "hci_core.h" #include "conn_internal.h" #include "avdtp_internal.h" #include "a2dp_internal.h" #if !defined(CONFIG_BLUETOOTH_DEBUG_A2DP) #undef BT_DBG #define BT_DBG(fmt, ...) #endif #define A2DP_NO_SPACE (-1) struct bt_a2dp { struct bt_avdtp session; }; /* Connections */ static struct bt_a2dp connection[CONFIG_BLUETOOTH_MAX_CONN]; /* Callback for action confirmation */ static struct bt_avdtp_cfm_cb cb_cfm = { /*TODO*/ }; /* Callback for incoming requests */ static struct bt_avdtp_ind_cb cb_ind = { /*TODO*/ }; /* The above callback structures need to be packed and passed to AVDTP */ static struct bt_avdtp_event_cb avdtp_cb = { .ind = &cb_ind, .cfm = &cb_cfm }; int bt_a2dp_init(void) { int err; /* Register event handlers with AVDTP */ err = bt_avdtp_register(&avdtp_cb); if (err < 0) { BT_ERR("A2DP registration failed"); return err; } BT_DBG("A2DP Initialized successfully."); return 0; } struct bt_a2dp *bt_a2dp_connect(struct bt_conn *conn) { int i, err; int8_t free; free = A2DP_NO_SPACE; if (!conn) { BT_ERR("Invalid Input (err: %d)", -EINVAL); return NULL; } /* Find a space */ for (i = 0; i < CONFIG_BLUETOOTH_MAX_CONN; i++) { if (connection[i].session.br_chan.chan.conn == conn) { BT_DBG("Conn already exists"); return NULL; } if (!connection[i].session.br_chan.chan.conn && free == A2DP_NO_SPACE) { free = i; } } if (free == A2DP_NO_SPACE) { BT_DBG("More connection cannot be supported"); return NULL; } err = bt_avdtp_connect(conn, &connection[free].session); if (err < 0) { /* If error occurs, undo the saving and return the error */ memset(&connection[free], 0, sizeof(struct bt_a2dp)); BT_DBG("AVDTP Connect failed"); return NULL; } BT_DBG("Connect request sent"); return &connection[free]; }