blob: 8179c00988942ef5720bd54bbef07b936437dc32 [file]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2020 Intel Corporation. All rights reserved.
*
*/
#include <stdbool.h>
#include <inttypes.h>
struct bt_mcp;
struct bt_mcs;
/*
* Media Control Client
*/
struct bt_mcp_callback {
/* New player seen */
void (*ccid)(void *data, uint8_t ccid, bool gmcs);
/* Client command complete */
void (*complete)(void *data, unsigned int id, uint8_t status);
/* Attach complete */
void (*ready)(void *data);
/* Debug message */
void (*debug)(void *data, const char *str);
/* mcp destroyed (no further callbacks) */
void (*destroy)(void *data);
};
struct bt_mcp_listener_callback {
/* Value notification */
void (*media_player_name)(void *data, const uint8_t *value,
uint16_t length);
void (*track_changed)(void *data);
void (*track_title)(void *data, const uint8_t *value, uint16_t length);
void (*track_duration)(void *data, int32_t duration_centisecond);
void (*track_position)(void *data, int32_t position_centisecond);
void (*playback_speed)(void *data, int8_t log2_speed);
void (*seeking_speed)(void *data, int8_t log2_speed);
void (*playing_order)(void *data, uint8_t order);
void (*media_state)(void *data, uint8_t state);
/* TODO: OTS */
/* Listener destroyed (no further callbacks) */
void (*destroy)(void *data);
};
unsigned int bt_mcp_play(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_pause(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_fast_rewind(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_fast_forward(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_stop(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_move_relative(struct bt_mcp *mcp, uint8_t ccid,
int32_t offset);
unsigned int bt_mcp_previous_segment(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_next_segment(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_first_segment(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_last_segment(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_goto_segment(struct bt_mcp *mcp, uint8_t ccid, int32_t n);
unsigned int bt_mcp_previous_track(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_next_track(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_first_track(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_last_track(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_goto_track(struct bt_mcp *mcp, uint8_t ccid, int32_t n);
unsigned int bt_mcp_previous_group(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_next_group(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_first_group(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_last_group(struct bt_mcp *mcp, uint8_t ccid);
unsigned int bt_mcp_goto_group(struct bt_mcp *mcp, uint8_t ccid, int32_t n);
unsigned int bt_mcp_set_track_position(struct bt_mcp *mcp, uint8_t ccid,
int32_t position);
unsigned int bt_mcp_set_playback_speed(struct bt_mcp *mcp, uint8_t ccid,
int8_t speed);
unsigned int bt_mcp_set_playing_order(struct bt_mcp *mcp, uint8_t ccid,
uint8_t order);
uint16_t bt_mcp_get_supported_playing_order(struct bt_mcp *mcp, uint8_t ccid);
uint32_t bt_mcp_get_supported_commands(struct bt_mcp *mcp, uint8_t ccid);
bool bt_mcp_add_listener(struct bt_mcp *mcp, uint8_t ccid,
const struct bt_mcp_listener_callback *cb,
void *user_data);
struct bt_mcp *bt_mcp_attach(struct bt_gatt_client *client, bool gmcs,
const struct bt_mcp_callback *cb,
void *user_data);
void bt_mcp_detach(struct bt_mcp *mcp);
/*
* Media Control Server
*/
struct bt_mcs_callback {
/* Value requests */
void (*media_player_name)(void *data, struct iovec *buf, size_t size);
void (*track_title)(void *data, struct iovec *buf, size_t size);
int32_t (*track_duration)(void *data);
int32_t (*track_position)(void *data);
int8_t (*playback_speed)(void *data);
int8_t (*seeking_speed)(void *data);
uint8_t (*playing_order)(void *data);
uint16_t (*playing_order_supported)(void *data);
uint32_t (*media_cp_op_supported)(void *data);
/* TODO: OTS */
/* Set value notification */
bool (*set_track_position)(void *data, int32_t value);
bool (*set_playback_speed)(void *data, int8_t value);
bool (*set_playing_order)(void *data, uint8_t value);
/* Command notification */
bool (*play)(void *data);
bool (*pause)(void *data);
bool (*fast_rewind)(void *data);
bool (*fast_forward)(void *data);
bool (*stop)(void *data);
bool (*move_relative)(void *data, int32_t offset);
bool (*previous_segment)(void *data);
bool (*next_segment)(void *data);
bool (*first_segment)(void *data);
bool (*last_segment)(void *data);
bool (*goto_segment)(void *data, int32_t n);
bool (*previous_track)(void *data);
bool (*next_track)(void *data);
bool (*first_track)(void *data);
bool (*last_track)(void *data);
bool (*goto_track)(void *data, int32_t n);
bool (*previous_group)(void *data);
bool (*next_group)(void *data);
bool (*first_group)(void *data);
bool (*last_group)(void *data);
bool (*goto_group)(void *data, int32_t n);
/* Debug message */
void (*debug)(void *data, const char *str);
/* Player destroyed (no further callbacks) */
void (*destroy)(void *data);
};
void bt_mcs_set_media_state(struct bt_mcs *mcs, uint8_t state);
uint8_t bt_mcs_get_media_state(struct bt_mcs *mcs);
void bt_mcs_changed(struct bt_mcs *mcs, uint16_t chrc_uuid);
uint8_t bt_mcs_get_ccid(struct bt_mcs *mcs);
struct bt_mcs *bt_mcs_register(struct gatt_db *db, bool is_gmcs,
const struct bt_mcs_callback *cb, void *user_data);
void bt_mcs_unregister(struct bt_mcs *mcs);
void bt_mcs_unregister_all(struct gatt_db *db);
/* For tests: */
void bt_mcs_test_util_reset_ccid(void);
struct bt_gatt_client *bt_mcp_test_util_get_client(struct bt_mcp *mcp);