Commit 8d94baa3 authored by Michael Sun's avatar Michael Sun Committed by Commit Bot

CRAS: Add SetPlayerDuration Function to cras_audio_client

Add a new function in cras_audio_client to support propagate media
track duration/length to Chrome OS via DBUS CRAS Control Interface. As
Bluetooth Stack (BlueZ) and MPRIS defined media duration to be a part of
metadata, SetPlayerDuration function will wrap the duration informatio
into the metadata format and forward it to DBUS.

BUG=b:147365563
TEST=chromeos_unittests

Change-Id: I3a6b91247a58f8898fa05f0dfe89195cdbfe7c8c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2081262
Commit-Queue: Michael Sun <michaelfsun@google.com>
Reviewed-by: default avatarJenny Zhang <jennyz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746994}
parent 4f7b97f5
......@@ -355,6 +355,25 @@ class CrasAudioClientImpl : public CrasAudioClient {
base::DoNothing());
}
void SetPlayerDuration(const int64_t& duration) override {
dbus::MethodCall method_call(cras::kCrasControlInterface,
cras::kSetPlayerMetadata);
dbus::MessageWriter writer(&method_call);
dbus::MessageWriter array_writer(nullptr);
dbus::MessageWriter dict_entry_writer(nullptr);
writer.OpenArray("{sv}", &array_writer);
array_writer.OpenDictEntry(&dict_entry_writer);
dict_entry_writer.AppendString("length");
dict_entry_writer.AppendVariantOfInt64(duration);
array_writer.CloseContainer(&dict_entry_writer);
writer.CloseContainer(&array_writer);
cras_proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::DoNothing());
}
void SetPlayerMetadata(
const std::map<std::string, std::string>& metadata) override {
dbus::MethodCall method_call(cras::kCrasControlInterface,
......
......@@ -175,6 +175,9 @@ class COMPONENT_EXPORT(DBUS_AUDIO) CrasAudioClient {
// Sets the current track position for the player in microseconds
virtual void SetPlayerPosition(const int64_t& position) = 0;
// Sets the current track duration for the player in microseconds
virtual void SetPlayerDuration(const int64_t& duration) = 0;
// Sets the current media metadata including Title, Album, and Artist.
virtual void SetPlayerMetadata(
const std::map<std::string, std::string>& metadata) = 0;
......
......@@ -203,6 +203,29 @@ void ExpectArrayOfDictOfStringAndVariantStringArguments(
EXPECT_FALSE(reader->HasMoreData());
}
// Expect the reader to have an array of dictionary of string and variant
// int64.
void ExpectArrayOfDictOfStringAndVariantInt64Arguments(
const std::map<std::string, int64_t>& expected_dict,
dbus::MessageReader* reader) {
dbus::MessageReader array_reader(nullptr);
ASSERT_TRUE(reader->PopArray(&array_reader));
dbus::MessageReader dict_entry_reader(nullptr);
for (auto& entry : expected_dict) {
EXPECT_TRUE(array_reader.HasMoreData());
ASSERT_TRUE(array_reader.PopDictEntry(&dict_entry_reader));
std::string key;
int64_t value;
ASSERT_TRUE(dict_entry_reader.PopString(&key));
EXPECT_EQ(entry.first, key);
ASSERT_TRUE(dict_entry_reader.PopVariantOfInt64(&value));
EXPECT_EQ(entry.second, value);
}
EXPECT_FALSE(reader->HasMoreData());
}
void WriteNodesToResponse(const AudioNodeList& node_list,
dbus::MessageWriter* writer) {
dbus::MessageWriter sub_writer(nullptr);
......@@ -1197,6 +1220,25 @@ TEST_F(CrasAudioClientTest, SetPlayerPosition) {
base::RunLoop().RunUntilIdle();
}
TEST_F(CrasAudioClientTest, SetPlayerDuration) {
const int64_t kDuration = 20200302;
const std::map<std::string, int64_t> kMetadata = {{"length", kDuration}};
// Create response.
std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
// Set expectations.
PrepareForMethodCall(
cras::kSetPlayerMetadata,
base::BindRepeating(&ExpectArrayOfDictOfStringAndVariantInt64Arguments,
kMetadata),
response.get());
// Call method.
client()->SetPlayerDuration(kDuration);
// Run the message loop.
base::RunLoop().RunUntilIdle();
}
TEST_F(CrasAudioClientTest, SetPlayerMetadata) {
const std::string kTitle = "Chrome Metadata Title";
const std::string kAlbum = "Chrome Metadata Album";
......
......@@ -220,6 +220,8 @@ void FakeCrasAudioClient::SetPlayerIdentity(
void FakeCrasAudioClient::SetPlayerPosition(const int64_t& position) {}
void FakeCrasAudioClient::SetPlayerDuration(const int64_t& duration) {}
void FakeCrasAudioClient::SetPlayerMetadata(
const std::map<std::string, std::string>& metadata) {}
......
......@@ -54,6 +54,7 @@ class COMPONENT_EXPORT(DBUS_AUDIO) FakeCrasAudioClient
void SetPlayerPlaybackStatus(const std::string& playback_status) override;
void SetPlayerIdentity(const std::string& playback_identity) override;
void SetPlayerPosition(const int64_t& position) override;
void SetPlayerDuration(const int64_t& duration) override;
void SetPlayerMetadata(
const std::map<std::string, std::string>& metadata) override;
void WaitForServiceToBeAvailable(
......
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