spa: bluez: dbus: follow BlueZ's MediaPlayer1 objects

Follow MediaPlayer1 objects in spa_bt_player objects
and collect the players of a device in a list in the device.

Add three new events to spa_bt_device: player_{added,changed,removed}.

See https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/media-api.txt
This commit is contained in:
Barnabás Pőcze 2021-06-25 17:52:55 +02:00
parent e082e64c87
commit 902a2113de
2 changed files with 337 additions and 1 deletions

View file

@ -50,6 +50,7 @@ extern "C" {
#define BLUEZ_MEDIA_INTERFACE BLUEZ_SERVICE ".Media1"
#define BLUEZ_MEDIA_ENDPOINT_INTERFACE BLUEZ_SERVICE ".MediaEndpoint1"
#define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1"
#define BLUEZ_MEDIA_PLAYER_INTERFACE BLUEZ_SERVICE ".MediaPlayer1"
#define BLUEZ_INTERFACE_BATTERY_PROVIDER BLUEZ_SERVICE ".BatteryProvider1"
#define BLUEZ_INTERFACE_BATTERY_PROVIDER_MANAGER BLUEZ_SERVICE ".BatteryProviderManager1"
@ -390,6 +391,7 @@ static inline enum spa_bt_form_factor spa_bt_form_factor_from_class(uint32_t blu
struct spa_bt_a2dp_codec_switch;
struct spa_bt_transport;
struct spa_bt_player;
struct spa_bt_device_events {
#define SPA_VERSION_BT_DEVICE_EVENTS 0
@ -406,6 +408,12 @@ struct spa_bt_device_events {
/** Device freed */
void (*destroy) (void *data);
void (*player_added) (void *data, struct spa_bt_player *player);
void (*player_changed) (void *data, struct spa_bt_player *player);
void (*player_removed) (void *data, struct spa_bt_player *player);
};
struct spa_bt_device {
@ -439,6 +447,7 @@ struct spa_bt_device {
struct spa_list remote_endpoint_list;
struct spa_list transport_list;
struct spa_list codec_switch_list;
struct spa_list player_list;
uint8_t battery;
int has_battery;
@ -623,6 +632,48 @@ static inline enum spa_bt_transport_state spa_bt_transport_state_from_string(con
return SPA_BT_TRANSPORT_STATE_IDLE;
}
enum spa_bt_player_state {
SPA_BT_PLAYER_STATE_UNKNOWN,
SPA_BT_PLAYER_STATE_PLAYING,
SPA_BT_PLAYER_STATE_STOPPED,
SPA_BT_PLAYER_STATE_PAUSED,
SPA_BT_PLAYER_STATE_FORWARD_SEEK,
SPA_BT_PLAYER_STATE_ERROR,
};
enum spa_bt_player_type {
SPA_BT_PLAYER_TYPE_UNKNOWN,
SPA_BT_PLAYER_TYPE_AUDIO,
SPA_BT_PLAYER_TYPE_VIDEO,
SPA_BT_PLAYER_TYPE_AUDIO_BROADCASTING,
SPA_BT_PLAYER_TYPE_VIDEO_BROADCASTING,
};
struct spa_bt_player {
struct spa_list link;
struct spa_bt_monitor *monitor;
struct spa_bt_device *device;
struct spa_list device_link;
char *name;
char *path;
struct {
uint32_t number;
uint64_t duration;
char *title;
char *artist;
char *album;
char *genre;
} track;
enum spa_bt_player_state status;
enum spa_bt_player_type type;
};
#define DEFAULT_AG_VOLUME 1.0f
#define DEFAULT_RX_VOLUME 1.0f
#define DEFAULT_TX_VOLUME 0.064f /* pa_sw_volume_to_linear(0.4 * PA_VOLUME_NORM) */