Commit 0919046f authored by Takumi Fujimoto's avatar Takumi Fujimoto Committed by Commit Bot

[Cast MRP] Fix supportedMediaCommands support in the media controller

crrev.com/c/2006479 converts the supportedMediaCommands value type from
bit array to string list. This CL updates CastMediaController to use the
new type.

Bug: 1045627
Change-Id: I3bf79cf6e34ff636449d260d0ea1474a23aa9c7c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2023269Reviewed-by: default avatarmark a. foltz <mfoltz@chromium.org>
Commit-Queue: Takumi Fujimoto <takumif@chromium.org>
Cr-Commit-Position: refs/heads/master@{#737130}
parent c960440f
...@@ -519,14 +519,18 @@ blink::mojom::PresentationConnectionMessagePtr CreateErrorMessage( ...@@ -519,14 +519,18 @@ blink::mojom::PresentationConnectionMessagePtr CreateErrorMessage(
base::Value SupportedMediaCommandsToListValue(int media_commands) { base::Value SupportedMediaCommandsToListValue(int media_commands) {
base::Value value(base::Value::Type::LIST); base::Value value(base::Value::Type::LIST);
if (media_commands & 1) if (media_commands & static_cast<int>(MediaCommand::kPause))
value.Append("pause"); value.Append(kMediaCommandPause);
if (media_commands & 2) if (media_commands & static_cast<int>(MediaCommand::kSeek))
value.Append("seek"); value.Append(kMediaCommandSeek);
if (media_commands & 4) if (media_commands & static_cast<int>(MediaCommand::kStreamVolume))
value.Append("stream_volume"); value.Append(kMediaCommandStreamVolume);
if (media_commands & 8) if (media_commands & static_cast<int>(MediaCommand::kStreamMute))
value.Append("stream_mute"); value.Append(kMediaCommandStreamMute);
if (media_commands & static_cast<int>(MediaCommand::kQueueNext))
value.Append(kMediaCommandQueueNext);
if (media_commands & static_cast<int>(MediaCommand::kQueuePrev))
value.Append(kMediaCommandQueuePrev);
return value; return value;
} }
......
...@@ -17,6 +17,28 @@ using cast::channel::CastMessage; ...@@ -17,6 +17,28 @@ using cast::channel::CastMessage;
class MediaSinkInternal; class MediaSinkInternal;
// Values in the "supportedMediaCommands" list in media status messages
// sent to the Cast sender SDK.
constexpr char kMediaCommandPause[] = "pause";
constexpr char kMediaCommandSeek[] = "seek";
constexpr char kMediaCommandStreamVolume[] = "stream_volume";
constexpr char kMediaCommandStreamMute[] = "stream_mute";
constexpr char kMediaCommandQueueNext[] = "queue_next";
constexpr char kMediaCommandQueuePrev[] = "queue_prev";
// Values in the "supportedMediaCommands" bit array in media status messages
// received from Cast receivers. They are converted to string values by
// SupportedMediaCommandsToListValue().
enum class MediaCommand {
kPause = 1 << 0,
kSeek = 1 << 1,
kStreamVolume = 1 << 2,
kStreamMute = 1 << 3,
// 1 << 4 and 1 << 5 are not in use.
kQueueNext = 1 << 6,
kQueuePrev = 1 << 7,
};
// Represents a message sent or received by the Cast SDK via a // Represents a message sent or received by the Cast SDK via a
// PresentationConnection. // PresentationConnection.
class CastInternalMessage { class CastInternalMessage {
......
...@@ -207,17 +207,20 @@ void CastMediaController::UpdateMediaStatus(const base::Value& message_value) { ...@@ -207,17 +207,20 @@ void CastMediaController::UpdateMediaStatus(const base::Value& message_value) {
} }
const base::Value* commands_value = const base::Value* commands_value =
status_value.FindKey("supportedMediaCommands"); status_value.FindListKey("supportedMediaCommands");
if (commands_value && commands_value->is_int()) { if (commands_value) {
int commands = commands_value->GetInt(); const base::ListValue& commands_list =
base::Value::AsListValue(*commands_value);
// |can_set_volume| and |can_mute| are not used, because the receiver volume // |can_set_volume| and |can_mute| are not used, because the receiver volume
// info obtained in SetSession() is used instead. // info obtained in SetSession() is used instead.
media_status_.can_play_pause = commands & kSupportedMediaCommandPause; media_status_.can_play_pause =
media_status_.can_seek = commands & kSupportedMediaCommandSeek; base::Contains(commands_list, base::Value(kMediaCommandPause));
media_status_.can_seek =
base::Contains(commands_list, base::Value(kMediaCommandSeek));
media_status_.can_skip_to_next_track = media_status_.can_skip_to_next_track =
commands & kSupportedMediaCommandQueueNext; base::Contains(commands_list, base::Value(kMediaCommandQueueNext));
media_status_.can_skip_to_previous_track = media_status_.can_skip_to_previous_track =
commands & kSupportedMediaCommandQueuePrev; base::Contains(commands_list, base::Value(kMediaCommandQueuePrev));
} }
const base::Value* player_state = status_value.FindKey("playerState"); const base::Value* player_state = status_value.FindKey("playerState");
......
...@@ -55,14 +55,18 @@ Value GetPlayerStateValue(const mojom::MediaStatus& status) { ...@@ -55,14 +55,18 @@ Value GetPlayerStateValue(const mojom::MediaStatus& status) {
} }
Value GetSupportedMediaCommandsValue(const mojom::MediaStatus& status) { Value GetSupportedMediaCommandsValue(const mojom::MediaStatus& status) {
int commands = 0; base::ListValue commands;
// |can_set_volume| and |can_mute| are not used, because the receiver volume // |can_set_volume| and |can_mute| are not used, because the receiver volume
// is used instead. // is used instead.
if (status.can_play_pause) if (status.can_play_pause)
commands |= 1; commands.AppendString("pause");
if (status.can_seek) if (status.can_seek)
commands |= 2; commands.AppendString("seek");
return Value(commands); if (status.can_skip_to_next_track)
commands.AppendString("queue_next");
if (status.can_skip_to_previous_track)
commands.AppendString("queue_next");
return std::move(commands);
} }
Value CreateImagesValue(const std::vector<mojom::MediaImagePtr>& images) { Value CreateImagesValue(const std::vector<mojom::MediaImagePtr>& images) {
...@@ -88,6 +92,8 @@ mojom::MediaStatusPtr CreateSampleMediaStatus() { ...@@ -88,6 +92,8 @@ mojom::MediaStatusPtr CreateSampleMediaStatus() {
status->can_mute = true; status->can_mute = true;
status->can_set_volume = false; status->can_set_volume = false;
status->can_seek = false; status->can_seek = false;
status->can_skip_to_next_track = true;
status->can_skip_to_previous_track = false;
status->is_muted = false; status->is_muted = false;
status->volume = 0.7; status->volume = 0.7;
status->play_state = mojom::MediaStatus::PlayState::BUFFERING; status->play_state = mojom::MediaStatus::PlayState::BUFFERING;
...@@ -286,6 +292,11 @@ TEST_F(CastMediaControllerTest, UpdateMediaStatus) { ...@@ -286,6 +292,11 @@ TEST_F(CastMediaControllerTest, UpdateMediaStatus) {
.WillOnce([&](mojom::MediaStatusPtr status) { .WillOnce([&](mojom::MediaStatusPtr status) {
EXPECT_EQ(expected_status->title, status->title); EXPECT_EQ(expected_status->title, status->title);
EXPECT_EQ(expected_status->can_play_pause, status->can_play_pause); EXPECT_EQ(expected_status->can_play_pause, status->can_play_pause);
EXPECT_EQ(expected_status->can_seek, status->can_seek);
EXPECT_EQ(expected_status->can_skip_to_next_track,
status->can_skip_to_next_track);
EXPECT_EQ(expected_status->can_skip_to_previous_track,
status->can_skip_to_previous_track);
EXPECT_EQ(expected_status->play_state, status->play_state); EXPECT_EQ(expected_status->play_state, status->play_state);
EXPECT_EQ(expected_status->duration, status->duration); EXPECT_EQ(expected_status->duration, status->duration);
EXPECT_EQ(expected_status->current_time, status->current_time); EXPECT_EQ(expected_status->current_time, status->current_time);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment