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

#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_

/** @brief Media proxy module
 *
 * The media proxy module is the connection point between media players
 * and media controllers.
 *
 * A media player has (access to) media content and knows how to
 * navigate and play this content. A media controller reads or gets
 * information from a player and controls the player by setting player
 * parameters and giving the player commands.
 *
 * The media proxy module allows media player implementations to make
 * themselves available to media controllers. And it allows
 * controllers to access, and get updates from, any player.
 *
 * The media proxy module allows both local and remote control of
 * local player instances: A media controller may be a local
 * application, or it may be a Media Control Service relaying requests
 * from a remote Media Control Client. There may be either local or
 * remote control, or both, or even multiple instances of each.
 *
 * [Experimental] Users should note that the APIs can change
 * as a part of ongoing development.
 */

#include <stdbool.h>
#include <zephyr/types.h>
#include <bluetooth/bluetooth.h>

/* TODO: Remove dependency on mcs.h */
#include "mcs.h"

#ifdef __cplusplus
extern "C" {
#endif


/**
 * @brief Media player command
 */
struct mpl_cmd {
	uint8_t  opcode;
	bool  use_param;
	int32_t param;
};

/**
 * @brief Media command notification
 */
struct mpl_cmd_ntf {
	uint8_t requested_opcode;
	uint8_t result_code;
};

/**
 * @brief Search control item
 */
struct mpl_sci {
	uint8_t len;                     /**< Length of type and parameter */
	uint8_t type;                    /**< MEDIA_PROXY_SEARCH_TYPE_<...> */
	char    param[SEARCH_PARAM_MAX]; /**< Search parameter */
};

/**
 * @brief Search
 */
struct mpl_search {
	uint8_t len;
	char    search[SEARCH_LEN_MAX]; /* Concatenated search control items */
};                                      /* - (type, length, param) */

/**
 * @brief Playback speed parameters
 *
 * All values from -128 to 127 allowed, only some defined
 */
#define MEDIA_PROXY_PLAYBACK_SPEED_MIN     -128
#define MEDIA_PROXY_PLAYBACK_SPEED_QUARTER -128
#define MEDIA_PROXY_PLAYBACK_SPEED_HALF     -64
#define MEDIA_PROXY_PLAYBACK_SPEED_UNITY      0
#define MEDIA_PROXY_PLAYBACK_SPEED_DOUBLE    64
#define MEDIA_PROXY_PLAYBACK_SPEED_MAX      127

/**
 * @brief Seeking speed factors
 *
 * The allowed values for seeking speed are the range -64 to -4
 * (endpoints included), the value 0, and the range 4 to 64
 * (endpoints included).
 */
#define MEDIA_PROXY_SEEKING_SPEED_FACTOR_MAX  64
#define MEDIA_PROXY_SEEKING_SPEED_FACTOR_MIN   4
#define MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO  0

/**
 * @brief Playing orders
 */
#define MEDIA_PROXY_PLAYING_ORDER_SINGLE_ONCE    0x01
#define MEDIA_PROXY_PLAYING_ORDER_SINGLE_REPEAT  0x02
#define MEDIA_PROXY_PLAYING_ORDER_INORDER_ONCE   0x03
#define MEDIA_PROXY_PLAYING_ORDER_INORDER_REPEAT 0x04
#define MEDIA_PROXY_PLAYING_ORDER_OLDEST_ONCE    0x05
#define MEDIA_PROXY_PLAYING_ORDER_OLDEST_REPEAT  0x06
#define MEDIA_PROXY_PLAYING_ORDER_NEWEST_ONCE    0x07
#define MEDIA_PROXY_PLAYING_ORDER_NEWEST_REPEAT  0x08
#define MEDIA_PROXY_PLAYING_ORDER_SHUFFLE_ONCE   0x09
#define MEDIA_PROXY_PLAYING_ORDER_SHUFFLE_REPEAT 0x0a

/**
 * @brief Playing orders supported
 *
 * A bitmap, in the same order as the playing orders above.
 * Note that playing order 1 corresponds to bit 0, and so on.
 */
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SINGLE_ONCE    BIT(0)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SINGLE_REPEAT  BIT(1)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_ONCE   BIT(2)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_REPEAT BIT(3)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_OLDEST_ONCE    BIT(4)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_OLDEST_REPEAT  BIT(5)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_NEWEST_ONCE    BIT(6)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_NEWEST_REPEAT  BIT(7)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SHUFFLE_ONCE   BIT(8)
#define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SHUFFLE_REPEAT BIT(9)

/**
 * @brief Media player states
 */
#define MEDIA_PROXY_STATE_INACTIVE 0x00
#define MEDIA_PROXY_STATE_PLAYING  0x01
#define MEDIA_PROXY_STATE_PAUSED   0x02
#define MEDIA_PROXY_STATE_SEEKING  0x03
#define MEDIA_PROXY_STATE_LAST     0x04

/**
 * @brief Media player command opcodes
 */
#define MEDIA_PROXY_OP_PLAY          0x01
#define MEDIA_PROXY_OP_PAUSE         0x02
#define MEDIA_PROXY_OP_FAST_REWIND   0x03
#define MEDIA_PROXY_OP_FAST_FORWARD  0x04
#define MEDIA_PROXY_OP_STOP          0x05

#define MEDIA_PROXY_OP_MOVE_RELATIVE 0x10

#define MEDIA_PROXY_OP_PREV_SEGMENT  0x20
#define MEDIA_PROXY_OP_NEXT_SEGMENT  0x21
#define MEDIA_PROXY_OP_FIRST_SEGMENT 0x22
#define MEDIA_PROXY_OP_LAST_SEGMENT  0x23
#define MEDIA_PROXY_OP_GOTO_SEGMENT  0x24

#define MEDIA_PROXY_OP_PREV_TRACK    0x30
#define MEDIA_PROXY_OP_NEXT_TRACK    0x31
#define MEDIA_PROXY_OP_FIRST_TRACK   0x32
#define MEDIA_PROXY_OP_LAST_TRACK    0x33
#define MEDIA_PROXY_OP_GOTO_TRACK    0x34

#define MEDIA_PROXY_OP_PREV_GROUP    0x40
#define MEDIA_PROXY_OP_NEXT_GROUP    0x41
#define MEDIA_PROXY_OP_FIRST_GROUP   0x42
#define MEDIA_PROXY_OP_LAST_GROUP    0x43
#define MEDIA_PROXY_OP_GOTO_GROUP    0x44

/**
 * @brief Media player supported opcodes length
 */
#define MEDIA_PROXY_OPCODES_SUPPORTED_LEN 4

/**
 * @brief Media player supported command opcodes
 */
#define MEDIA_PROXY_OP_SUP_PLAY          BIT(0)
#define MEDIA_PROXY_OP_SUP_PAUSE         BIT(1)
#define MEDIA_PROXY_OP_SUP_FAST_REWIND   BIT(2)
#define MEDIA_PROXY_OP_SUP_FAST_FORWARD  BIT(3)
#define MEDIA_PROXY_OP_SUP_STOP          BIT(4)

#define MEDIA_PROXY_OP_SUP_MOVE_RELATIVE BIT(5)

#define MEDIA_PROXY_OP_SUP_PREV_SEGMENT  BIT(6)
#define MEDIA_PROXY_OP_SUP_NEXT_SEGMENT  BIT(7)
#define MEDIA_PROXY_OP_SUP_FIRST_SEGMENT BIT(8)
#define MEDIA_PROXY_OP_SUP_LAST_SEGMENT  BIT(9)
#define MEDIA_PROXY_OP_SUP_GOTO_SEGMENT  BIT(10)

#define MEDIA_PROXY_OP_SUP_PREV_TRACK    BIT(11)
#define MEDIA_PROXY_OP_SUP_NEXT_TRACK    BIT(12)
#define MEDIA_PROXY_OP_SUP_FIRST_TRACK   BIT(13)
#define MEDIA_PROXY_OP_SUP_LAST_TRACK    BIT(14)
#define MEDIA_PROXY_OP_SUP_GOTO_TRACK    BIT(15)

#define MEDIA_PROXY_OP_SUP_PREV_GROUP    BIT(16)
#define MEDIA_PROXY_OP_SUP_NEXT_GROUP    BIT(17)
#define MEDIA_PROXY_OP_SUP_FIRST_GROUP   BIT(18)
#define MEDIA_PROXY_OP_SUP_LAST_GROUP    BIT(19)
#define MEDIA_PROXY_OP_SUP_GOTO_GROUP    BIT(20)

/**
 * @brief Media player command result codes
 */
#define MEDIA_PROXY_CMD_SUCCESS             0x01
#define MEDIA_PROXY_CMD_NOT_SUPPORTED       0x02
#define MEDIA_PROXY_CMD_PLAYER_INACTIVE     0x03
#define MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED 0x04

/**
 * @brief Search operation type values
 */
#define MEDIA_PROXY_SEARCH_TYPE_TRACK_NAME    0x01
#define MEDIA_PROXY_SEARCH_TYPE_ARTIST_NAME   0x02
#define MEDIA_PROXY_SEARCH_TYPE_ALBUM_NAME    0x03
#define MEDIA_PROXY_SEARCH_TYPE_GROUP_NAME    0x04
#define MEDIA_PROXY_SEARCH_TYPE_EARLIEST_YEAR 0x05
#define MEDIA_PROXY_SEARCH_TYPE_LATEST_YEAR   0x06
#define MEDIA_PROXY_SEARCH_TYPE_GENRE         0x07
#define MEDIA_PROXY_SEARCH_TYPE_ONLY_TRACKS   0x08
#define MEDIA_PROXY_SEARCH_TYPE_ONLY_GROUPS   0x09

/**
 * @brief Search operation result codes
 */
#define MEDIA_PROXY_SEARCH_SUCCESS  0x01
#define MEDIA_PROXY_SEARCH_FAILURE  0x02


/**
 * @brief Opaque media player instance
 */
struct media_player;

/* PUBLIC API FOR CONTROLLERS */

/** @brief Callbacks to a controller, from the media proxy
 *
 *  Given by a controller when registering
 */
struct media_proxy_ctrl_cbs {

	/**
	 * @brief Media Player Instance callback
	 *
	 * Called when the local Media Player instance is registered or read (TODO).
	 * Also called if the local player instance is already registered when
	 * the controller is registered.
	 * Provides the controller with the pointer to the local player instance.
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, or errno on negative value.
	 */
	void (*local_player_instance)(struct media_player *player, int err);

	/**
	 * @brief Discover Player Instance callback
	 *
	 * Called when a remote player instance has been discovered.
	 * The instance has been discovered, and will be accessed, using Bluetooth,
	 * via media control client and a remote media control service.
	 *
	 * @param player   Instance pointer to the remote player
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 */
	void (*discover_player)(struct media_player *player, int err);

	/**
	 * @brief Media Player Name receive callback
	 *
	 * Called when the Media Player Name is read or changed
	 * See also media_proxy_ctrl_name_get()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param name     The name of the media player
	 */
	void (*player_name_recv)(struct media_player *player, int err, const char *name);

	/**
	 * @brief Media Player Icon Object ID receive callback
	 *
	 * Called when the Media Player Icon Object ID is read
	 * See also media_proxy_ctrl_get_icon_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the Icon object in the Object Transfer Service (48 bits)
	 */
	void (*icon_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Media Player Icon URL receive callback
	 *
	 * Called when the Media Player Icon URL is read
	 * See also media_proxy_ctrl_get_icon_url()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param url      The URL of the icon
	 */
	void (*icon_url_recv)(struct media_player *player, int err, const char *url);

	/**
	 * @brief Track changed receive callback
	 *
	 * Called when the Current Track is changed
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 */
	void (*track_changed_recv)(struct media_player *player, int err);

	/**
	 * @brief Track Title receive callback
	 *
	 * Called when the Track Title is read or changed
	 * See also media_proxy_ctrl_get_track_title()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param title    The title of the current track
	 */
	void (*track_title_recv)(struct media_player *player, int err, const char *title);

	/**
	 * @brief Track Duration receive callback
	 *
	 * Called when the Track Duration is read or changed
	 * Seel also media_proxy_ctrl_get_track_duration()
	 *
	 * @param player     Media player instance pointer
	 * @param err        Error value. 0 on success, GATT error on positive value
	 *                   or errno on negative value.
	 * @param duration   The duration of the current track
	 */
	void (*track_duration_recv)(struct media_player *player, int err, int32_t duration);

	/**
	 * @brief Track Position receive callback
	 *
	 * Called when the Track Position is read or changed
	 * See also media_proxy_ctrl_get_track_position() and
	 * media_proxy_ctrl_set_track_position()
	 *
	 * @param player     Media player instance pointer
	 * @param err        Error value. 0 on success, GATT error on positive value
	 *                   or errno on negative value.
	 * @param position   The player's position in the track
	 */
	void (*track_position_recv)(struct media_player *player, int err, int32_t position);

	/**
	 * @brief Track Position write callback
	 *
	 * Called when the Track Position is written
	 * See also media_proxy_ctrl_set_track_position().
	 *
	 * @param player     Media player instance pointer
	 * @param err        Error value. 0 on success, GATT error on positive value
	 *                   or errno on negative value.
	 * @param position   The position given attempted to write
	 */
	void (*track_position_write)(struct media_player *player, int err, int32_t position);

	/**
	 * @brief Playback Speed receive callback
	 *
	 * Called when the Playback Speed is read or changed
	 * See also media_proxy_ctrl_get_playback_speed() and
	 * media_proxy_ctrl_set_playback_speed()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param speed    The playback speed parameter
	 */
	void (*playback_speed_recv)(struct media_player *player, int err, int8_t speed);

	/**
	 * @brief Playback Speed write callback
	 *
	 * Called when the Playback Speed is written
	 * See also media_proxy_ctrl_set_playback_speed()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param speed    The playback speed parameter attempted to write
	 */
	void (*playback_speed_write)(struct media_player *player, int err, int8_t speed);

	/**
	 * @brief Seeking Speed receive callback
	 *
	 * Called when the Seeking Speed is read or changed
	 * See also media_proxy_ctrl_get_seeking_speed()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param speed    The seeking speed factor
	 */
	void (*seeking_speed_recv)(struct media_player *player, int err, int8_t speed);

	/**
	 * @brief Track Segments Object ID receive callback
	 *
	 * Called when the Track Segments Object ID is read
	 * See also media_proxy_ctrl_get_track_segments_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the track segments object in Object Transfer Service (48 bits)
	 */
	void (*track_segments_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Current Track Object ID receive callback
	 *
	 * Called when the Current Track Object ID is read or changed
	 * See also media_proxy_ctrl_get_current_track_id() and
	 * media_proxy_ctrl_set_current_track_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the current track object in Object Transfer Service (48 bits)
	 */
	void (*current_track_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Current Track Object ID write callback
	 *
	 * Called when the Current Track Object ID is written
	 * See also media_proxy_ctrl_set_current_track_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID (48 bits) attempted to write
	 */
	void (*current_track_id_write)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Next Track Object ID receive callback
	 *
	 * Called when the Next Track Object ID is read or changed
	 * See also media_proxy_ctrl_get_next_track_id() and
	 * media_proxy_ctrl_set_next_track_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the next track object in Object Transfer Service (48 bits)
	 */
	void (*next_track_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Next Track Object ID write callback
	 *
	 * Called when the Next Track Object ID is written
	 * See also media_proxy_ctrl_set_next_track_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID (48 bits) attempted to write
	 */
	void (*next_track_id_write)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Parent Group Object ID receive callback
	 *
	 * Called when the Parent Group Object ID is read or changed
	 * See also media_proxy_ctrl_get_parent_group_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the parent group object in Object Transfer Service (48 bits)
	 */
	void (*parent_group_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Current Group Object ID receive callback
	 *
	 * Called when the Current Group Object ID is read or changed
	 * See also media_proxy_ctrl_get_current_group_id() and
	 * media_proxy_ctrl_set_current_group_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the current group object in Object Transfer Service (48 bits)
	 */
	void (*current_group_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Current Group Object ID write callback
	 *
	 * Called when the Current Group Object ID is written
	 * See also media_proxy_ctrl_set_current_group_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID (48 bits) attempted to write
	 */
	void (*current_group_id_write)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Playing Order receive callback
	 *
	 * Called when the Playing Order is read or changed
	 * See also media_proxy_ctrl_get_playing_order() and
	 * media_proxy_ctrl_set_playing_order()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param order    The playing order
	 */
	void (*playing_order_recv)(struct media_player *player, int err, uint8_t order);

	/**
	 * @brief Playing Order write callback
	 *
	 * Called when the Playing Order is written
	 * See also media_proxy_ctrl_set_playing_order()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param order    The playing order attempted to write
	 */
	void (*playing_order_write)(struct media_player *player, int err, uint8_t order);

	/**
	 * @brief Playing Orders Supported receive callback
	 *
	 * Called when the Playing Orders Supported is read
	 * See also media_proxy_ctrl_get_playing_orders_supported()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param orders   The playing orders supported
	 */
	void (*playing_orders_supported_recv)(struct media_player *player, int err,
					      uint16_t orders);

	/**
	 * @brief Media State receive callback
	 *
	 * Called when the Media State is read or changed
	 * See also media_proxy_ctrl_get_media_state() and
	 * media_proxy_ctrl_send_command()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param state    The media player state
	 */
	void (*media_state_recv)(struct media_player *player, int err, uint8_t state);

	/**
	 * @brief Command send callback
	 *
	 * Called when a command has been sent
	 * See also media_proxy_ctrl_send_command()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param cmd      The command sent
	 */
	void (*command_send)(struct media_player *player, int err, struct mpl_cmd cmd);

	/**
	 * @brief Command result receive callback
	 *
	 * Called when a command result has been received
	 * See also media_proxy_ctrl_send_command()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param result   The result received
	 */
	void (*command_recv)(struct media_player *player, int err, struct mpl_cmd_ntf result);

	/**
	 * @brief Commands supported receive callback
	 *
	 * Called when the Commands Supported is read or changed
	 * See also media_proxy_ctrl_get_commands_supported()
	 *
	 * @param player       Media player instance pointer
	 * @param err          Error value. 0 on success, GATT error on positive value
	 *                     or errno on negative value.
	 * @param opcodes      The supported command opcodes (bitmap)
	 */
	void (*commands_supported_recv)(struct media_player *player, int err, uint32_t opcodes);

	/**
	 * @brief Search send callback
	 *
	 * Called when a search has been sent
	 * See also media_proxy_ctrl_send_search()
	 *
	 * @param player        Media player instance pointer
	 * @param err           Error value. 0 on success, GATT error on positive value
	 *                      or errno on negative value.
	 * @param search        The search sent
	 */
	void (*search_send)(struct media_player *player, int err, struct mpl_search search);

	/**
	 * @brief Search result code receive callback
	 *
	 * Called when a search result code has been received
	 * See also media_proxy_ctrl_send_search()
	 *
	 * The search result code tells whether the search was successful or not.
	 * For a successful search, the actual results of the search (i.e. what was found
	 * as a result of the search)can be accessed using the Search Results Object ID.
	 * The Search Results Object ID has a separate callback - search_results_id_recv().
	 *
	 * @param player        Media player instance pointer
	 * @param err           Error value. 0 on success, GATT error on positive value
	 *                      or errno on negative value.
	 * @param result_code   Search result code
	 */
	void (*search_recv)(struct media_player *player, int err, uint8_t result_code);

	/**
	 * @brief Search Results Object ID receive callback
	 * See also media_proxy_ctrl_get_search_results_id()
	 *
	 * Called when the Search Results Object ID is read or changed
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param id       The ID of the search results object in Object Transfer Service (48 bits)
	 */
	void (*search_results_id_recv)(struct media_player *player, int err, uint64_t id);

	/**
	 * @brief Content Control ID receive callback
	 *
	 * Called when the Content Control ID is read
	 * See also media_proxy_ctrl_get_content_ctrl_id()
	 *
	 * @param player   Media player instance pointer
	 * @param err      Error value. 0 on success, GATT error on positive value
	 *                 or errno on negative value.
	 * @param ccid     The content control ID
	 */
	void (*content_ctrl_id_recv)(struct media_player *player, int err, uint8_t ccid);
};

/**
 * @brief Register a controller with the media_proxy
 *
 * @param ctrl_cbs   Callbacks to the controller
 *
 * @return 0 if success, errno on failure
 */
int media_proxy_ctrl_register(struct media_proxy_ctrl_cbs *ctrl_cbs);

/**
 * @brief Discover a remote media player
 *
 * Discover a remote media player instance.
 * The remote player instance will be discovered, and accessed, using Bluetooth,
 * via the media control client and a remote media control service.
 * This call will start a GATT discovery of the Media Control Service on the peer,
 * and setup handles and subscriptions.
 *
 * This shall be called once before any other actions can be executed for the
 * remote player. The remote player instance will be returned in the
 * discover_player() callback.
 *
 * @param conn   The connection to do discovery for
 *
 * @return 0 if success, errno on failure
 */
int media_proxy_ctrl_discover_player(struct bt_conn *conn);

/**
 * @brief Read Media Player Name
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_player_name(struct media_player *player);

/**
 * @brief Read Icon Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Icon
 * Object from an Object Transfer Service
 *
 * See the Media Control Service spec v1.0 sections 3.2 and
 * 4.1 for a description of the Icon Object.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_icon_id(struct media_player *player);

/**
 * @brief Read Icon URL
 *
 * Get a URL to the media player's icon.
 *
 * @param player   Media player instance pointer
 */
int media_proxy_ctrl_get_icon_url(struct media_player *player);

/**
 * @brief Read Track Title
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_track_title(struct media_player *player);

/**
 * @brief Read Track Duration
 *
 * The duration of a track is measured in hundredths of a
 * second.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_track_duration(struct media_player *player);

/**
 * @brief Read Track Position
 *
 * The position of the player (the playing position) is
 * measured in hundredths of a second from the beginning of
 * the track
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_track_position(struct media_player *player);

/**
 * @brief Set Track Position
 *
 * Set the playing position of the media player in the current
 * track. The position is given in in hundredths of a second,
 * from the beginning of the track of the track for positive
 * values, and (backwards) from the end of the track for
 * negative values.
 *
 * @param player     Media player instance pointer
 * @param position   The track position to set
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_track_position(struct media_player *player, int32_t position);

/**
 * @brief Get Playback Speed
 *
 * The playback speed parameter is related to the actual
 * playback speed as follows:
 * actual playback speed = 2^(speed_parameter/64)
 *
 * A speed parameter of 0 corresponds to unity speed playback
 * (i.e. playback at "normal" speed). A speed parameter of
 * -128 corresponds to playback at one fourth of normal speed,
 * 127 corresponds to playback at almost four times the normal
 * speed.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_playback_speed(struct media_player *player);

/**
 * @brief Set Playback Speed
 *
 * See the get_playback_speed() function for an explanation of
 * the playback speed parameter.
 *
 * Note that the media player may not support all possible
 * values of the playback speed parameter. If the value given
 * is not supported, and is higher than the current value, the
 * player should set the playback speed to the next higher
 * supported value. (And correspondingly to the next lower
 * supported value for given values lower than the current
 * value.)
 *
 * @param player   Media player instance pointer
 * @param speed    The playback speed parameter to set
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_playback_speed(struct media_player *player, int8_t speed);

/**
 * @brief Get Seeking Speed
 *
 * The seeking speed gives the speed with which the player is
 * seeking. It is a factor, relative to real-time playback
 * speed - a factor four means seeking happens at four times
 * the real-time playback speed. Positive values are for
 * forward seeking, negative values for backwards seeking.
 *
 * The seeking speed is not setable - a non-zero seeking speed
 * is the result of "fast rewind" of "fast forward" commands.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_seeking_speed(struct media_player *player);

/**
 * @brief Read Current Track Segments Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Current
 * Track Segments Object from an Object Transfer Service
 *
 * See the Media Control Service spec v1.0 sections 3.10 and
 * 4.2 for a description of the Track Segments Object.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_track_segments_id(struct media_player *player);

/**
 * @brief Read Current Track Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Current
 * Track Object from an Object Transfer Service
 *
 * See the Media Control Service spec v1.0 sections 3.11 and
 * 4.3 for a description of the Current Track Object.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_current_track_id(struct media_player *player);

/**
 * @brief Set Current Track Object ID
 *
 * Change the player's current track to the track given by the ID.
 * (Behaves similarly to the goto track command.)
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 * @param id       The ID of a track object
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_current_track_id(struct media_player *player, uint64_t id);

/**
 * @brief Read Next Track Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Next
 * Track Object from an Object Transfer Service
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_next_track_id(struct media_player *player);

/**
 * @brief Set Next Track Object ID
 *
 * Change the player's next track to the track given by the ID.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 * @param id       The ID of a track object
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_next_track_id(struct media_player *player, uint64_t id);

/**
 * @brief Read Parent Group Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Parent
 * Track Object from an Object Transfer Service
 *
 * The parent group is the parent of the current group.
 *
 * See the Media Control Service spec v1.0 sections 3.14 and
 * 4.4 for a description of the Current Track Object.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_parent_group_id(struct media_player *player);

/**
 * @brief Read Current Group Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Current
 * Track Object from an Object Transfer Service
 *
 * See the Media Control Service spec v1.0 sections 3.14 and
 * 4.4 for a description of the Current Group Object.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_current_group_id(struct media_player *player);

/**
 * @brief Set Current Group Object ID
 *
 * Change the player's current group to the group given by the
 * ID, and the current track to the first track in that group.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 * @param id       The ID of a group object
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_current_group_id(struct media_player *player, uint64_t id);

/**
 * @brief Read Playing Order
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_playing_order(struct media_player *player);

/**
 * @brief Set Playing Order
 *
 * Set the media player's playing order
 *
 * @param player   Media player instance pointer
 * @param order    The playing order to set
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_set_playing_order(struct media_player *player, uint8_t order);

/**
 * @brief Read Playing Orders Supported
 *
 * Read a bitmap containing the media player's supported
 * playing orders.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_playing_orders_supported(struct media_player *player);

/**
 * @brief Read Media State
 *
 * Read the media player's state
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_media_state(struct media_player *player);

/**
 * @brief Send Command
 *
 * Send a command to the media player.
 * Commands may cause the media player to change its state
 * May result in two callbacks - one for the actual sending of the command to the
 * player, one for the result of the command from the player.
 *
 * @param player      Media player instance pointer
 * @param command     The command to send
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_send_command(struct media_player *player, struct mpl_cmd command);

/**
 * @brief Read Commands Supported
 *
 * Read a bitmap containing the media player's supported
 * command opcodes.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_commands_supported(struct media_player *player);

/**
 * @brief Set Search
 *
 * Write a search to the media player.
 * If the search is successful, the search results will be available as a group object
 * in the Object Transfer Service (OTS).
 *
 * May result in up to three callbacks
 * - one for the actual sending of the search to the player
 * - one for the result code for the search from the player
 * - if the search is successful, one for the the search results object ID in the OTs
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 * @param search   The search to write
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_send_search(struct media_player *player, struct mpl_search search);

/**
 * @brief Read Search Results Object ID
 *
 * Get an ID (48 bit) that can be used to retrieve the Search
 * Results Object from an Object Transfer Service
 *
 * The search results object is a group object.
 * The search results object only exists if a successful
 * search operation has been done.
 *
 * Requires Object Transfer Service
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
int media_proxy_ctrl_get_search_results_id(struct media_player *player);

/**
 * @brief Read Content Control ID
 *
 * The content control ID identifies a content control service
 * on a device, and links it to the corresponding audio
 * stream.
 *
 * @param player   Media player instance pointer
 *
 * @return 0 if success, errno on failure.
 */
uint8_t media_proxy_ctrl_get_content_ctrl_id(struct media_player *player);


/* PUBLIC API FOR PLAYERS */

/** @brief Availalable calls in a player, that the media proxy can call
 *
 * Given by a player when registering.
 */
struct media_proxy_pl_calls {

	/**
	 * @brief Read Media Player Name
	 *
	 * @return The name of the media player
	 */
	const char *(*get_player_name)(void);

	/**
	 * @brief Read Icon Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Icon
	 * Object from an Object Transfer Service
	 *
	 * See the Media Control Service spec v1.0 sections 3.2 and
	 * 4.1 for a description of the Icon Object.
	 *
	 * @return The Icon Object ID
	 */
	uint64_t (*get_icon_id)(void);

	/**
	 * @brief Read Icon URL
	 *
	 * Get a URL to the media player's icon.
	 *
	 * @return The URL of the Icon
	 */
	const char *(*get_icon_url)(void);

	/**
	 * @brief Read Track Title
	 *
	 * @return The title of the current track
	 */
	const char *(*get_track_title)(void);

	/**
	 * @brief Read Track Duration
	 *
	 * The duration of a track is measured in hundredths of a
	 * second.
	 *
	 * @return The duration of the current track
	 */
	int32_t (*get_track_duration)(void);

	/**
	 * @brief Read Track Position
	 *
	 * The position of the player (the playing position) is
	 * measured in hundredths of a second from the beginning of
	 * the track
	 *
	 * @return The position of the player in the current track
	 */
	int32_t (*get_track_position)(void);

	/**
	 * @brief Set Track Position
	 *
	 * Set the playing position of the media player in the current
	 * track. The position is given in in hundredths of a second,
	 * from the beginning of the track of the track for positive
	 * values, and (backwards) from the end of the track for
	 * negative values.
	 *
	 * @param position    The player position to set
	 */
	void (*set_track_position)(int32_t position);

	/**
	 * @brief Get Playback Speed
	 *
	 * The playback speed parameter is related to the actual
	 * playback speed as follows:
	 * actual playback speed = 2^(speed_parameter/64)
	 *
	 * A speed parameter of 0 corresponds to unity speed playback
	 * (i.e. playback at "normal" speed). A speed parameter of
	 * -128 corresponds to playback at one fourth of normal speed,
	 * 127 corresponds to playback at almost four times the normal
	 * speed.
	 *
	 * @return The playback speed parameter
	 */
	int8_t (*get_playback_speed)(void);

	/**
	 * @brief Set Playback Speed
	 *
	 * See the get_playback_speed() function for an explanation of
	 * the playback speed parameter.
	 *
	 * Note that the media player may not support all possible
	 * values of the playback speed parameter. If the value given
	 * is not supported, and is higher than the current value, the
	 * player should set the playback speed to the next higher
	 * supported value. (And correspondingly to the next lower
	 * supported value for given values lower than the current
	 * value.)
	 *
	 * @param speed The playback speed parameter to set
	 */
	void (*set_playback_speed)(int8_t speed);

	/**
	 * @brief Get Seeking Speed
	 *
	 * The seeking speed gives the speed with which the player is
	 * seeking. It is a factor, relative to real-time playback
	 * speed - a factor four means seeking happens at four times
	 * the real-time playback speed. Positive values are for
	 * forward seeking, negative values for backwards seeking.
	 *
	 * The seeking speed is not setable - a non-zero seeking speed
	 * is the result of "fast rewind" of "fast forward" commands.
	 *
	 * @return The seeking speed factor
	 */
	int8_t (*get_seeking_speed)(void);

	/**
	 * @brief Read Current Track Segments Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Current
	 * Track Segments Object from an Object Transfer Service
	 *
	 * See the Media Control Service spec v1.0 sections 3.10 and
	 * 4.2 for a description of the Track Segments Object.
	 *
	 * @return Current The Track Segments Object ID
	 */
	uint64_t (*get_track_segments_id)(void);

	/**
	 * @brief Read Current Track Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Current
	 * Track Object from an Object Transfer Service
	 *
	 * See the Media Control Service spec v1.0 sections 3.11 and
	 * 4.3 for a description of the Current Track Object.
	 *
	 * @return The Current Track Object ID
	 */
	uint64_t (*get_current_track_id)(void);

	/**
	 * @brief Set Current Track Object ID
	 *
	 * Change the player's current track to the track given by the ID.
	 * (Behaves similarly to the goto track command.)
	 *
	 * @param id    The ID of a track object
	 */
	void (*set_current_track_id)(uint64_t id);

	/**
	 * @brief Read Next Track Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Next
	 * Track Object from an Object Transfer Service
	 *
	 * @return The Next Track Object ID
	 */
	uint64_t (*get_next_track_id)(void);

	/**
	 * @brief Set Next Track Object ID
	 *
	 * Change the player's next track to the track given by the ID.
	 *
	 * @param id    The ID of a track object
	 */
	void (*set_next_track_id)(uint64_t id);

	/**
	 * @brief Read Parent Group Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Parent
	 * Track Object from an Object Transfer Service
	 *
	 * The parent group is the parent of the current group.
	 *
	 * See the Media Control Service spec v1.0 sections 3.14 and
	 * 4.4 for a description of the Current Track Object.
	 *
	 * @return The Current Group Object ID
	 */
	uint64_t (*get_parent_group_id)(void);

	/**
	 * @brief Read Current Group Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Current
	 * Track Object from an Object Transfer Service
	 *
	 * See the Media Control Service spec v1.0 sections 3.14 and
	 * 4.4 for a description of the Current Group Object.
	 *
	 * @return The Current Group Object ID
	 */
	uint64_t (*get_current_group_id)(void);

	/**
	 * @brief Set Current Group Object ID
	 *
	 * Change the player's current group to the group given by the
	 * ID, and the current track to the first track in that group.
	 *
	 * @param id    The ID of a group object
	 */
	void (*set_current_group_id)(uint64_t id);

	/**
	 * @brief Read Playing Order
	 *
	 * return The media player's current playing order
	 */
	uint8_t (*get_playing_order)(void);

	/**
	 * @brief Set Playing Order
	 *
	 * Set the media player's playing order
	 * See the Media Control Service spec, or the
	 * BT_MCS_PLAYING_ORDER_* defines in the mcs.h file.
	 *
	 * @param order	The playing order to set
	 */
	void (*set_playing_order)(uint8_t order);

	/**
	 * @brief Read Playing Orders Supported
	 *
	 * Read a bitmap containing the media player's supported
	 * playing orders.
	 * See the Media Control Service spec, or the
	 * BT_MCS_PLAYING_ORDERS_SUPPORTED_* defines in the mcs.h
	 * file.
	 *
	 * @return The media player's supported playing orders
	 */
	uint16_t (*get_playing_orders_supported)(void);

	/**
	 * @brief Read Media State
	 *
	 * Read the media player's state
	 * See the Media Control Service spec, or the
	 * BT_MCS_MEDIA_STATE_* defines in the mcs.h file.
	 *
	 * @return The media player's state
	 */
	uint8_t (*get_media_state)(void);

	/**
	 * @brief Send Command
	 *
	 * Send a command to the media player.
	 * For command opcodes (play, pause, ... - see the Media Control
	 * Service spec, or the BT_MCS_OPC_* defines in the mcs.h
	 * file.
	 *
	 * @param command	The command to send
	 */
	void (*send_command)(struct mpl_cmd command);

	/**
	 * @brief Read Commands Supported
	 *
	 * Read a bitmap containing the media player's supported
	 * command opcodes..
	 * See the Media Control Service spec, or the
	 * BT_MCS_OPC_SUP_* defines in the mcs.h file.
	 *
	 * @return The media player's supported command opcodes
	 */
	uint32_t (*get_commands_supported)(void);

	/**
	 * @brief Set Search
	 *
	 * Write a search to the media player.
	 * (For the formatting of a search, see the Media Control
	 * Service spec and the mcs.h file.)
	 *
	 * @param search	The search to write
	 */
	void (*send_search)(struct mpl_search search);

	/**
	 * @brief Read Search Results Object ID
	 *
	 * Get an ID (48 bit) that can be used to retrieve the Search
	 * Results Object from an Object Transfer Service
	 *
	 * The search results object is a group object.
	 * The search results object only exists if a successful
	 * search operation has been done.
	 *
	 * @return The Search Results Object ID
	 */
	uint64_t (*get_search_results_id)(void);

	/**
	 * @brief Read Content Control ID
	 *
	 * The content control ID identifies a content control service
	 * on a device, and links it to the corresponding audio
	 * stream.
	 *
	 * @return The content control ID for the media player
	 */
	uint8_t (*get_content_ctrl_id)(void);
};

/**
 * @brief Register a player with the media proxy
 *
 * Register a player with the media proxy module, for use by media
 * controllers.
 *
 * The media proxy may call any non-NULL function pointers in the
 * supplied media_proxy_pl_calls structure.
 *
 * @param pl_calls	Function pointers to the media player's calls
 *
 * @return 0 if success, errno on failure
 */
int media_proxy_pl_register(struct media_proxy_pl_calls *pl_calls);

/* Initialize player - TODO: Move to player header file */
int media_proxy_pl_init(void);

/* TODO: Find best location for this call, and move this one also */
struct bt_ots *bt_mcs_get_ots(void);

/* Callbacks from the player to the media proxy */

/**
 * @brief Track changed callback
 *
 * To be called when the player's current track is changed
 */
void media_proxy_pl_track_changed_cb(void);

/**
 * @brief Track title callback
 *
 * To be called when the player's current track is changed
 *
 * @param title	The title of the track
 */
void media_proxy_pl_track_title_cb(char *title);

/**
 * @brief Track duration callback
 *
 * To be called when the current track's duration is changed (e.g. due
 * to a track change)
 *
 * The track duration is given in hundredths of a second.
 *
 * @param duration	The track duration
 */
void media_proxy_pl_track_duration_cb(int32_t duration);

/**
 * @brief Track position callback
 *
 * To be called when the media player's position in the track is
 * changed, or when the player is paused or similar.
 *
 * Exception: This callback should not be called when the position
 * changes during regular playback, i.e. while the player is playing
 * and playback happens at a constant speed.
 *
 * The track position is given in hundredths of a second from the
 * start of the track.
 *
 *  @param position	The media player's position in the track
 */
void media_proxy_pl_track_position_cb(int32_t position);

/**
 * @brief Playback speed callback
 *
 * To be called when the playback speed is changed.
 *
 * @param speed	The playback speed parameter
 */
void media_proxy_pl_playback_speed_cb(int8_t speed);

/**
 * @brief Seeking speed callback
 *
 * To be called when the seeking speed is changed.
 *
 * @param speed	The seeking speed factor
 */
void media_proxy_pl_seeking_speed_cb(int8_t speed);

/**
 * @brief Current track object ID callback
 *
 * To be called when the ID of the current track is changed (e.g. due
 * to a track change).
 *
 * @param id The ID of the current track object in the OTS
 */
void media_proxy_pl_current_track_id_cb(uint64_t id);

/**
 * @brief Next track object ID callback
 *
 * To be called when the ID of the current track is changes
 *
 * @param id The ID of the next track object in the OTS
 */
void media_proxy_pl_next_track_id_cb(uint64_t id);

/**
 * @brief Parent group object ID callback
 *
 * To be called when the ID of the parent group is changed
 *
 * @param id The ID of the parent group object in the OTS
 */
void media_proxy_pl_parent_group_id_cb(uint64_t id);

/**
 * @brief Current group object ID callback
 *
 * To be called when the ID of the current group is changed
 *
 * @param id The ID of the current group object in the OTS
 */
void media_proxy_pl_current_group_id_cb(uint64_t id);

/**
 * @brief Playing order callback
 *
 * To be called when the playing order is changed
 *
 * @param order	The playing order
 */
void media_proxy_pl_playing_order_cb(uint8_t order);

/**
 * @brief Media state callback
 *
 * To be called when the media state is changed
 *
 * @param state	The media player's state
 */
void media_proxy_pl_media_state_cb(uint8_t state);

/**
 * @brief Command callback
 *
 * To be called when a command has been sent, to notify whether the
 * command was successfully performed or not.
 * See the Media Control Service spec, or the BT_MCS_OPC_NTF_*
 * defines in the mcs.h file.
 *
 * @param cmd_ntf	The result of the command
 */
void media_proxy_pl_command_cb(struct mpl_cmd_ntf cmd_ntf);

/**
 * @brief Commands supported callback
 *
 * To be called when the set of commands supported is changed
 *
 * @param opcodes   The supported commands opcodes
 */
void media_proxy_pl_commands_supported_cb(uint32_t opcodes);

/**
 * @brief Search callback
 *
 * To be called when a search has been set to notify whether the
 * search was successfully performed or not.
 * See the Media Control Service spec, or the BT_MCS_SCP_NTF_*
 * defines in the mcs.h file.
 *
 * The actual results of the search, if successful, can be found in
 * the search results object.
 *
 * @param result_code	The result (success or failure) of the search
 */
void media_proxy_pl_search_cb(uint8_t result_code);

/**
 * @brief Search Results object ID callback
 *
 * To be called when the ID of the search results is changed
 * (typically as the result of a new successful search).
 *
 * @param id    The ID of the search results object in the OTS
 */
void media_proxy_pl_search_results_id_cb(uint64_t id);

#ifdef __cplusplus
}
#endif

#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_ */
