Commit 51d643e5 authored by Michael Sun's avatar Michael Sun Committed by Commit Bot

CRAS: Handle metadata and position info from Media Session

Upon receiving the updated metadata and position information for the
active media session from Media Session Controller, cras_audio_handler
will parse and repack the data for the audio client for further
processing.

Categorize the MediaSessionInfo::SessionState::kDucking to "playing"
instead of "stopped" for audio client.

BUG=b:147365593, b:147365793, b:147367068
TEST=chromeos_unittests

Change-Id: Iea65b931580b5725b807ae268958cf225e121195
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2088799Reviewed-by: default avatarBecca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarJenny Zhang <jennyz@chromium.org>
Commit-Queue: Michael Sun <michaelfsun@google.com>
Cr-Commit-Position: refs/heads/master@{#747438}
parent ea474e49
......@@ -17,6 +17,7 @@
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h"
#include "base/system/sys_info.h"
#include "base/system/system_monitor.h"
#include "base/threading/thread_task_runner_handle.h"
......@@ -243,12 +244,13 @@ void CrasAudioHandler::MediaSessionInfoChanged(
switch (session_info->state) {
case media_session::mojom::MediaSessionInfo::SessionState::kActive:
case media_session::mojom::MediaSessionInfo::SessionState::kDucking:
state = "playing";
break;
case media_session::mojom::MediaSessionInfo::SessionState::kSuspended:
state = "paused";
break;
default:
case media_session::mojom::MediaSessionInfo::SessionState::kInactive:
state = "stopped";
break;
}
......@@ -256,6 +258,44 @@ void CrasAudioHandler::MediaSessionInfoChanged(
CrasAudioClient::Get()->SetPlayerPlaybackStatus(state);
}
void CrasAudioHandler::MediaSessionMetadataChanged(
const base::Optional<media_session::MediaMetadata>& metadata) {
if (!metadata || metadata->IsEmpty())
return;
const std::map<std::string, std::string> metadata_map = {
{"title", base::UTF16ToASCII(metadata->title)},
{"artist", base::UTF16ToASCII(metadata->artist)},
{"album", base::UTF16ToASCII(metadata->album)}};
const std::string source_title = base::UTF16ToASCII(metadata->source_title);
// Assume media duration/length should always change with new metadata.
fetch_media_session_duration_ = true;
CrasAudioClient::Get()->SetPlayerMetadata(metadata_map);
CrasAudioClient::Get()->SetPlayerIdentity(source_title);
}
void CrasAudioHandler::MediaSessionPositionChanged(
const base::Optional<media_session::MediaPosition>& position) {
if (!position)
return;
int64_t duration = 0;
if (fetch_media_session_duration_) {
duration = position->duration().InMicroseconds();
if (duration > 0) {
CrasAudioClient::Get()->SetPlayerDuration(duration);
fetch_media_session_duration_ = false;
}
}
int64_t current_position = position->GetPosition().InMicroseconds();
if (current_position < 0 || current_position > duration)
return;
CrasAudioClient::Get()->SetPlayerPosition(current_position);
}
void CrasAudioHandler::AddAudioObserver(AudioObserver* observer) {
observers_.AddObserver(observer);
}
......
......@@ -139,14 +139,14 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
void MediaSessionInfoChanged(
media_session::mojom::MediaSessionInfoPtr session_info) override;
void MediaSessionMetadataChanged(
const base::Optional<media_session::MediaMetadata>& metadata) override {}
const base::Optional<media_session::MediaMetadata>& metadata) override;
void MediaSessionActionsChanged(
const std::vector<media_session::mojom::MediaSessionAction>& actions)
override {}
void MediaSessionChanged(
const base::Optional<base::UnguessableToken>& request_id) override {}
void MediaSessionPositionChanged(
const base::Optional<media_session::MediaPosition>& position) override {}
const base::Optional<media_session::MediaPosition>& position) override;
// Adds an audio observer.
void AddAudioObserver(AudioObserver* observer);
......@@ -612,6 +612,8 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
int num_active_output_streams_ = 0;
bool fetch_media_session_duration_ = false;
// Task runner of browser main thread. All member variables should be accessed
// on this thread.
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
......
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