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(
base::Value SupportedMediaCommandsToListValue(int media_commands) {
base::Value value(base::Value::Type::LIST);
if (media_commands & 1)
value.Append("pause");
if (media_commands & 2)
value.Append("seek");
if (media_commands & 4)
value.Append("stream_volume");
if (media_commands & 8)
value.Append("stream_mute");
if (media_commands & static_cast<int>(MediaCommand::kPause))
value.Append(kMediaCommandPause);
if (media_commands & static_cast<int>(MediaCommand::kSeek))
value.Append(kMediaCommandSeek);
if (media_commands & static_cast<int>(MediaCommand::kStreamVolume))
value.Append(kMediaCommandStreamVolume);
if (media_commands & static_cast<int>(MediaCommand::kStreamMute))
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;
}
......
......@@ -17,6 +17,28 @@ using cast::channel::CastMessage;
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
// PresentationConnection.
class CastInternalMessage {
......
......@@ -207,17 +207,20 @@ void CastMediaController::UpdateMediaStatus(const base::Value& message_value) {
}
const base::Value* commands_value =
status_value.FindKey("supportedMediaCommands");
if (commands_value && commands_value->is_int()) {
int commands = commands_value->GetInt();
status_value.FindListKey("supportedMediaCommands");
if (commands_value) {
const base::ListValue& commands_list =
base::Value::AsListValue(*commands_value);
// |can_set_volume| and |can_mute| are not used, because the receiver volume
// info obtained in SetSession() is used instead.
media_status_.can_play_pause = commands & kSupportedMediaCommandPause;
media_status_.can_seek = commands & kSupportedMediaCommandSeek;
media_status_.can_play_pause =
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 =
commands & kSupportedMediaCommandQueueNext;
base::Contains(commands_list, base::Value(kMediaCommandQueueNext));
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");
......
......@@ -55,14 +55,18 @@ Value GetPlayerStateValue(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
// is used instead.
if (status.can_play_pause)
commands |= 1;
commands.AppendString("pause");
if (status.can_seek)
commands |= 2;
return Value(commands);
commands.AppendString("seek");
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) {
......@@ -88,6 +92,8 @@ mojom::MediaStatusPtr CreateSampleMediaStatus() {
status->can_mute = true;
status->can_set_volume = false;
status->can_seek = false;
status->can_skip_to_next_track = true;
status->can_skip_to_previous_track = false;
status->is_muted = false;
status->volume = 0.7;
status->play_state = mojom::MediaStatus::PlayState::BUFFERING;
......@@ -286,6 +292,11 @@ TEST_F(CastMediaControllerTest, UpdateMediaStatus) {
.WillOnce([&](mojom::MediaStatusPtr status) {
EXPECT_EQ(expected_status->title, status->title);
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->duration, status->duration);
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