mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 16:38:16 +01:00
Add supported formats to media player (#7318)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
e10f8128c8
commit
5a707b558d
7 changed files with 165 additions and 0 deletions
|
@ -1107,6 +1107,19 @@ enum MediaPlayerCommand {
|
||||||
MEDIA_PLAYER_COMMAND_MUTE = 3;
|
MEDIA_PLAYER_COMMAND_MUTE = 3;
|
||||||
MEDIA_PLAYER_COMMAND_UNMUTE = 4;
|
MEDIA_PLAYER_COMMAND_UNMUTE = 4;
|
||||||
}
|
}
|
||||||
|
enum MediaPlayerFormatPurpose {
|
||||||
|
MEDIA_PLAYER_FORMAT_PURPOSE_DEFAULT = 0;
|
||||||
|
MEDIA_PLAYER_FORMAT_PURPOSE_ANNOUNCEMENT = 1;
|
||||||
|
}
|
||||||
|
message MediaPlayerSupportedFormat {
|
||||||
|
option (id) = 119;
|
||||||
|
option (ifdef) = "USE_MEDIA_PLAYER";
|
||||||
|
|
||||||
|
string format = 1;
|
||||||
|
uint32 sample_rate = 2;
|
||||||
|
uint32 num_channels = 3;
|
||||||
|
MediaPlayerFormatPurpose purpose = 4;
|
||||||
|
}
|
||||||
message ListEntitiesMediaPlayerResponse {
|
message ListEntitiesMediaPlayerResponse {
|
||||||
option (id) = 63;
|
option (id) = 63;
|
||||||
option (source) = SOURCE_SERVER;
|
option (source) = SOURCE_SERVER;
|
||||||
|
@ -1122,6 +1135,8 @@ message ListEntitiesMediaPlayerResponse {
|
||||||
EntityCategory entity_category = 7;
|
EntityCategory entity_category = 7;
|
||||||
|
|
||||||
bool supports_pause = 8;
|
bool supports_pause = 8;
|
||||||
|
|
||||||
|
repeated MediaPlayerSupportedFormat supported_formats = 9;
|
||||||
}
|
}
|
||||||
message MediaPlayerStateResponse {
|
message MediaPlayerStateResponse {
|
||||||
option (id) = 64;
|
option (id) = 64;
|
||||||
|
|
|
@ -1026,6 +1026,15 @@ bool APIConnection::send_media_player_info(media_player::MediaPlayer *media_play
|
||||||
auto traits = media_player->get_traits();
|
auto traits = media_player->get_traits();
|
||||||
msg.supports_pause = traits.get_supports_pause();
|
msg.supports_pause = traits.get_supports_pause();
|
||||||
|
|
||||||
|
for (auto &supported_format : traits.get_supported_formats()) {
|
||||||
|
MediaPlayerSupportedFormat media_format;
|
||||||
|
media_format.format = supported_format.format;
|
||||||
|
media_format.sample_rate = supported_format.sample_rate;
|
||||||
|
media_format.num_channels = supported_format.num_channels;
|
||||||
|
media_format.purpose = static_cast<enums::MediaPlayerFormatPurpose>(supported_format.purpose);
|
||||||
|
msg.supported_formats.push_back(media_format);
|
||||||
|
}
|
||||||
|
|
||||||
return this->send_list_entities_media_player_response(msg);
|
return this->send_list_entities_media_player_response(msg);
|
||||||
}
|
}
|
||||||
void APIConnection::media_player_command(const MediaPlayerCommandRequest &msg) {
|
void APIConnection::media_player_command(const MediaPlayerCommandRequest &msg) {
|
||||||
|
|
|
@ -387,6 +387,18 @@ template<> const char *proto_enum_to_string<enums::MediaPlayerCommand>(enums::Me
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
|
template<> const char *proto_enum_to_string<enums::MediaPlayerFormatPurpose>(enums::MediaPlayerFormatPurpose value) {
|
||||||
|
switch (value) {
|
||||||
|
case enums::MEDIA_PLAYER_FORMAT_PURPOSE_DEFAULT:
|
||||||
|
return "MEDIA_PLAYER_FORMAT_PURPOSE_DEFAULT";
|
||||||
|
case enums::MEDIA_PLAYER_FORMAT_PURPOSE_ANNOUNCEMENT:
|
||||||
|
return "MEDIA_PLAYER_FORMAT_PURPOSE_ANNOUNCEMENT";
|
||||||
|
default:
|
||||||
|
return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
template<>
|
template<>
|
||||||
const char *proto_enum_to_string<enums::BluetoothDeviceRequestType>(enums::BluetoothDeviceRequestType value) {
|
const char *proto_enum_to_string<enums::BluetoothDeviceRequestType>(enums::BluetoothDeviceRequestType value) {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
|
@ -5123,6 +5135,64 @@ void ButtonCommandRequest::dump_to(std::string &out) const {
|
||||||
out.append("}");
|
out.append("}");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
bool MediaPlayerSupportedFormat::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
||||||
|
switch (field_id) {
|
||||||
|
case 2: {
|
||||||
|
this->sample_rate = value.as_uint32();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 3: {
|
||||||
|
this->num_channels = value.as_uint32();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
case 4: {
|
||||||
|
this->purpose = value.as_enum<enums::MediaPlayerFormatPurpose>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool MediaPlayerSupportedFormat::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
|
||||||
|
switch (field_id) {
|
||||||
|
case 1: {
|
||||||
|
this->format = value.as_string();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void MediaPlayerSupportedFormat::encode(ProtoWriteBuffer buffer) const {
|
||||||
|
buffer.encode_string(1, this->format);
|
||||||
|
buffer.encode_uint32(2, this->sample_rate);
|
||||||
|
buffer.encode_uint32(3, this->num_channels);
|
||||||
|
buffer.encode_enum<enums::MediaPlayerFormatPurpose>(4, this->purpose);
|
||||||
|
}
|
||||||
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
|
void MediaPlayerSupportedFormat::dump_to(std::string &out) const {
|
||||||
|
__attribute__((unused)) char buffer[64];
|
||||||
|
out.append("MediaPlayerSupportedFormat {\n");
|
||||||
|
out.append(" format: ");
|
||||||
|
out.append("'").append(this->format).append("'");
|
||||||
|
out.append("\n");
|
||||||
|
|
||||||
|
out.append(" sample_rate: ");
|
||||||
|
sprintf(buffer, "%" PRIu32, this->sample_rate);
|
||||||
|
out.append(buffer);
|
||||||
|
out.append("\n");
|
||||||
|
|
||||||
|
out.append(" num_channels: ");
|
||||||
|
sprintf(buffer, "%" PRIu32, this->num_channels);
|
||||||
|
out.append(buffer);
|
||||||
|
out.append("\n");
|
||||||
|
|
||||||
|
out.append(" purpose: ");
|
||||||
|
out.append(proto_enum_to_string<enums::MediaPlayerFormatPurpose>(this->purpose));
|
||||||
|
out.append("\n");
|
||||||
|
out.append("}");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
bool ListEntitiesMediaPlayerResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
bool ListEntitiesMediaPlayerResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
|
||||||
switch (field_id) {
|
switch (field_id) {
|
||||||
case 6: {
|
case 6: {
|
||||||
|
@ -5159,6 +5229,10 @@ bool ListEntitiesMediaPlayerResponse::decode_length(uint32_t field_id, ProtoLeng
|
||||||
this->icon = value.as_string();
|
this->icon = value.as_string();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
case 9: {
|
||||||
|
this->supported_formats.push_back(value.as_message<MediaPlayerSupportedFormat>());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -5182,6 +5256,9 @@ void ListEntitiesMediaPlayerResponse::encode(ProtoWriteBuffer buffer) const {
|
||||||
buffer.encode_bool(6, this->disabled_by_default);
|
buffer.encode_bool(6, this->disabled_by_default);
|
||||||
buffer.encode_enum<enums::EntityCategory>(7, this->entity_category);
|
buffer.encode_enum<enums::EntityCategory>(7, this->entity_category);
|
||||||
buffer.encode_bool(8, this->supports_pause);
|
buffer.encode_bool(8, this->supports_pause);
|
||||||
|
for (auto &it : this->supported_formats) {
|
||||||
|
buffer.encode_message<MediaPlayerSupportedFormat>(9, it, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
void ListEntitiesMediaPlayerResponse::dump_to(std::string &out) const {
|
void ListEntitiesMediaPlayerResponse::dump_to(std::string &out) const {
|
||||||
|
@ -5219,6 +5296,12 @@ void ListEntitiesMediaPlayerResponse::dump_to(std::string &out) const {
|
||||||
out.append(" supports_pause: ");
|
out.append(" supports_pause: ");
|
||||||
out.append(YESNO(this->supports_pause));
|
out.append(YESNO(this->supports_pause));
|
||||||
out.append("\n");
|
out.append("\n");
|
||||||
|
|
||||||
|
for (const auto &it : this->supported_formats) {
|
||||||
|
out.append(" supported_formats: ");
|
||||||
|
it.dump_to(out);
|
||||||
|
out.append("\n");
|
||||||
|
}
|
||||||
out.append("}");
|
out.append("}");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -156,6 +156,10 @@ enum MediaPlayerCommand : uint32_t {
|
||||||
MEDIA_PLAYER_COMMAND_MUTE = 3,
|
MEDIA_PLAYER_COMMAND_MUTE = 3,
|
||||||
MEDIA_PLAYER_COMMAND_UNMUTE = 4,
|
MEDIA_PLAYER_COMMAND_UNMUTE = 4,
|
||||||
};
|
};
|
||||||
|
enum MediaPlayerFormatPurpose : uint32_t {
|
||||||
|
MEDIA_PLAYER_FORMAT_PURPOSE_DEFAULT = 0,
|
||||||
|
MEDIA_PLAYER_FORMAT_PURPOSE_ANNOUNCEMENT = 1,
|
||||||
|
};
|
||||||
enum BluetoothDeviceRequestType : uint32_t {
|
enum BluetoothDeviceRequestType : uint32_t {
|
||||||
BLUETOOTH_DEVICE_REQUEST_TYPE_CONNECT = 0,
|
BLUETOOTH_DEVICE_REQUEST_TYPE_CONNECT = 0,
|
||||||
BLUETOOTH_DEVICE_REQUEST_TYPE_DISCONNECT = 1,
|
BLUETOOTH_DEVICE_REQUEST_TYPE_DISCONNECT = 1,
|
||||||
|
@ -1267,6 +1271,21 @@ class ButtonCommandRequest : public ProtoMessage {
|
||||||
protected:
|
protected:
|
||||||
bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
|
bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
|
||||||
};
|
};
|
||||||
|
class MediaPlayerSupportedFormat : public ProtoMessage {
|
||||||
|
public:
|
||||||
|
std::string format{};
|
||||||
|
uint32_t sample_rate{0};
|
||||||
|
uint32_t num_channels{0};
|
||||||
|
enums::MediaPlayerFormatPurpose purpose{};
|
||||||
|
void encode(ProtoWriteBuffer buffer) const override;
|
||||||
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
|
void dump_to(std::string &out) const override;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
|
||||||
|
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
|
||||||
|
};
|
||||||
class ListEntitiesMediaPlayerResponse : public ProtoMessage {
|
class ListEntitiesMediaPlayerResponse : public ProtoMessage {
|
||||||
public:
|
public:
|
||||||
std::string object_id{};
|
std::string object_id{};
|
||||||
|
@ -1277,6 +1296,7 @@ class ListEntitiesMediaPlayerResponse : public ProtoMessage {
|
||||||
bool disabled_by_default{false};
|
bool disabled_by_default{false};
|
||||||
enums::EntityCategory entity_category{};
|
enums::EntityCategory entity_category{};
|
||||||
bool supports_pause{false};
|
bool supports_pause{false};
|
||||||
|
std::vector<MediaPlayerSupportedFormat> supported_formats{};
|
||||||
void encode(ProtoWriteBuffer buffer) const override;
|
void encode(ProtoWriteBuffer buffer) const override;
|
||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
void dump_to(std::string &out) const override;
|
void dump_to(std::string &out) const override;
|
||||||
|
|
|
@ -311,6 +311,14 @@ bool APIServerConnectionBase::send_list_entities_button_response(const ListEntit
|
||||||
#ifdef USE_BUTTON
|
#ifdef USE_BUTTON
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_MEDIA_PLAYER
|
#ifdef USE_MEDIA_PLAYER
|
||||||
|
bool APIServerConnectionBase::send_media_player_supported_format(const MediaPlayerSupportedFormat &msg) {
|
||||||
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
|
ESP_LOGVV(TAG, "send_media_player_supported_format: %s", msg.dump().c_str());
|
||||||
|
#endif
|
||||||
|
return this->send_message_<MediaPlayerSupportedFormat>(msg, 119);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef USE_MEDIA_PLAYER
|
||||||
bool APIServerConnectionBase::send_list_entities_media_player_response(const ListEntitiesMediaPlayerResponse &msg) {
|
bool APIServerConnectionBase::send_list_entities_media_player_response(const ListEntitiesMediaPlayerResponse &msg) {
|
||||||
#ifdef HAS_PROTO_MESSAGE_DUMP
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
ESP_LOGVV(TAG, "send_list_entities_media_player_response: %s", msg.dump().c_str());
|
ESP_LOGVV(TAG, "send_list_entities_media_player_response: %s", msg.dump().c_str());
|
||||||
|
@ -1135,6 +1143,17 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type,
|
||||||
ESP_LOGVV(TAG, "on_update_command_request: %s", msg.dump().c_str());
|
ESP_LOGVV(TAG, "on_update_command_request: %s", msg.dump().c_str());
|
||||||
#endif
|
#endif
|
||||||
this->on_update_command_request(msg);
|
this->on_update_command_request(msg);
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 119: {
|
||||||
|
#ifdef USE_MEDIA_PLAYER
|
||||||
|
MediaPlayerSupportedFormat msg;
|
||||||
|
msg.decode(msg_data, msg_size);
|
||||||
|
#ifdef HAS_PROTO_MESSAGE_DUMP
|
||||||
|
ESP_LOGVV(TAG, "on_media_player_supported_format: %s", msg.dump().c_str());
|
||||||
|
#endif
|
||||||
|
this->on_media_player_supported_format(msg);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,10 @@ class APIServerConnectionBase : public ProtoService {
|
||||||
#ifdef USE_BUTTON
|
#ifdef USE_BUTTON
|
||||||
virtual void on_button_command_request(const ButtonCommandRequest &value){};
|
virtual void on_button_command_request(const ButtonCommandRequest &value){};
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef USE_MEDIA_PLAYER
|
||||||
|
bool send_media_player_supported_format(const MediaPlayerSupportedFormat &msg);
|
||||||
|
virtual void on_media_player_supported_format(const MediaPlayerSupportedFormat &value){};
|
||||||
|
#endif
|
||||||
#ifdef USE_MEDIA_PLAYER
|
#ifdef USE_MEDIA_PLAYER
|
||||||
bool send_list_entities_media_player_response(const ListEntitiesMediaPlayerResponse &msg);
|
bool send_list_entities_media_player_response(const ListEntitiesMediaPlayerResponse &msg);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,6 +27,18 @@ enum MediaPlayerCommand : uint8_t {
|
||||||
};
|
};
|
||||||
const char *media_player_command_to_string(MediaPlayerCommand command);
|
const char *media_player_command_to_string(MediaPlayerCommand command);
|
||||||
|
|
||||||
|
enum class MediaPlayerFormatPurpose : uint8_t {
|
||||||
|
PURPOSE_DEFAULT = 0,
|
||||||
|
PURPOSE_ANNOUNCEMENT = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct MediaPlayerSupportedFormat {
|
||||||
|
std::string format;
|
||||||
|
uint32_t sample_rate;
|
||||||
|
uint32_t num_channels;
|
||||||
|
MediaPlayerFormatPurpose purpose;
|
||||||
|
};
|
||||||
|
|
||||||
class MediaPlayer;
|
class MediaPlayer;
|
||||||
|
|
||||||
class MediaPlayerTraits {
|
class MediaPlayerTraits {
|
||||||
|
@ -37,8 +49,11 @@ class MediaPlayerTraits {
|
||||||
|
|
||||||
bool get_supports_pause() const { return this->supports_pause_; }
|
bool get_supports_pause() const { return this->supports_pause_; }
|
||||||
|
|
||||||
|
std::vector<MediaPlayerSupportedFormat> &get_supported_formats() { return this->supported_formats_; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool supports_pause_{false};
|
bool supports_pause_{false};
|
||||||
|
std::vector<MediaPlayerSupportedFormat> supported_formats_{};
|
||||||
};
|
};
|
||||||
|
|
||||||
class MediaPlayerCall {
|
class MediaPlayerCall {
|
||||||
|
|
Loading…
Reference in a new issue