blob: f398f40687813ed5e0b9401ea3e2ded0bbe1b41a [file] [log] [blame]
/*
* Copyright 2023 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/audio/audio.h>
#include <zephyr/bluetooth/audio/vcp.h>
static struct bt_vcp_vol_ctlr *vcp_vol_ctlr;
static void vcs_discover_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
uint8_t vocs_count, uint8_t aics_count)
{
if (err != 0) {
printk("VCP: Service could not be discovered (%d)\n", err);
return;
}
}
static void vcs_write_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err)
{
if (err != 0) {
printk("VCP: Write failed (%d)\n", err);
return;
}
}
static void vcs_state_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
uint8_t volume, uint8_t mute)
{
if (err != 0) {
printk("VCP: state cb err (%d)", err);
return;
}
printk("VCS volume %u, mute %u\n", volume, mute);
}
static void vcs_flags_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err,
uint8_t flags)
{
if (err != 0) {
printk("VCP: flags cb err (%d)", err);
return;
}
printk("VCS flags 0x%02X\n", flags);
}
static struct bt_vcp_vol_ctlr_cb vcp_cbs = {
.discover = vcs_discover_cb,
.vol_down = vcs_write_cb,
.vol_up = vcs_write_cb,
.mute = vcs_write_cb,
.unmute = vcs_write_cb,
.vol_down_unmute = vcs_write_cb,
.vol_up_unmute = vcs_write_cb,
.vol_set = vcs_write_cb,
.state = vcs_state_cb,
.flags = vcs_flags_cb,
};
static int process_profile_connection(struct bt_conn *conn)
{
int err = 0;
err = bt_vcp_vol_ctlr_discover(conn, &vcp_vol_ctlr);
if (err != 0) {
printk("bt_vcp_vol_ctlr_discover (err %d)\n", err);
}
return err;
}
static void connected(struct bt_conn *conn, uint8_t err)
{
if (err) {
printk("Connection failed (err %d)\n", err);
return;
}
if (process_profile_connection(conn) != 0) {
printk("Profile connection failed");
}
}
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
};
int vcp_vol_ctlr_init(void)
{
int err;
err = bt_vcp_vol_ctlr_cb_register(&vcp_cbs);
if (err != 0) {
printk("CB register failed (err %d)\n", err);
}
return err;
}
int vcp_vol_ctlr_mute(void)
{
int err;
if (vcp_vol_ctlr != NULL) {
err = bt_vcp_vol_ctlr_mute(vcp_vol_ctlr);
} else {
err = -EINVAL;
}
return err;
}
int vcp_vol_ctlr_unmute(void)
{
int err;
if (vcp_vol_ctlr != NULL) {
err = bt_vcp_vol_ctlr_unmute(vcp_vol_ctlr);
} else {
err = -EINVAL;
}
return err;
}
int vcp_vol_ctlr_set_vol(uint8_t volume)
{
int err;
if (vcp_vol_ctlr != NULL) {
err = bt_vcp_vol_ctlr_set_vol(vcp_vol_ctlr, volume);
} else {
err = -EINVAL;
}
return err;
}