Commit aa9124bf authored by Michael Sun's avatar Michael Sun Committed by Commit Bot

CRAS: make cras_audio_handler an observer of MediaController

Register cras_audio_handler to be an observer of MediaController in
order to receive update of media session playback status. Parse such
playback status into string and call corresponding AudioClient function
to propagate the information further to DBUS.

BUG=b:147367681
TEST=chromeos_unittests

Change-Id: I122fa0d3aa5f59a5828c0075617271fcf61ede94
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2076061Reviewed-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@{#746176}
parent ff995c3f
......@@ -234,6 +234,28 @@ void CrasAudioHandler::OnVideoCaptureStoppedOnMainThread(
SwitchToDevice(*GetDeviceByType(AUDIO_TYPE_FRONT_MIC), true, activated_by);
}
void CrasAudioHandler::MediaSessionInfoChanged(
media_session::mojom::MediaSessionInfoPtr session_info) {
if (!session_info)
return;
std::string state;
switch (session_info->state) {
case media_session::mojom::MediaSessionInfo::SessionState::kActive:
state = "playing";
break;
case media_session::mojom::MediaSessionInfo::SessionState::kSuspended:
state = "paused";
break;
default:
state = "stopped";
break;
}
CrasAudioClient::Get()->SetPlayerPlaybackStatus(state);
}
void CrasAudioHandler::AddAudioObserver(AudioObserver* observer) {
observers_.AddObserver(observer);
}
......@@ -662,6 +684,7 @@ CrasAudioHandler::CrasAudioHandler(
DCHECK(CrasAudioClient::Get());
CrasAudioClient::Get()->AddObserver(this);
audio_pref_handler_->AddAudioPrefObserver(this);
BindMediaControllerObserver();
InitializeAudioState();
// Unittest may not have the task runner for the current thread.
if (base::ThreadTaskRunnerHandle::IsSet())
......@@ -681,6 +704,15 @@ CrasAudioHandler::~CrasAudioHandler() {
g_cras_audio_handler = nullptr;
}
void CrasAudioHandler::BindMediaControllerObserver() {
if (!media_controller_manager_)
return;
media_controller_manager_->CreateActiveMediaController(
media_session_controller_remote_.BindNewPipeAndPassReceiver());
media_session_controller_remote_->AddObserver(
media_controller_observer_receiver_.BindNewPipeAndPassRemote());
}
void CrasAudioHandler::AudioClientRestarted() {
InitializeAudioState();
}
......
......@@ -30,6 +30,7 @@
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/media_session/public/mojom/media_controller.mojom.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
namespace base {
class SingleThreadTaskRunner;
......@@ -49,7 +50,8 @@ using VoidCrasAudioHandlerCallback = base::OnceCallback<void(bool result)>;
class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
: public CrasAudioClient::Observer,
public AudioPrefObserver,
public media::VideoCaptureObserver {
public media::VideoCaptureObserver,
public media_session::mojom::MediaControllerObserver {
public:
typedef std::
priority_queue<AudioDevice, std::vector<AudioDevice>, AudioDeviceCompare>
......@@ -133,6 +135,19 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
void OnVideoCaptureStarted(media::VideoFacingMode facing) override;
void OnVideoCaptureStopped(media::VideoFacingMode facing) override;
// Overrides media_session::mojom::MediaControllerObserver.
void MediaSessionInfoChanged(
media_session::mojom::MediaSessionInfoPtr session_info) override;
void MediaSessionMetadataChanged(
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 {}
// Adds an audio observer.
void AddAudioObserver(AudioObserver* observer);
......@@ -539,9 +554,17 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing);
void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing);
void BindMediaControllerObserver();
mojo::Remote<media_session::mojom::MediaControllerManager>
media_controller_manager_;
mojo::Remote<media_session::mojom::MediaController>
media_session_controller_remote_;
mojo::Receiver<media_session::mojom::MediaControllerObserver>
media_controller_observer_receiver_{this};
scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler_;
base::ObserverList<AudioObserver>::Unchecked observers_;
......
......@@ -44,6 +44,10 @@ class FakeMediaControllerManager
return remote;
}
void CreateActiveMediaController(
mojo::PendingReceiver<media_session::mojom::MediaController> receiver)
override {}
MOCK_METHOD0(SuspendAllSessions, void());
private:
......
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