blob: 6a77244302cb2e52cddb920ef30b84e95ee28af3 [file] [log] [blame]
/** @file
* @brief Bluetooth Media Control Profile (MCP) Controller role.
*
* Copyright 2023 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/audio/mcc.h>
#include <zephyr/bluetooth/audio/media_proxy.h>
static struct bt_conn *default_conn;
static K_SEM_DEFINE(sem_discovery_done, 0, 1);
static void mcc_discover_mcs_cb(struct bt_conn *conn, int err)
{
if (err) {
printk("MCP: Discovery of MCS failed (%d)\n", err);
} else {
printk("MCP: Discovered MCS\n");
}
k_sem_give(&sem_discovery_done);
}
static void mcc_send_command_cb(struct bt_conn *conn, int err, const struct mpl_cmd *cmd)
{
if (err) {
printk("MCP: Command send failed (%d) - opcode: %u, param: %d\n",
err, cmd->opcode, cmd->param);
} else {
printk("MCP: Successfully sent command (%d) - opcode: %u, param: %d\n",
err, cmd->opcode, cmd->param);
}
}
static struct bt_mcc_cb mcc_cb = {
.discover_mcs = mcc_discover_mcs_cb,
.send_cmd = mcc_send_command_cb,
};
int mcp_ctlr_init(struct bt_conn *conn)
{
int err;
default_conn = bt_conn_ref(conn);
err = bt_mcc_init(&mcc_cb);
if (err != 0) {
return err;
}
err = bt_mcc_discover_mcs(default_conn, true);
if (err == 0) {
k_sem_take(&sem_discovery_done, K_FOREVER);
}
return err;
}
int mcp_send_cmd(uint8_t mcp_opcode)
{
int err;
struct mpl_cmd cmd;
cmd.opcode = mcp_opcode;
cmd.use_param = false;
if (default_conn == NULL) {
printk("MCP: No connection\n");
return -EINVAL;
}
err = bt_mcc_send_cmd(default_conn, &cmd);
if (err != 0) {
printk("MCP: Command failed: %d\n", err);
}
return err;
}