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( ...@@ -234,6 +234,28 @@ void CrasAudioHandler::OnVideoCaptureStoppedOnMainThread(
SwitchToDevice(*GetDeviceByType(AUDIO_TYPE_FRONT_MIC), true, activated_by); 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) { void CrasAudioHandler::AddAudioObserver(AudioObserver* observer) {
observers_.AddObserver(observer); observers_.AddObserver(observer);
} }
...@@ -662,6 +684,7 @@ CrasAudioHandler::CrasAudioHandler( ...@@ -662,6 +684,7 @@ CrasAudioHandler::CrasAudioHandler(
DCHECK(CrasAudioClient::Get()); DCHECK(CrasAudioClient::Get());
CrasAudioClient::Get()->AddObserver(this); CrasAudioClient::Get()->AddObserver(this);
audio_pref_handler_->AddAudioPrefObserver(this); audio_pref_handler_->AddAudioPrefObserver(this);
BindMediaControllerObserver();
InitializeAudioState(); InitializeAudioState();
// Unittest may not have the task runner for the current thread. // Unittest may not have the task runner for the current thread.
if (base::ThreadTaskRunnerHandle::IsSet()) if (base::ThreadTaskRunnerHandle::IsSet())
...@@ -681,6 +704,15 @@ CrasAudioHandler::~CrasAudioHandler() { ...@@ -681,6 +704,15 @@ CrasAudioHandler::~CrasAudioHandler() {
g_cras_audio_handler = nullptr; 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() { void CrasAudioHandler::AudioClientRestarted() {
InitializeAudioState(); InitializeAudioState();
} }
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/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_controller.mojom.h"
#include "services/media_session/public/mojom/media_session.mojom.h"
namespace base { namespace base {
class SingleThreadTaskRunner; class SingleThreadTaskRunner;
...@@ -49,7 +50,8 @@ using VoidCrasAudioHandlerCallback = base::OnceCallback<void(bool result)>; ...@@ -49,7 +50,8 @@ using VoidCrasAudioHandlerCallback = base::OnceCallback<void(bool result)>;
class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
: public CrasAudioClient::Observer, : public CrasAudioClient::Observer,
public AudioPrefObserver, public AudioPrefObserver,
public media::VideoCaptureObserver { public media::VideoCaptureObserver,
public media_session::mojom::MediaControllerObserver {
public: public:
typedef std:: typedef std::
priority_queue<AudioDevice, std::vector<AudioDevice>, AudioDeviceCompare> priority_queue<AudioDevice, std::vector<AudioDevice>, AudioDeviceCompare>
...@@ -133,6 +135,19 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler ...@@ -133,6 +135,19 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
void OnVideoCaptureStarted(media::VideoFacingMode facing) override; void OnVideoCaptureStarted(media::VideoFacingMode facing) override;
void OnVideoCaptureStopped(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. // Adds an audio observer.
void AddAudioObserver(AudioObserver* observer); void AddAudioObserver(AudioObserver* observer);
...@@ -539,9 +554,17 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler ...@@ -539,9 +554,17 @@ class COMPONENT_EXPORT(CHROMEOS_AUDIO) CrasAudioHandler
void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing); void OnVideoCaptureStartedOnMainThread(media::VideoFacingMode facing);
void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing); void OnVideoCaptureStoppedOnMainThread(media::VideoFacingMode facing);
void BindMediaControllerObserver();
mojo::Remote<media_session::mojom::MediaControllerManager> mojo::Remote<media_session::mojom::MediaControllerManager>
media_controller_manager_; 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_; scoped_refptr<AudioDevicesPrefHandler> audio_pref_handler_;
base::ObserverList<AudioObserver>::Unchecked observers_; base::ObserverList<AudioObserver>::Unchecked observers_;
......
...@@ -44,6 +44,10 @@ class FakeMediaControllerManager ...@@ -44,6 +44,10 @@ class FakeMediaControllerManager
return remote; return remote;
} }
void CreateActiveMediaController(
mojo::PendingReceiver<media_session::mojom::MediaController> receiver)
override {}
MOCK_METHOD0(SuspendAllSessions, void()); MOCK_METHOD0(SuspendAllSessions, void());
private: 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