/*  Media player skeleton implementation */

/*
 * Copyright (c) 2019 - 2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/sys/util.h>

#include <zephyr/bluetooth/services/ots.h>
#include <zephyr/bluetooth/audio/media_proxy.h>

#include "media_proxy_internal.h"
#include "mpl_internal.h"

#define BT_DBG_ENABLED IS_ENABLED(CONFIG_BT_DEBUG_MPL)
#define LOG_MODULE_NAME bt_mpl
#include "common/log.h"
#include "ccid_internal.h"
#include "mcs_internal.h"

#define TRACK_STATUS_INVALID 0x00
#define TRACK_STATUS_VALID 0x01

#define PLAYBACK_SPEED_PARAM_DEFAULT MEDIA_PROXY_PLAYBACK_SPEED_UNITY

/* Temporary hardcoded setup for groups, tracks and segments */
/* There is one parent group, which is the parent of a number of groups. */
/* The groups have a number of tracks.  */
/* (There is only one level of groups, there are no groups of groups.) */
/* The first track of the first group has track segments, other tracks not. */

/* Track segments */
static struct mpl_tseg seg_2;
static struct mpl_tseg seg_3;

static struct mpl_tseg seg_1 = {
	.name_len = 5,
	.name	  = "Start",
	.pos	  = 0,
	.prev	  = NULL,
	.next	  = &seg_2,
};

static struct mpl_tseg seg_2 = {
	.name_len = 6,
	.name	  = "Middle",
	.pos	  = 2000,
	.prev	  = &seg_1,
	.next	  = &seg_3,
};

static struct mpl_tseg seg_3 = {
	.name_len = 3,
	.name	  = "End",
	.pos	  = 5000,
	.prev	  = &seg_2,
	.next	  = NULL,
};

static struct mpl_track track_1_2;
static struct mpl_track track_1_3;
static struct mpl_track track_1_4;
static struct mpl_track track_1_5;

/* Tracks */
static struct mpl_track track_1_1 = {
	.title	     = "Interlude #1 (Song for Alison)",
	.duration    = 6300,
	.segment     = &seg_1,
	.prev	     = NULL,
	.next	     = &track_1_2,
};


static struct mpl_track track_1_2 = {
	.title	     = "Interlude #2 (For Bobbye)",
	.duration    = 7500,
	.segment     = NULL,
	.prev	     = &track_1_1,
	.next	     = &track_1_3,
};

static struct mpl_track track_1_3 = {
	.title	     = "Interlude #3 (Levanto Seventy)",
	.duration    = 7800,
	.segment     = NULL,
	.prev	     = &track_1_2,
	.next	     = &track_1_4,
};

static struct mpl_track track_1_4 = {
	.title	     = "Interlude #4 (Vesper Dreams)",
	.duration    = 13500,
	.segment     = NULL,
	.prev	     = &track_1_3,
	.next	     = &track_1_5,
};

static struct mpl_track track_1_5 = {
	.title	     = "Interlude #5 (Shasti)",
	.duration    = 7500,
	.segment     = NULL,
	.prev	     = &track_1_4,
	.next	     = NULL,
};

static struct mpl_track track_2_2;
static struct mpl_track track_2_3;

static struct mpl_track track_2_1 = {
	.title	     = "Track 2.1",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = NULL,
	.next	     = &track_2_2,
};

static struct mpl_track track_2_2 = {
	.title	     = "Track 2.2",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = &track_2_1,
	.next	     = &track_2_3,
};

static struct mpl_track track_2_3 = {
	.title	     = "Track 2.3",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = &track_2_2,
	.next	     = NULL,
};

static struct mpl_track track_3_2;
static struct mpl_track track_3_3;

static struct mpl_track track_3_1 = {
	.title	     = "Track 3.1",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = NULL,
	.next	     = &track_3_2,
};

static struct mpl_track track_3_2 = {
	.title	     = "Track 3.2",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = &track_3_1,
	.next	     = &track_3_3,
};

static struct mpl_track track_3_3 = {
	.title	     = "Track 3.3",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = &track_3_2,
	.next	     = NULL,
};

static struct mpl_track track_4_2;

static struct mpl_track track_4_1 = {
	.title	     = "Track 4.1",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = NULL,
	.next	     = &track_4_2,
};

static struct mpl_track track_4_2 = {
	.title	     = "Track 4.2",
	.duration    = 30000,
	.segment     = NULL,
	.prev	     = &track_4_1,
	.next	     = NULL,
};

/* Groups */
static struct mpl_group group_2;
static struct mpl_group group_3;
static struct mpl_group group_4;
static struct mpl_group group_p;

static struct mpl_group group_1 = {
	.title  = "Joe Pass - Guitar Interludes",
	.track	= &track_1_1,
	.parent = &group_p,
	.prev	= NULL,
	.next	= &group_2,
};

static struct mpl_group group_2 = {
	.title  = "Group 2",
	.track	= &track_2_2,
	.parent = &group_p,
	.prev	= &group_1,
	.next	= &group_3,
};

static struct mpl_group group_3 = {
	.title  = "Group 3",
	.track	= &track_3_3,
	.parent = &group_p,
	.prev	= &group_2,
	.next	= &group_4,
};

static struct mpl_group group_4 = {
	.title  = "Group 4",
	.track	= &track_4_2,
	.parent = &group_p,
	.prev	= &group_3,
	.next	= NULL,
};

static struct mpl_group group_p = {
	.title  = "Parent group",
	.track	= &track_4_1,
	.parent = &group_p,
	.prev	= NULL,
	.next	= NULL,
};

static struct mpl_mediaplayer pl = {
	.name			  = CONFIG_BT_MPL_MEDIA_PLAYER_NAME,
	.icon_url		  = CONFIG_BT_MPL_ICON_URL,
	.group			  = &group_1,
	.track_pos		  = 0,
	.state			  = MEDIA_PROXY_STATE_PAUSED,
	.playback_speed_param	  = PLAYBACK_SPEED_PARAM_DEFAULT,
	.seeking_speed_factor	  = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO,
	.playing_order		  = MEDIA_PROXY_PLAYING_ORDER_INORDER_REPEAT,
	.playing_orders_supported = MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_ONCE |
				    MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_REPEAT,
	.opcodes_supported	  = 0x001fffff, /* All opcodes */
#ifdef CONFIG_BT_MPL_OBJECTS
	.search_results_id	  = 0,
	.calls = { 0 },
#endif /* CONFIG_BT_MPL_OBJECTS */
	.next_track_set           = false
};

#ifdef CONFIG_BT_MPL_OBJECTS

/* The types of objects we keep in the Object Transfer Service */
enum mpl_objects {
	MPL_OBJ_NONE = 0,
	MPL_OBJ_ICON,
	MPL_OBJ_TRACK_SEGMENTS,
	MPL_OBJ_TRACK,
	MPL_OBJ_PARENT_GROUP,
	MPL_OBJ_GROUP,
	MPL_OBJ_SEARCH_RESULTS,
};

/* The active object */
/* Only a single object is selected or being added (active) at a time. */
/* And, except for the icon object, all objects can be created dynamically. */
/* So a single buffer to hold object content is sufficient.  */
struct obj_t {
	/* ID of the currently selected object*/
	uint64_t selected_id;

	bool busy;

	/* Type of object being added, e.g. MPL_OBJ_ICON */
	uint8_t add_type;

	/* Descriptor of object being added */
	struct bt_ots_obj_created_desc *desc;
	union {
		/* Pointer to track being added */
		struct mpl_track *add_track;

		/* Pointer to group being added */
		struct mpl_group *add_group;
	};
	struct net_buf_simple *content;
};

static struct obj_t obj = {
	.selected_id = 0,
	.add_type = MPL_OBJ_NONE,
	.busy = false,
	.add_track = NULL,
	.add_group = NULL,
	.content = NET_BUF_SIMPLE(CONFIG_BT_MPL_MAX_OBJ_SIZE)
};

/* Set up content buffer for the icon object */
static int setup_icon_object(void)
{
	uint16_t index;
	uint8_t k;

	/* The icon object is supposed to be a bitmap. */
	/* For now, fill it with dummy data. */

	net_buf_simple_reset(obj.content);

	/* Size may be larger than what fits in 8 bits, use 16-bit for index */
	for (index = 0, k = 0;
	     index < MIN(CONFIG_BT_MPL_MAX_OBJ_SIZE,
			 CONFIG_BT_MPL_ICON_BITMAP_SIZE);
	     index++, k++) {
		net_buf_simple_add_u8(obj.content, k);
	}

	return obj.content->len;
}

/* Set up content buffer for a track segments object */
static uint32_t setup_segments_object(struct mpl_track *track)
{
	struct mpl_tseg *seg = track->segment;

	net_buf_simple_reset(obj.content);

	if (seg) {
		uint32_t tot_size = 0;

		while (seg->prev) {
			seg = seg->prev;
		}
		while (seg) {
			uint32_t seg_size = sizeof(seg->name_len);

			seg_size += seg->name_len;
			seg_size += sizeof(seg->pos);
			if (tot_size + seg_size > obj.content->size) {
				BT_DBG("Segments object out of space");
				break;
			}
			net_buf_simple_add_u8(obj.content, seg->name_len);
			net_buf_simple_add_mem(obj.content, seg->name,
					       seg->name_len);
			net_buf_simple_add_le32(obj.content, seg->pos);

			tot_size += seg_size;
			seg = seg->next;
		}

		LOG_HEXDUMP_DBG(obj.content->data, obj.content->len, "Segments Object");
		BT_DBG("Segments object length: %d", obj.content->len);
	} else {
		BT_ERR("No seg!");
	}

	return obj.content->len;
}

/* Set up content buffer for a track object */
static uint32_t setup_track_object(struct mpl_track *track)
{
	uint16_t index;
	uint8_t k;

	/* The track object is supposed to be in Id3v2 format */
	/* For now, fill it with dummy data */

	net_buf_simple_reset(obj.content);

	/* Size may be larger than what fits in 8 bits, use 16-bit for index */
	for (index = 0, k = 0;
	     index < MIN(CONFIG_BT_MPL_MAX_OBJ_SIZE,
			 CONFIG_BT_MPL_TRACK_MAX_SIZE);
	     index++, k++) {
		net_buf_simple_add_u8(obj.content, k);
	}

	return obj.content->len;
}

/* Set up content buffer for the parent group object */
static uint32_t setup_parent_group_object(struct mpl_group *group)
{
	/* This function actually does not use the parent. */
	/* It just follows the list of groups. */
	/* The implementation has a fixed structure, with one parent group, */
	/* and one level of groups containing tracks only. */
	/* The track groups have a pointer to the parent, but there is no */
	/* poinbter in the other direction, so it is not possible to go from */
	/* the parent group to a group of tracks. */

	uint8_t type = MEDIA_PROXY_GROUP_OBJECT_GROUP_TYPE;
	uint8_t record_size = sizeof(type) + BT_OTS_OBJ_ID_SIZE;
	int next_size = record_size;

	net_buf_simple_reset(obj.content);

	if (group) {
		while (group->prev) {
			group = group->prev;
		}
		/* While there is a group, and the record fits in the object */
		while (group && (next_size <= obj.content->size)) {
			net_buf_simple_add_u8(obj.content, type);
			net_buf_simple_add_le48(obj.content, group->id);
			group = group->next;
			next_size += record_size;
		}
		if (next_size > obj.content->size) {
			BT_WARN("Not room for full group in object");
		}
		LOG_HEXDUMP_DBG(obj.content->data, obj.content->len, "Parent Group Object");
		BT_DBG("Group object length: %d", obj.content->len);
	}
	return obj.content->len;
}

/* Set up contents for a group object */
/* The group object contains a concatenated list of records, where each */
/* record consists of a type byte and a UUID */
static uint32_t setup_group_object(struct mpl_group *group)
{
	struct mpl_track *track = group->track;
	uint8_t type = MEDIA_PROXY_GROUP_OBJECT_TRACK_TYPE;
	uint8_t record_size = sizeof(type) + BT_OTS_OBJ_ID_SIZE;
	int next_size = record_size;

	net_buf_simple_reset(obj.content);

	if (track) {
		while (track->prev) {
			track = track->prev;
		}
		/* While there is a track, and the record fits in the object */
		while (track && (next_size <= obj.content->size)) {
			net_buf_simple_add_u8(obj.content, type);
			net_buf_simple_add_le48(obj.content, track->id);
			track = track->next;
			next_size += record_size;
		}
		if (next_size > obj.content->size) {
			BT_WARN("Not room for full group in object");
		}
		LOG_HEXDUMP_DBG(obj.content->data, obj.content->len, "Group Object");
		BT_DBG("Group object length: %d", obj.content->len);
	}
	return obj.content->len;
}

/* Add the icon object to the OTS */
static int add_icon_object(struct mpl_mediaplayer *pl)
{
	int ret;
	struct bt_ots_obj_add_param add_param = {};
	struct bt_ots_obj_created_desc created_desc = {};
	struct bt_uuid *icon_type = BT_UUID_OTS_TYPE_MPL_ICON;
	static char *icon_name = "Icon";

	if (obj.busy) {
		/* TODO: Can there be a collision between select and internal */
		/* activities, like adding new objects? */
		BT_ERR("Object busy");
		return 0;
	}
	obj.busy = true;
	obj.add_type = MPL_OBJ_ICON;
	obj.desc = &created_desc;

	obj.desc->size.alloc = obj.desc->size.cur = setup_icon_object();
	obj.desc->name = icon_name;
	BT_OTS_OBJ_SET_PROP_READ(obj.desc->props);

	add_param.size = obj.desc->size.alloc;
	add_param.type.uuid.type = BT_UUID_TYPE_16;
	add_param.type.uuid_16.val = BT_UUID_16(icon_type)->val;

	ret = bt_ots_obj_add(bt_mcs_get_ots(), &add_param);
	if (ret < 0) {
		BT_WARN("Unable to add icon object, error %d", ret);
		obj.busy = false;

		return ret;
	}

	return 0;
}

/* Add a track segments object to the OTS */
static int add_current_track_segments_object(struct mpl_mediaplayer *pl)
{
	int ret;
	struct bt_ots_obj_add_param add_param = {};
	struct bt_ots_obj_created_desc created_desc = {};
	struct bt_uuid *segs_type = BT_UUID_OTS_TYPE_TRACK_SEGMENT;

	if (obj.busy) {
		BT_ERR("Object busy");
		return 0;
	}
	obj.busy = true;
	obj.add_type = MPL_OBJ_TRACK_SEGMENTS;
	obj.desc = &created_desc;

	obj.desc->size.alloc = obj.desc->size.cur = setup_segments_object(pl->group->track);
	obj.desc->name = pl->group->track->title;
	BT_OTS_OBJ_SET_PROP_READ(obj.desc->props);

	add_param.size = obj.desc->size.alloc;
	add_param.type.uuid.type = BT_UUID_TYPE_16;
	add_param.type.uuid_16.val = BT_UUID_16(segs_type)->val;

	ret = bt_ots_obj_add(bt_mcs_get_ots(), &add_param);
	if (ret < 0) {
		BT_WARN("Unable to add track segments object: %d", ret);
		obj.busy = false;

		return ret;
	}

	return 0;
}

/* Add a single track to the OTS */
static int add_track_object(struct mpl_track *track)
{
	struct bt_ots_obj_add_param add_param = {};
	struct bt_ots_obj_created_desc created_desc = {};
	struct bt_uuid *track_type = BT_UUID_OTS_TYPE_TRACK;
	int ret;

	if (obj.busy) {
		BT_ERR("Object busy");
		return 0;
	}
	if (!track) {
		BT_ERR("No track");
		return -EINVAL;
	}

	obj.busy = true;

	obj.add_type = MPL_OBJ_TRACK;
	obj.add_track = track;
	obj.desc = &created_desc;

	obj.desc->size.alloc = obj.desc->size.cur = setup_track_object(track);
	obj.desc->name = track->title;
	BT_OTS_OBJ_SET_PROP_READ(obj.desc->props);

	add_param.size = obj.desc->size.alloc;
	add_param.type.uuid.type = BT_UUID_TYPE_16;
	add_param.type.uuid_16.val = BT_UUID_16(track_type)->val;

	ret = bt_ots_obj_add(bt_mcs_get_ots(), &add_param);
	if (ret < 0) {
		BT_WARN("Unable to add track object: %d", ret);
		obj.busy = false;

		return ret;
	}

	return 0;
}

/* Add the parent group to the OTS */
static int add_parent_group_object(struct mpl_mediaplayer *pl)
{
	int ret;
	struct bt_ots_obj_add_param add_param = {};
	struct bt_ots_obj_created_desc created_desc = {};
	struct bt_uuid *group_type = BT_UUID_OTS_TYPE_GROUP;

	if (obj.busy) {
		BT_ERR("Object busy");
		return 0;
	}
	obj.busy = true;
	obj.add_type = MPL_OBJ_PARENT_GROUP;
	obj.desc = &created_desc;

	obj.desc->size.alloc = obj.desc->size.cur = setup_parent_group_object(pl->group);
	obj.desc->name = pl->group->parent->title;
	BT_OTS_OBJ_SET_PROP_READ(obj.desc->props);

	add_param.size = obj.desc->size.alloc;
	add_param.type.uuid.type = BT_UUID_TYPE_16;
	add_param.type.uuid_16.val = BT_UUID_16(group_type)->val;

	ret = bt_ots_obj_add(bt_mcs_get_ots(), &add_param);
	if (ret < 0) {
		BT_WARN("Unable to add parent group object");
		obj.busy = false;

		return ret;
	}

	return 0;
}

/* Add a single group to the OTS */
static int add_group_object(struct mpl_group *group)
{
	struct bt_ots_obj_add_param add_param = {};
	struct bt_ots_obj_created_desc created_desc = {};
	struct bt_uuid *group_type = BT_UUID_OTS_TYPE_GROUP;
	int ret;

	if (obj.busy) {
		BT_ERR("Object busy");
		return 0;
	}

	if (!group) {
		BT_ERR("No group");
		return -EINVAL;
	}

	obj.busy = true;

	obj.add_type = MPL_OBJ_GROUP;
	obj.add_group = group;
	obj.desc = &created_desc;

	obj.desc->size.alloc = obj.desc->size.cur = setup_group_object(group);
	obj.desc->name = group->title;
	BT_OTS_OBJ_SET_PROP_READ(obj.desc->props);

	add_param.size = obj.desc->size.alloc;
	add_param.type.uuid.type = BT_UUID_TYPE_16;
	add_param.type.uuid_16.val = BT_UUID_16(group_type)->val;

	ret = bt_ots_obj_add(bt_mcs_get_ots(), &add_param);
	if (ret < 0) {
		BT_WARN("Unable to add group object: %d", ret);
		obj.busy = false;

		return ret;
	}

	return 0;
}

/* Add all tracks of a group to the OTS */
static int add_group_tracks(struct mpl_group *group)
{
	int ret_overall = 0;
	struct mpl_track *track = group->track;

	if (track) {
		while (track->prev) {
			track = track->prev;
		}

		while (track) {
			int ret = add_track_object(track);

			if (ret && !ret_overall) {
				ret_overall = ret;
			}
			track = track->next;
		}
	}
	return ret_overall;
}

/* Add all groups (except the parent group) and their tracks to the OTS */
static int add_group_and_track_objects(struct mpl_mediaplayer *pl)
{
	int ret_overall = 0;
	int ret;
	struct mpl_group *group = pl->group;

	if (group) {
		while (group->prev) {
			group = group->prev;
		}

		while (group) {
			ret = add_group_tracks(group);
			if (ret && !ret_overall) {
				ret_overall = ret;
			}

			ret = add_group_object(group);
			if (ret && !ret_overall) {
				ret_overall = ret;
			}
			group = group->next;
		}
	}

	ret = add_parent_group_object(pl);
	if (ret && !ret_overall) {
		ret_overall = ret;
	}

	return ret_overall;
}

/**** Callbacks from the object transfer service ******************************/

static int on_obj_deleted(struct bt_ots *ots, struct bt_conn *conn,
			   uint64_t id)
{
	BT_DBG_OBJ_ID("Object Id deleted: ", id);

	return 0;
}

static void on_obj_selected(struct bt_ots *ots, struct bt_conn *conn,
			    uint64_t id)
{
	if (obj.busy) {
		/* TODO: Can there be a collision between select and internal */
		/* activities, like adding new objects? */
		BT_ERR("Object busy - select not performed");
		return;
	}
	obj.busy = true;

	BT_DBG_OBJ_ID("Object Id selected: ", id);

	if (id == pl.icon_id) {
		BT_DBG("Icon Object ID");
		(void)setup_icon_object();
	} else if (id == pl.group->track->segments_id) {
		BT_DBG("Current Track Segments Object ID");
		(void)setup_segments_object(pl.group->track);
	} else if (id == pl.group->track->id) {
		BT_DBG("Current Track Object ID");
		(void)setup_track_object(pl.group->track);
	} else if (pl.next_track_set && id == pl.next.track->id) {
		/* Next track, if the next track has been explicitly set */
		BT_DBG("Next Track Object ID");
		(void)setup_track_object(pl.next.track);
	} else if (id == pl.group->track->next->id) {
		/* Next track, if next track has not been explicitly set */
		BT_DBG("Next Track Object ID");
		(void)setup_track_object(pl.group->track->next);
	} else if (id == pl.group->parent->id) {
		BT_DBG("Parent Group Object ID");
		(void)setup_parent_group_object(pl.group);
	} else if (id == pl.group->id) {
		BT_DBG("Current Group Object ID");
		(void)setup_group_object(pl.group);
	} else {
		BT_ERR("Unknown Object ID");
		obj.busy = false;
		return;
	}

	obj.selected_id = id;
	obj.busy = false;
}

static int on_obj_created(struct bt_ots *ots, struct bt_conn *conn, uint64_t id,
			  const struct bt_ots_obj_add_param *add_param,
			  struct bt_ots_obj_created_desc *created_desc)
{
	BT_DBG_OBJ_ID("Object Id created: ", id);

	*created_desc = *obj.desc;

	if (!bt_uuid_cmp(&add_param->type.uuid, BT_UUID_OTS_TYPE_MPL_ICON)) {
		BT_DBG("Icon Obj Type");
		if (obj.add_type == MPL_OBJ_ICON) {
			obj.add_type = MPL_OBJ_NONE;
			pl.icon_id = id;
		} else {
			BT_DBG("Unexpected object creation");
		}

	} else if (!bt_uuid_cmp(&add_param->type.uuid,
				BT_UUID_OTS_TYPE_TRACK_SEGMENT)) {
		BT_DBG("Track Segments Obj Type");
		if (obj.add_type == MPL_OBJ_TRACK_SEGMENTS) {
			obj.add_type = MPL_OBJ_NONE;
			pl.group->track->segments_id = id;
		} else {
			BT_DBG("Unexpected object creation");
		}

	} else if (!bt_uuid_cmp(&add_param->type.uuid,
				 BT_UUID_OTS_TYPE_TRACK)) {
		BT_DBG("Track Obj Type");
		if (obj.add_type == MPL_OBJ_TRACK) {
			obj.add_type = MPL_OBJ_NONE;
			obj.add_track->id = id;
			obj.add_track = NULL;
		} else {
			BT_DBG("Unexpected object creation");
		}

	} else if (!bt_uuid_cmp(&add_param->type.uuid,
				 BT_UUID_OTS_TYPE_GROUP)) {
		BT_DBG("Group Obj Type");
		if (obj.add_type == MPL_OBJ_PARENT_GROUP) {
			BT_DBG("Parent group");
			obj.add_type = MPL_OBJ_NONE;
			pl.group->parent->id = id;
		} else if (obj.add_type == MPL_OBJ_GROUP) {
			BT_DBG("Other group");
			obj.add_type = MPL_OBJ_NONE;
			obj.add_group->id = id;
			obj.add_group = NULL;
		} else {
			BT_DBG("Unexpected object creation");
		}

	} else {
		BT_DBG("Unknown Object ID");
	}

	if (obj.add_type == MPL_OBJ_NONE) {
		obj.busy = false;
	}
	return 0;
}


static ssize_t on_object_send(struct bt_ots *ots, struct bt_conn *conn,
			      uint64_t id, void **data, size_t len,
			      off_t offset)
{
	if (obj.busy) {
		/* TODO: Can there be a collision between select and internal */
		/* activities, like adding new objects? */
		BT_ERR("Object busy");
		return 0;
	}
	obj.busy = true;

	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		char t[BT_OTS_OBJ_ID_STR_LEN];
		(void)bt_ots_obj_id_to_str(id, t, sizeof(t));
		BT_DBG("Object Id %s, offset %lu, length %zu", t,
		       (long)offset, len);
	}

	if (id != obj.selected_id) {
		BT_ERR("Read from unselected object");
		obj.busy = false;
		return 0;
	}

	if (!data) {
		BT_DBG("Read complete");
		obj.busy = false;
		return 0;
	}

	if (offset >= obj.content->len) {
		BT_DBG("Offset too large");
		obj.busy = false;
		return 0;
	}

	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		if (len > obj.content->len - offset) {
			BT_DBG("Requested len too large");
		}
	}

	*data = &obj.content->data[offset];
	obj.busy = false;
	return MIN(len, obj.content->len - offset);
}

static struct bt_ots_cb ots_cbs = {
	.obj_created = on_obj_created,
	.obj_read = on_object_send,
	.obj_selected = on_obj_selected,
	.obj_deleted = on_obj_deleted,
};

#endif /* CONFIG_BT_MPL_OBJECTS */


/* TODO: It must be possible to replace the do_prev_segment(), do_prev_track */
/* and do_prev_group() with a generic do_prev() command that can be used at */
/* all levels.	Similarly for do_next, do_prev, and so on. */

void do_prev_segment(struct mpl_mediaplayer *pl)
{
	BT_DBG("Segment name before: %s",
	       pl->group->track->segment->name);

	if (pl->group->track->segment->prev != NULL) {
		pl->group->track->segment = pl->group->track->segment->prev;
	}

	BT_DBG("Segment name after: %s",
	       pl->group->track->segment->name);
}

void do_next_segment(struct mpl_mediaplayer *pl)
{
	BT_DBG("Segment name before: %s",
	       pl->group->track->segment->name);

	if (pl->group->track->segment->next != NULL) {
		pl->group->track->segment = pl->group->track->segment->next;
	}

	BT_DBG("Segment name after: %s",
	       pl->group->track->segment->name);
}

void do_first_segment(struct mpl_mediaplayer *pl)
{
	BT_DBG("Segment name before: %s",
	       pl->group->track->segment->name);

	while (pl->group->track->segment->prev != NULL) {
		pl->group->track->segment = pl->group->track->segment->prev;
	}

	BT_DBG("Segment name after: %s",
	       pl->group->track->segment->name);
}

void do_last_segment(struct mpl_mediaplayer *pl)
{
	BT_DBG("Segment name before: %s",
	       pl->group->track->segment->name);

	while (pl->group->track->segment->next != NULL) {
		pl->group->track->segment = pl->group->track->segment->next;
	}

	BT_DBG("Segment name after: %s",
	       pl->group->track->segment->name);
}

void do_goto_segment(struct mpl_mediaplayer *pl, int32_t segnum)
{
	int32_t k;

	BT_DBG("Segment name before: %s",
	       pl->group->track->segment->name);

	if (segnum > 0) {
		/* Goto first segment */
		while (pl->group->track->segment->prev != NULL) {
			pl->group->track->segment =
				pl->group->track->segment->prev;
		}

		/* Then go segnum - 1 tracks forward */
		for (k = 0; k < (segnum - 1); k++) {
			if (pl->group->track->segment->next != NULL) {
				pl->group->track->segment =
					pl->group->track->segment->next;
			}
		}
	} else if (segnum < 0) {
		/* Goto last track */
		while (pl->group->track->segment->next != NULL) {
			pl->group->track->segment =
				pl->group->track->segment->next;
		}

		/* Then go |segnum - 1| tracks back */
		for (k = 0; k < (-segnum - 1); k++) {
			if (pl->group->track->segment->prev != NULL) {
				pl->group->track->segment =
					pl->group->track->segment->prev;
			}
		}
	}

	BT_DBG("Segment name after: %s",
	       pl->group->track->segment->name);
}

static bool do_prev_track(struct mpl_mediaplayer *pl)
{
	bool track_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID before: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->track->prev != NULL) {
		pl->group->track = pl->group->track->prev;
		track_changed = true;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID after: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return track_changed;
}

/* Change to next track according to the current track's next track */
static bool do_next_track_normal_order(struct mpl_mediaplayer *pl)
{
	bool track_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID before: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->track->next != NULL) {
		pl->group->track = pl->group->track->next;
		track_changed = true;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID after: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return track_changed;
}

/* Change to next track when the next track has been explicitly set
 *
 * ALWAYS changes the track, changes the group if required
 * Resets the next_track_set and the "next" pointers
 *
 * Returns true if the _group_ has been changed, otherwise false
 */
static bool do_next_track_next_track_set(struct mpl_mediaplayer *pl)
{
	bool group_changed = false;

	if (pl->next.group != pl->group) {
		pl->group = pl->next.group;
		group_changed = true;
	}

	pl->group->track = pl->next.track;

	pl->next.track = NULL;
	pl->next.group = NULL;
	pl->next_track_set = false;

	return group_changed;
}

static bool do_first_track(struct mpl_mediaplayer *pl)
{
	bool track_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID before: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->track->prev != NULL) {
		pl->group->track = pl->group->track->prev;
		track_changed = true;
	}
	while (pl->group->track->prev != NULL) {
		pl->group->track = pl->group->track->prev;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID after: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return track_changed;
}

static bool do_last_track(struct mpl_mediaplayer *pl)
{
	bool track_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID before: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->track->next != NULL) {
		pl->group->track = pl->group->track->next;
		track_changed = true;
	}
	while (pl->group->track->next != NULL) {
		pl->group->track = pl->group->track->next;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID after: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return track_changed;
}

static bool do_goto_track(struct mpl_mediaplayer *pl, int32_t tracknum)
{
	int32_t count = 0;
	int32_t k;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID before: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (tracknum > 0) {
		/* Goto first track */
		while (pl->group->track->prev != NULL) {
			pl->group->track = pl->group->track->prev;
			count--;
		}

		/* Then go tracknum - 1 tracks forward */
		for (k = 0; k < (tracknum - 1); k++) {
			if (pl->group->track->next != NULL) {
				pl->group->track = pl->group->track->next;
				count++;
			}
		}
	} else if (tracknum < 0) {
		/* Goto last track */
		while (pl->group->track->next != NULL) {
			pl->group->track = pl->group->track->next;
			count++;
		}

		/* Then go |tracknum - 1| tracks back */
		for (k = 0; k < (-tracknum - 1); k++) {
			if (pl->group->track->prev != NULL) {
				pl->group->track = pl->group->track->prev;
				count--;
			}
		}
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Track ID after: ", pl->group->track->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	/* The track has changed if we have moved more in one direction */
	/* than in the other */
	return (count != 0);
}


static bool do_prev_group(struct mpl_mediaplayer *pl)
{
	bool group_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID before: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->prev != NULL) {
		pl->group = pl->group->prev;
		group_changed = true;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID after: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return group_changed;
}

static bool do_next_group(struct mpl_mediaplayer *pl)
{
	bool group_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID before: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->next != NULL) {
		pl->group = pl->group->next;
		group_changed = true;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID after: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return group_changed;
}

static bool do_first_group(struct mpl_mediaplayer *pl)
{
	bool group_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID before: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->prev != NULL) {
		pl->group = pl->group->prev;
		group_changed = true;
	}
	while (pl->group->prev != NULL) {
		pl->group = pl->group->prev;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID after: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return group_changed;
}

static bool do_last_group(struct mpl_mediaplayer *pl)
{
	bool group_changed = false;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID before: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (pl->group->next != NULL) {
		pl->group = pl->group->next;
		group_changed = true;
	}
	while (pl->group->next != NULL) {
		pl->group = pl->group->next;
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID after: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	return group_changed;
}

static bool  do_goto_group(struct mpl_mediaplayer *pl, int32_t groupnum)
{
	int32_t count = 0;
	int32_t k;

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID before: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	if (groupnum > 0) {
		/* Goto first group */
		while (pl->group->prev != NULL) {
			pl->group = pl->group->prev;
			count--;
		}

		/* Then go groupnum - 1 groups forward */
		for (k = 0; k < (groupnum - 1); k++) {
			if (pl->group->next != NULL) {
				pl->group = pl->group->next;
				count++;
			}
		}
	} else if (groupnum < 0) {
		/* Goto last group */
		while (pl->group->next != NULL) {
			pl->group = pl->group->next;
			count++;
		}

		/* Then go |groupnum - 1| groups back */
		for (k = 0; k < (-groupnum - 1); k++) {
			if (pl->group->prev != NULL) {
				pl->group = pl->group->prev;
				count--;
			}
		}
	}

#ifdef CONFIG_BT_MPL_OBJECTS
	BT_DBG_OBJ_ID("Group ID after: ", pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */

	/* The group has changed if we have moved more in one direction */
	/* than in the other */
	return (count != 0);
}

void do_track_change_notifications(struct mpl_mediaplayer *pl)
{
	media_proxy_pl_track_changed_cb();
	media_proxy_pl_track_title_cb(pl->group->track->title);
	media_proxy_pl_track_duration_cb(pl->group->track->duration);
	media_proxy_pl_track_position_cb(pl->track_pos);
#ifdef CONFIG_BT_MPL_OBJECTS
	media_proxy_pl_current_track_id_cb(pl->group->track->id);
	if (pl->group->track->next) {
		media_proxy_pl_next_track_id_cb(pl->group->track->next->id);
	} else {
		/* Send a zero value to indicate that there is no next track */
		media_proxy_pl_next_track_id_cb(MPL_NO_TRACK_ID);
	}
#endif /* CONFIG_BT_MPL_OBJECTS */
}

void do_group_change_notifications(struct mpl_mediaplayer *pl)
{
#ifdef CONFIG_BT_MPL_OBJECTS
	media_proxy_pl_current_group_id_cb(pl->group->id);
#endif /* CONFIG_BT_MPL_OBJECTS */
}

void do_full_prev_group(struct mpl_mediaplayer *pl)
{
	/* Change the group (if not already on first group) */
	if (do_prev_group(pl)) {
		do_group_change_notifications(pl);
		/* If group change, also go to first track in group. */
		/* Notify the track info in all cases - it is a track */
		/* change for the player even if the group was set to */
		/* this track already. */
		(void) do_first_track(pl);
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no group change, still switch to first track, if needed */
	} else if (do_first_track(pl)) {
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no track change, still reset track position, if needed */
	} else if (pl->track_pos != 0) {
		pl->track_pos = 0;
		media_proxy_pl_track_position_cb(pl->track_pos);
	}
}

void do_full_next_group(struct mpl_mediaplayer *pl)
{
	/* Change the group (if not already on last group) */
	if (do_next_group(pl)) {
		do_group_change_notifications(pl);
		/* If group change, also go to first track in group. */
		/* Notify the track info in all cases - it is a track */
		/* change for the player even if the group was set to */
		/* this track already. */
		(void) do_first_track(pl);
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no group change, still switch to first track, if needed */
	} else if (do_first_track(pl)) {
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no track change, still reset track position, if needed */
	} else if (pl->track_pos != 0) {
		pl->track_pos = 0;
		media_proxy_pl_track_position_cb(pl->track_pos);
	}
}

void do_full_first_group(struct mpl_mediaplayer *pl)
{
	/* Change the group (if not already on first group) */
	if (do_first_group(pl)) {
		do_group_change_notifications(pl);
		/* If group change, also go to first track in group. */
		/* Notify the track info in all cases - it is a track */
		/* change for the player even if the group was set to */
		/* this track already. */
		(void) do_first_track(pl);
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no group change, still switch to first track, if needed */
	} else if (do_first_track(pl)) {
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no track change, still reset track position, if needed */
	} else if (pl->track_pos != 0) {
		pl->track_pos = 0;
		media_proxy_pl_track_position_cb(pl->track_pos);
	}
}

void do_full_last_group(struct mpl_mediaplayer *pl)
{
	/* Change the group (if not already on last group) */
	if (do_last_group(pl)) {
		do_group_change_notifications(pl);
		/* If group change, also go to first track in group. */
		/* Notify the track info in all cases - it is a track */
		/* change for the player even if the group was set to */
		/* this track already. */
		(void) do_first_track(pl);
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no group change, still switch to first track, if needed */
	} else if (do_first_track(pl)) {
		pl->track_pos = 0;
		do_track_change_notifications(pl);
	/* If no track change, still reset track position, if needed */
	} else if (pl->track_pos != 0) {
		pl->track_pos = 0;
		media_proxy_pl_track_position_cb(pl->track_pos);
	}
}

void do_full_goto_group(struct mpl_mediaplayer *pl, int32_t groupnum)
{
	/* Change the group (if not already on given group) */
	if (do_goto_group(pl, groupnum)) {
		do_group_change_notifications(pl);
		/* If group change, also go to first track in group. */
		/* Notify the track info in all cases - it is a track */
		/* change for the player even if the group was set to */
		/* this track already. */
		(void) do_first_track(pl);
		pl->track_pos = 0;
		do_track_change_notifications(pl);
		/* If no group change, still switch to first track, if needed */
	} else if (do_first_track(pl)) {
		pl->track_pos = 0;
		do_track_change_notifications(pl);
		/* If no track change, still reset track position, if needed */
	} else if (pl->track_pos != 0) {
		pl->track_pos = 0;
		media_proxy_pl_track_position_cb(pl->track_pos);
	}
}

/* Command handlers (state machines) */
void inactive_state_command_handler(const struct mpl_cmd *command,
				    struct mpl_cmd_ntf *ntf)
{
	BT_DBG("Command opcode: %d", command->opcode);
	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		if (command->use_param) {
			BT_DBG("Command parameter: %d", command->param);
		}
	}
	switch (command->opcode) {
	case MEDIA_PROXY_OP_PLAY: /* Fall-through - handle several cases identically */
	case MEDIA_PROXY_OP_PAUSE:
	case MEDIA_PROXY_OP_FAST_REWIND:
	case MEDIA_PROXY_OP_FAST_FORWARD:
	case MEDIA_PROXY_OP_STOP:
	case MEDIA_PROXY_OP_MOVE_RELATIVE:
	case MEDIA_PROXY_OP_PREV_SEGMENT:
	case MEDIA_PROXY_OP_NEXT_SEGMENT:
	case MEDIA_PROXY_OP_FIRST_SEGMENT:
	case MEDIA_PROXY_OP_LAST_SEGMENT:
	case MEDIA_PROXY_OP_GOTO_SEGMENT:
		ntf->result_code = MEDIA_PROXY_CMD_PLAYER_INACTIVE;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_TRACK:
		if (do_prev_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For previous track, the position is reset to 0 */
			/* even if we stay at the same track (goto start of */
			/* track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_TRACK:
		/* TODO:
		 * The case where the next track has been set explicitly breaks somewhat
		 * with the "next" order hardcoded into the group and track structure
		 */
		if (pl.next_track_set) {
			BT_DBG("Next track set");
			if (do_next_track_next_track_set(&pl)) {
				do_group_change_notifications(&pl);
			}
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else if (do_next_track_normal_order(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		}
		/* For next track, the position is kept if the track */
		/* does not change */
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_TRACK:
		if (do_first_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For first track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_TRACK:
		if (do_last_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For last track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_TRACK:
		if (command->use_param) {
			if (do_goto_track(&pl, command->param)) {
				pl.track_pos = 0;
				do_track_change_notifications(&pl);
			} else {
				/* For goto track, the position is reset to 0 */
				/* even if we stay at the same track (goto */
				/* start of track) */
				pl.track_pos = 0;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			pl.state = MEDIA_PROXY_STATE_PAUSED;
			media_proxy_pl_media_state_cb(pl.state);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_GROUP:
		do_full_prev_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_GROUP:
		do_full_next_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_GROUP:
		do_full_first_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_GROUP:
		do_full_last_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_GROUP:
		if (command->use_param) {
			do_full_goto_group(&pl, command->param);
			pl.state = MEDIA_PROXY_STATE_PAUSED;
			media_proxy_pl_media_state_cb(pl.state);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	default:
		BT_DBG("Invalid command: %d", command->opcode);
		ntf->result_code = MEDIA_PROXY_CMD_NOT_SUPPORTED;
		media_proxy_pl_command_cb(ntf);
		break;
	}
}

void playing_state_command_handler(const struct mpl_cmd *command,
				   struct mpl_cmd_ntf *ntf)
{
	BT_DBG("Command opcode: %d", command->opcode);
	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		if (command->use_param) {
			BT_DBG("Command parameter: %d", command->param);
		}
	}
	switch (command->opcode) {
	case MEDIA_PROXY_OP_PLAY:
		/* Continue playing - i.e. do nothing */
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PAUSE:
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_REWIND:
		/* We're in playing state, seeking speed must have been zero */
		pl.seeking_speed_factor = -MPL_SEEKING_SPEED_FACTOR_STEP;
		pl.state = MEDIA_PROXY_STATE_SEEKING;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_FORWARD:
		/* We're in playing state, seeking speed must have been zero */
		pl.seeking_speed_factor = MPL_SEEKING_SPEED_FACTOR_STEP;
		pl.state = MEDIA_PROXY_STATE_SEEKING;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_STOP:
		pl.track_pos = 0;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_MOVE_RELATIVE:
		if (command->use_param) {
			/* Keep within track - i.e. in the range 0 - duration */
			if (command->param >
			    pl.group->track->duration - pl.track_pos) {
				pl.track_pos = pl.group->track->duration;
			} else if (command->param < -pl.track_pos) {
				pl.track_pos = 0;
			} else {
				pl.track_pos += command->param;
			}
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_track_position_cb(pl.track_pos);
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_SEGMENT:
		/* Switch to previous segment if we are less than <margin> */
		/* into the segment, otherwise go to start of segment */
		if (pl.track_pos - PREV_MARGIN <
		    pl.group->track->segment->pos) {
			do_prev_segment(&pl);
		}
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_SEGMENT:
		do_next_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_SEGMENT:
		do_first_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_SEGMENT:
		do_last_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_SEGMENT:
		if (command->use_param) {
			if (command->param != 0) {
				do_goto_segment(&pl, command->param);
				pl.track_pos = pl.group->track->segment->pos;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			/* If the argument to "goto segment" is zero, */
			/* the segment shall stay the same, and the */
			/* track position shall not change. */
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_TRACK:
		if (do_prev_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For previous track, the position is reset to 0 */
			/* even if we stay at the same track (goto start of */
			/* track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_TRACK:
		if (pl.next_track_set) {
			BT_DBG("Next track set");
			if (do_next_track_next_track_set(&pl)) {
				do_group_change_notifications(&pl);
			}
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else if (do_next_track_normal_order(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		}
		/* For next track, the position is kept if the track */
		/* does not change */
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_TRACK:
		if (do_first_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For first track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_TRACK:
		if (do_last_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For last track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_TRACK:
		if (command->use_param) {
			if (do_goto_track(&pl, command->param)) {
				pl.track_pos = 0;
				do_track_change_notifications(&pl);
			} else {
				/* For goto track, the position is reset to 0 */
				/* even if we stay at the same track (goto */
				/* start of track) */
				pl.track_pos = 0;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_GROUP:
		do_full_prev_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_GROUP:
		do_full_next_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_GROUP:
		do_full_first_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_GROUP:
		do_full_last_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_GROUP:
		if (command->use_param) {
			do_full_goto_group(&pl, command->param);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	default:
		BT_DBG("Invalid command: %d", command->opcode);
		ntf->result_code = MEDIA_PROXY_CMD_NOT_SUPPORTED;
		media_proxy_pl_command_cb(ntf);
		break;
	}
}

void paused_state_command_handler(const struct mpl_cmd *command,
				  struct mpl_cmd_ntf *ntf)
{
	BT_DBG("Command opcode: %d", command->opcode);
	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		if (command->use_param) {
			BT_DBG("Command parameter: %d", command->param);
		}
	}
	switch (command->opcode) {
	case MEDIA_PROXY_OP_PLAY:
		pl.state = MEDIA_PROXY_STATE_PLAYING;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PAUSE:
		/* No change */
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_REWIND:
		/* We're in paused state, seeking speed must have been zero */
		pl.seeking_speed_factor = -MPL_SEEKING_SPEED_FACTOR_STEP;
		pl.state = MEDIA_PROXY_STATE_SEEKING;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_FORWARD:
		/* We're in paused state, seeking speed must have been zero */
		pl.seeking_speed_factor = MPL_SEEKING_SPEED_FACTOR_STEP;
		pl.state = MEDIA_PROXY_STATE_SEEKING;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_STOP:
		pl.track_pos = 0;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_MOVE_RELATIVE:
		if (command->use_param) {
			/* Keep within track - i.e. in the range 0 - duration */
			if (command->param >
			    pl.group->track->duration - pl.track_pos) {
				pl.track_pos = pl.group->track->duration;
			} else if (command->param < -pl.track_pos) {
				pl.track_pos = 0;
			} else {
				pl.track_pos += command->param;
			}
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_track_position_cb(pl.track_pos);
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_SEGMENT:
		/* Switch to previous segment if we are less than 5 seconds */
		/* into the segment, otherwise go to start of segment */
		if (pl.track_pos - PREV_MARGIN <
		    pl.group->track->segment->pos) {
			do_prev_segment(&pl);
		}
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_SEGMENT:
		do_next_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_SEGMENT:
		do_first_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_SEGMENT:
		do_last_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_SEGMENT:
		if (command->use_param) {
			if (command->param != 0) {
				do_goto_segment(&pl, command->param);
				pl.track_pos = pl.group->track->segment->pos;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			/* If the argument to "goto segment" is zero, */
			/* the segment shall stay the same, and the */
			/* track position shall not change. */
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_TRACK:
		if (do_prev_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For previous track, the position is reset to 0 */
			/* even if we stay at the same track (goto start of */
			/* track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_TRACK:
		if (pl.next_track_set) {
			BT_DBG("Next track set");
			if (do_next_track_next_track_set(&pl)) {
				do_group_change_notifications(&pl);
			}
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else if (do_next_track_normal_order(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		}
		/* For next track, the position is kept if the track */
		/* does not change */
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_TRACK:
		if (do_first_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For first track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_TRACK:
		if (do_last_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For last track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_TRACK:
		if (command->use_param) {
			if (do_goto_track(&pl, command->param)) {
				pl.track_pos = 0;
				do_track_change_notifications(&pl);
			} else {
				/* For goto track, the position is reset to 0 */
				/* even if we stay at the same track (goto */
				/* start of track) */
				pl.track_pos = 0;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_GROUP:
		do_full_prev_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_GROUP:
		do_full_next_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_GROUP:
		do_full_first_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_GROUP:
		do_full_last_group(&pl);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_GROUP:
		if (command->use_param) {
			do_full_goto_group(&pl, command->param);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	default:
		BT_DBG("Invalid command: %d", command->opcode);
		ntf->result_code = MEDIA_PROXY_CMD_NOT_SUPPORTED;
		media_proxy_pl_command_cb(ntf);
		break;
	}
}

void seeking_state_command_handler(const struct mpl_cmd *command,
				   struct mpl_cmd_ntf *ntf)
{
	BT_DBG("Command opcode: %d", command->opcode);
	if (IS_ENABLED(CONFIG_BT_DEBUG_MPL)) {
		if (command->use_param) {
			BT_DBG("Command parameter: %d", command->param);
		}
	}
	switch (command->opcode) {
	case MEDIA_PROXY_OP_PLAY:
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.state = MEDIA_PROXY_STATE_PLAYING;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PAUSE:
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		/* TODO: Set track and track position */
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_REWIND:
		/* TODO: Here, and for FAST_FORWARD */
		/* Decide on algorithm for multiple presses - add step (as */
		/* now) or double/half? */
		/* What about FR followed by FF? */
		/* Currently, the seeking speed may also become	 zero */
		/* Lowest value allowed by spec is -64, notify on change only */
		if (pl.seeking_speed_factor >= -(MEDIA_PROXY_SEEKING_SPEED_FACTOR_MAX
						 - MPL_SEEKING_SPEED_FACTOR_STEP)) {
			pl.seeking_speed_factor -= MPL_SEEKING_SPEED_FACTOR_STEP;
			media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FAST_FORWARD:
		/* Highest value allowed by spec is 64, notify on change only */
		if (pl.seeking_speed_factor <= (MEDIA_PROXY_SEEKING_SPEED_FACTOR_MAX
						- MPL_SEEKING_SPEED_FACTOR_STEP)) {
			pl.seeking_speed_factor += MPL_SEEKING_SPEED_FACTOR_STEP;
			media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		}
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_STOP:
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.track_pos = 0;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_MOVE_RELATIVE:
		if (command->use_param) {
			/* Keep within track - i.e. in the range 0 - duration */
			if (command->param >
			    pl.group->track->duration - pl.track_pos) {
				pl.track_pos = pl.group->track->duration;
			} else if (command->param < -pl.track_pos) {
				pl.track_pos = 0;
			} else {
				pl.track_pos += command->param;
			}
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_track_position_cb(pl.track_pos);
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_SEGMENT:
		/* Switch to previous segment if we are less than 5 seconds */
		/* into the segment, otherwise go to start of segment */
		if (pl.track_pos - PREV_MARGIN <
		    pl.group->track->segment->pos) {
			do_prev_segment(&pl);
		}
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_SEGMENT:
		do_next_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_SEGMENT:
		do_first_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_SEGMENT:
		do_last_segment(&pl);
		pl.track_pos = pl.group->track->segment->pos;
		media_proxy_pl_track_position_cb(pl.track_pos);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_SEGMENT:
		if (command->use_param) {
			if (command->param != 0) {
				do_goto_segment(&pl, command->param);
				pl.track_pos = pl.group->track->segment->pos;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			/* If the argument to "goto segment" is zero, */
			/* the segment shall stay the same, and the */
			/* track position shall not change. */
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_TRACK:
		if (do_prev_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For previous track, the position is reset to 0 */
			/* even if we stay at the same track (goto start of */
			/* track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_TRACK:
		if (pl.next_track_set) {
			BT_DBG("Next track set");
			if (do_next_track_next_track_set(&pl)) {
				do_group_change_notifications(&pl);
			}
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else if (do_next_track_normal_order(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		}
		/* For next track, the position is kept if the track */
		/* does not change */
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_TRACK:
		if (do_first_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For first track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_TRACK:
		if (do_last_track(&pl)) {
			pl.track_pos = 0;
			do_track_change_notifications(&pl);
		} else {
			/* For last track, the position is reset to 0 even */
			/* if we stay at the same track (goto start of track) */
			pl.track_pos = 0;
			media_proxy_pl_track_position_cb(pl.track_pos);
		}
		pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_TRACK:
		if (command->use_param) {
			if (do_goto_track(&pl, command->param)) {
				pl.track_pos = 0;
				do_track_change_notifications(&pl);
			} else {
				/* For goto track, the position is reset to 0 */
				/* even if we stay at the same track (goto */
				/* start of track) */
				pl.track_pos = 0;
				media_proxy_pl_track_position_cb(pl.track_pos);
			}
			pl.seeking_speed_factor = MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO;
			pl.state = MEDIA_PROXY_STATE_PAUSED;
			media_proxy_pl_media_state_cb(pl.state);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_PREV_GROUP:
		do_full_prev_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_NEXT_GROUP:
		do_full_next_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_FIRST_GROUP:
		do_full_first_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_LAST_GROUP:
		do_full_last_group(&pl);
		pl.state = MEDIA_PROXY_STATE_PAUSED;
		media_proxy_pl_media_state_cb(pl.state);
		ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		media_proxy_pl_command_cb(ntf);
		break;
	case MEDIA_PROXY_OP_GOTO_GROUP:
		if (command->use_param) {
			do_full_goto_group(&pl, command->param);
			pl.state = MEDIA_PROXY_STATE_PAUSED;
			media_proxy_pl_media_state_cb(pl.state);
			ntf->result_code = MEDIA_PROXY_CMD_SUCCESS;
		} else {
			ntf->result_code = MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED;
		}
		media_proxy_pl_command_cb(ntf);
		break;
	default:
		BT_DBG("Invalid command: %d", command->opcode);
		ntf->result_code = MEDIA_PROXY_CMD_NOT_SUPPORTED;
		media_proxy_pl_command_cb(ntf);
		break;
	}
}

void (*command_handlers[MEDIA_PROXY_STATE_LAST])(const struct mpl_cmd *command,
						  struct mpl_cmd_ntf *ntf) = {
	inactive_state_command_handler,
	playing_state_command_handler,
	paused_state_command_handler,
	seeking_state_command_handler
};

#ifdef CONFIG_BT_MPL_OBJECTS
/* Find a track by ID
 *
 * If found, return pointers to the group of the track and the track,
 * otherwise, the pointers returned are NULL
 *
 * Returns true if found, false otherwise
 */
static bool find_track_by_id(const struct mpl_mediaplayer *pl, uint64_t id,
			     struct mpl_group **group, struct mpl_track **track)
{
	struct mpl_group *tmp_group = pl->group;
	struct mpl_track *tmp_track;

	while (tmp_group->prev != NULL) {
		tmp_group = tmp_group->prev;
	}

	while (tmp_group != NULL) {
		tmp_track = tmp_group->track;

		while (tmp_track->prev != NULL) {
			tmp_track = tmp_track->prev;
		}

		while (tmp_track != 0) {
			if (tmp_track->id == id) {
				/* Found the track */
				*group = tmp_group;
				*track = tmp_track;
				return true;
			}

			tmp_track = tmp_track->next;
		}

		tmp_group = tmp_group->next;
	}

	/* Track not found */
	*group = NULL;
	*track = NULL;
	return false;
}

/* Find a group by ID
 *
 * If found, return pointer to the group, otherwise, the pointer returned is NULL
 *
 * Returns true if found, false otherwise
 */
static bool find_group_by_id(const struct mpl_mediaplayer *pl, uint64_t id,
			     struct mpl_group **group)
{
	struct mpl_group *tmp_group = pl->group;

	while (tmp_group->prev != NULL) {
		tmp_group = tmp_group->prev;
	}

	while (tmp_group != NULL) {
		if (tmp_group->id == id) {
			/* Found the group */
			*group = tmp_group;
			return true;
		}

		tmp_group = tmp_group->next;
	}

	/* Group not found */
	*group = NULL;
	return false;
}
#endif /* CONFIG_BT_MPL_OBJECTS */

const char *get_player_name(void)
{
	return pl.name;
}

#ifdef CONFIG_BT_MPL_OBJECTS
uint64_t get_icon_id(void)
{
	return pl.icon_id;
}
#endif /* CONFIG_BT_MPL_OBJECTS */

const char *get_icon_url(void)
{
	return pl.icon_url;
}

const char *get_track_title(void)
{
	return pl.group->track->title;
}

int32_t get_track_duration(void)
{
	return pl.group->track->duration;
}

int32_t get_track_position(void)
{
	return pl.track_pos;
}

void set_track_position(int32_t position)
{
	int32_t old_pos = pl.track_pos;
	int32_t new_pos;

	if (position >= 0) {
		if (position > pl.group->track->duration) {
			/* Do not go beyond end of track */
			new_pos = pl.group->track->duration;
		} else {
			new_pos = position;
		}
	} else {
		/* Negative position, handle as offset from _end_ of track */
		/* (Note minus sign below) */
		if (position < -pl.group->track->duration) {
			new_pos = 0;
		} else {
			/* (Remember position is negative) */
			new_pos = pl.group->track->duration + position;
		}
	}

	BT_DBG("Pos. given: %d, resulting pos.: %d (duration is %d)",
	       position, new_pos, pl.group->track->duration);

	if (new_pos != old_pos) {
		/* Set new position and notify it */
		pl.track_pos = new_pos;
		media_proxy_pl_track_position_cb(new_pos);
	}
}

int8_t get_playback_speed(void)
{
	return pl.playback_speed_param;
}

void set_playback_speed(int8_t speed)
{
	/* Set new speed parameter and notify, if different from current */
	if (speed != pl.playback_speed_param) {
		pl.playback_speed_param = speed;
		media_proxy_pl_playback_speed_cb(pl.playback_speed_param);
	}
}

int8_t get_seeking_speed(void)
{
	return pl.seeking_speed_factor;
}

#ifdef CONFIG_BT_MPL_OBJECTS
uint64_t get_track_segments_id(void)
{
	return pl.group->track->segments_id;
}

uint64_t get_current_track_id(void)
{
	return pl.group->track->id;
}

void set_current_track_id(uint64_t id)
{
	struct mpl_group *group;
	struct mpl_track *track;

	BT_DBG_OBJ_ID("Track ID to set: ", id);

	if (find_track_by_id(&pl, id, &group, &track)) {

		if (pl.group != group) {
			pl.group = group;
			do_group_change_notifications(&pl);

			/* Group change implies track change (even if same track in other group) */
			pl.group->track = track;
			do_track_change_notifications(&pl);

		} else if (pl.group->track != track) {
			pl.group->track = track;
			do_track_change_notifications(&pl);
		}
		return;
	}

	BT_DBG("Track not found");

	/* TODO: Should an error be returned here?
	 * That would require a rewrite of the MPL api to add return values to the functions.
	 */
}

uint64_t get_next_track_id(void)
{
	/* If the next track has been set explicitly */
	if (pl.next_track_set) {
		return pl.next.track->id;
	}

	/* Normal playing order */
	if (pl.group->track->next) {
		return pl.group->track->next->id;
	}

	/* Return zero value to indicate that there is no next track */
	return MPL_NO_TRACK_ID;
}

void set_next_track_id(uint64_t id)
{
	struct mpl_group *group;
	struct mpl_track *track;

	BT_DBG_OBJ_ID("Next Track ID to set: ", id);

	if (find_track_by_id(&pl, id, &group, &track)) {

		pl.next_track_set = true;
		pl.next.group = group;
		pl.next.track = track;
		media_proxy_pl_next_track_id_cb(id);
		return;
	}

	BT_DBG("Track not found");
}

uint64_t get_parent_group_id(void)
{
	return pl.group->parent->id;
}

uint64_t get_current_group_id(void)
{
	return pl.group->id;
}

void set_current_group_id(uint64_t id)
{
	struct mpl_group *group;
	bool track_change;

	BT_DBG_OBJ_ID("Group ID to set: ", id);

	if (find_group_by_id(&pl, id, &group)) {

		if (pl.group != group) {
			/* Change to found group */
			pl.group = group;
			do_group_change_notifications(&pl);

			/* And change to first track in group */
			track_change = do_first_track(&pl);
			if (track_change) {
				do_track_change_notifications(&pl);
			}
		}
		return;
	}

	BT_DBG("Group not found");
}
#endif /* CONFIG_BT_MPL_OBJECTS */

uint8_t get_playing_order(void)
{
	return pl.playing_order;
}

void set_playing_order(uint8_t order)
{
	if (order != pl.playing_order) {
		if (BIT(order - 1) & pl.playing_orders_supported) {
			pl.playing_order = order;
			media_proxy_pl_playing_order_cb(pl.playing_order);
		}
	}
}

uint16_t get_playing_orders_supported(void)
{
	return pl.playing_orders_supported;
}

uint8_t get_media_state(void)
{
	return pl.state;
}

void send_command(const struct mpl_cmd *command)
{
	struct mpl_cmd_ntf ntf;

	if (command->use_param) {
		BT_DBG("opcode: %d, param: %d", command->opcode, command->param);
	} else {
		BT_DBG("opcode: %d", command->opcode);
	}

	if (pl.state < MEDIA_PROXY_STATE_LAST) {
		ntf.requested_opcode = command->opcode;
		command_handlers[pl.state](command, &ntf);
	} else {
		BT_DBG("INVALID STATE");
	}
}

uint32_t get_commands_supported(void)
{
	return pl.opcodes_supported;
}

#ifdef CONFIG_BT_MPL_OBJECTS
static void parse_search(const struct mpl_search *search)
{
	uint8_t index = 0;
	struct mpl_sci sci;
	uint8_t sci_num = 0;
	bool search_failed = false;

	if (search->len > SEARCH_LEN_MAX) {
		BT_WARN("Search too long (%d) - aborting", search->len);
		search_failed = true;
	} else {
		BT_DBG("Parsing %d octets search", search->len);

		while (search->len - index > 0) {
			sci.len = (uint8_t)search->search[index++];
			if (sci.len < SEARCH_SCI_LEN_MIN) {
				BT_WARN("Invalid length field - too small");
				search_failed = true;
				break;
			}
			if (sci.len > (search->len - index)) {
				BT_WARN("Incomplete search control item");
				search_failed = true;
				break;
			}
			sci.type = (uint8_t)search->search[index++];
			if (sci.type <  MEDIA_PROXY_SEARCH_TYPE_TRACK_NAME ||
			    sci.type > MEDIA_PROXY_SEARCH_TYPE_ONLY_GROUPS) {
				search_failed = true;
				break;
			}
			(void)memcpy(&sci.param, &search->search[index], sci.len - 1);
			index += sci.len - 1;

			BT_DBG("SCI # %d: type: %d", sci_num, sci.type);
			LOG_HEXDUMP_DBG(sci.param, sci.len - 1, "param:");
			sci_num++;
		}
	}

	/* TODO: Add real search functionality. */
	/* For now, just fake it. */

	if (search_failed) {
		pl.search_results_id = 0;
		media_proxy_pl_search_cb(MEDIA_PROXY_SEARCH_FAILURE);
	} else {
		/* Use current group as search result for now */
		pl.search_results_id = pl.group->id;
		media_proxy_pl_search_cb(MEDIA_PROXY_SEARCH_SUCCESS);
	}

	media_proxy_pl_search_results_id_cb(pl.search_results_id);
}

void send_search(const struct mpl_search *search)
{
	if (search->len > SEARCH_LEN_MAX) {
		BT_WARN("Search too long: %d", search->len);
	}

	LOG_HEXDUMP_DBG(search->search, search->len, "Search");

	parse_search(search);
}

uint64_t get_search_results_id(void)
{
	return pl.search_results_id;
}
#endif /* CONFIG_BT_MPL_OBJECTS */

uint8_t get_content_ctrl_id(void)
{
	return pl.content_ctrl_id;
}

int media_proxy_pl_init(void)
{
	static bool initialized;
	int ret;

	if (initialized) {
		BT_DBG("Already initialized");
		return -EALREADY;
	}

	/* Set up the media control service */
	/* TODO: Fix initialization - who initializes what
	 * https://github.com/zephyrproject-rtos/zephyr/issues/42965
	 * Temporarily only initializing if service is present
	 */
#ifdef CONFIG_BT_MCS
#ifdef CONFIG_BT_MPL_OBJECTS
	ret = bt_mcs_init(&ots_cbs);
#else
	ret = bt_mcs_init(NULL);
#endif /* CONFIG_BT_MPL_OBJECTS */
	if (ret < 0) {
		BT_ERR("Could not init MCS: %d", ret);
		return ret;
	}
#else
	BT_WARN("MCS not configured");
#endif /* CONFIG_BT_MCS */

	/* Get a Content Control ID */
	pl.content_ctrl_id = bt_ccid_get_value();

#ifdef CONFIG_BT_MPL_OBJECTS
	/* Initialize the object content buffer */
	net_buf_simple_init(obj.content, 0);

	/* Icon Object */
	ret = add_icon_object(&pl);
	if (ret < 0) {
		BT_ERR("Unable to add icon object, error %d", ret);
		return ret;
	}

	/* Add all tracks and groups to OTS */
	ret = add_group_and_track_objects(&pl);
	if (ret < 0) {
		BT_ERR("Error adding tracks and groups to OTS, error %d", ret);
		return ret;
	}

	/* Initial setup of Track Segments Object */
	/* TODO: Later, this should be done when the tracks are added */
	/* but for no only one of the tracks has segments .*/
	ret = add_current_track_segments_object(&pl);
	if (ret < 0) {
		BT_ERR("Error adding Track Segments Object to OTS, error %d", ret);
		return ret;
	}
#endif /* CONFIG_BT_MPL_OBJECTS */

	/* Set up the calls structure */
	pl.calls.get_player_name              = get_player_name;
#ifdef CONFIG_BT_MPL_OBJECTS
	pl.calls.get_icon_id                  = get_icon_id;
#endif /* CONFIG_BT_MPL_OBJECTS */
	pl.calls.get_icon_url                 = get_icon_url;
	pl.calls.get_track_title              = get_track_title;
	pl.calls.get_track_duration           = get_track_duration;
	pl.calls.get_track_position           = get_track_position;
	pl.calls.set_track_position           = set_track_position;
	pl.calls.get_playback_speed           = get_playback_speed;
	pl.calls.set_playback_speed           = set_playback_speed;
	pl.calls.get_seeking_speed            = get_seeking_speed;
#ifdef CONFIG_BT_MPL_OBJECTS
	pl.calls.get_track_segments_id        = get_track_segments_id;
	pl.calls.get_current_track_id         = get_current_track_id;
	pl.calls.set_current_track_id         = set_current_track_id;
	pl.calls.get_next_track_id            = get_next_track_id;
	pl.calls.set_next_track_id            = set_next_track_id;
	pl.calls.get_parent_group_id          = get_parent_group_id;
	pl.calls.get_current_group_id         = get_current_group_id;
	pl.calls.set_current_group_id         = set_current_group_id;
#endif /* CONFIG_BT_MPL_OBJECTS */
	pl.calls.get_playing_order            = get_playing_order;
	pl.calls.set_playing_order            = set_playing_order;
	pl.calls.get_playing_orders_supported = get_playing_orders_supported;
	pl.calls.get_media_state              = get_media_state;
	pl.calls.send_command                 = send_command;
	pl.calls.get_commands_supported       = get_commands_supported;
#ifdef CONFIG_BT_MPL_OBJECTS
	pl.calls.send_search                  = send_search;
	pl.calls.get_search_results_id        = get_search_results_id;
#endif /* CONFIG_BT_MPL_OBJECTS */
	pl.calls.get_content_ctrl_id          = get_content_ctrl_id;

	ret = media_proxy_pl_register(&pl.calls);
	if (ret < 0) {
		BT_ERR("Unable to register player");
		return ret;
	}

	initialized = true;
	return 0;
}

#if CONFIG_BT_DEBUG_MPL /* Special commands for debugging */

void mpl_debug_dump_state(void)
{
#if CONFIG_BT_MPL_OBJECTS
	char t[BT_OTS_OBJ_ID_STR_LEN];
	struct mpl_group *group;
	struct mpl_track *track;
#endif /* CONFIG_BT_MPL_OBJECTS */

	BT_DBG("Mediaplayer name: %s", pl.name);

#if CONFIG_BT_MPL_OBJECTS
	(void)bt_ots_obj_id_to_str(pl.icon_id, t, sizeof(t));
	BT_DBG("Icon ID: %s", t);
#endif /* CONFIG_BT_MPL_OBJECTS */

	BT_DBG("Icon URL: %s", pl.icon_url);
	BT_DBG("Track position: %d", pl.track_pos);
	BT_DBG("Media state: %d", pl.state);
	BT_DBG("Playback speed parameter: %d", pl.playback_speed_param);
	BT_DBG("Seeking speed factor: %d", pl.seeking_speed_factor);
	BT_DBG("Playing order: %d", pl.playing_order);
	BT_DBG("Playing orders supported: 0x%x", pl.playing_orders_supported);
	BT_DBG("Opcodes supported: %d", pl.opcodes_supported);
	BT_DBG("Content control ID: %d", pl.content_ctrl_id);

#if CONFIG_BT_MPL_OBJECTS
	(void)bt_ots_obj_id_to_str(pl.group->parent->id, t, sizeof(t));
	BT_DBG("Current group's parent: %s", t);

	(void)bt_ots_obj_id_to_str(pl.group->id, t, sizeof(t));
	BT_DBG("Current group: %s", t);

	(void)bt_ots_obj_id_to_str(pl.group->track->id, t, sizeof(t));
	BT_DBG("Current track: %s", t);

	if (pl.next_track_set) {
		(void)bt_ots_obj_id_to_str(pl.next.track->id, t, sizeof(t));
		BT_DBG("Next track: %s", t);
	} else if (pl.group->track->next) {
		(void)bt_ots_obj_id_to_str(pl.group->track->next->id, t,
					   sizeof(t));
		BT_DBG("Next track: %s", t);
	} else {
		BT_DBG("No next track");
	}

	if (pl.search_results_id) {
		(void)bt_ots_obj_id_to_str(pl.search_results_id, t, sizeof(t));
		BT_DBG("Search results: %s", t);
	} else {
		BT_DBG("No search results");
	}

	BT_DBG("Groups and tracks:");
	group = pl.group;

	while (group->prev != NULL) {
		group = group->prev;
	}

	while (group) {
		(void)bt_ots_obj_id_to_str(group->id, t, sizeof(t));
		BT_DBG("Group: %s, %s", t,
		       group->title);

		(void)bt_ots_obj_id_to_str(group->parent->id, t, sizeof(t));
		BT_DBG("\tParent: %s, %s", t,
		       group->parent->title);

		track = group->track;
		while (track->prev != NULL) {
			track = track->prev;
		}

		while (track) {
			(void)bt_ots_obj_id_to_str(track->id, t, sizeof(t));
			BT_DBG("\tTrack: %s, %s, duration: %d", t,
			       track->title, track->duration);
			track = track->next;
		}

		group = group->next;
	}
#endif /* CONFIG_BT_MPL_OBJECTS */
}
#endif /* CONFIG_BT_DEBUG_MPL */


#if defined(CONFIG_BT_DEBUG_MPL) && defined(CONFIG_BT_TESTING) /* Special commands for testing */

#if CONFIG_BT_MPL_OBJECTS
void mpl_test_unset_parent_group(void)
{
	BT_DBG("Setting current group to be it's own parent");
	pl.group->parent = pl.group;
}
#endif /* CONFIG_BT_MPL_OBJECTS */

void mpl_test_media_state_set(uint8_t state)
{
	pl.state = state;
	media_proxy_pl_media_state_cb(pl.state);
}

void mpl_test_track_changed_cb(void)
{
	media_proxy_pl_track_changed_cb();
}

void mpl_test_title_changed_cb(void)
{
	media_proxy_pl_track_title_cb(pl.group->track->title);
}

void mpl_test_duration_changed_cb(void)
{
	media_proxy_pl_track_duration_cb(pl.group->track->duration);
}

void mpl_test_position_changed_cb(void)
{
	media_proxy_pl_track_position_cb(pl.track_pos);
}

void mpl_test_playback_speed_changed_cb(void)
{
	media_proxy_pl_playback_speed_cb(pl.playback_speed_param);
}

void mpl_test_seeking_speed_changed_cb(void)
{
	media_proxy_pl_seeking_speed_cb(pl.seeking_speed_factor);
}

#ifdef CONFIG_BT_MPL_OBJECTS
void mpl_test_current_track_id_changed_cb(void)
{
	media_proxy_pl_current_track_id_cb(pl.group->track->id);
}

void mpl_test_next_track_id_changed_cb(void)
{
	media_proxy_pl_next_track_id_cb(pl.group->track->next->id);
}

void mpl_test_parent_group_id_changed_cb(void)
{
	media_proxy_pl_parent_group_id_cb(pl.group->id);
}

void mpl_test_current_group_id_changed_cb(void)
{
	media_proxy_pl_current_group_id_cb(pl.group->id);
}
#endif /* CONFIG_BT_MPL_OBJECTS */

void mpl_test_playing_order_changed_cb(void)
{
	media_proxy_pl_playing_order_cb(pl.playing_order);
}

void mpl_test_media_state_changed_cb(void)
{
	media_proxy_pl_media_state_cb(pl.playing_order);
}

void mpl_test_opcodes_supported_changed_cb(void)
{
	media_proxy_pl_commands_supported_cb(pl.opcodes_supported);
}

#ifdef CONFIG_BT_MPL_OBJECTS
void mpl_test_search_results_changed_cb(void)
{
	media_proxy_pl_search_cb(pl.search_results_id);
}
#endif /* CONFIG_BT_MPL_OBJECTS */

#endif /* CONFIG_BT_DEBUG_MPL && CONFIG_BT_TESTING */
