Commit 2c1a0639 authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

[Media Controller] Add SuspendAllSessions

Add SuspendAllSessions mojo API to suspend all
media sessions. This will be used to pause
playback when the audio output is detached.

BUG=905923

Change-Id: I540ef1a78ec6f9e8d7eec0b4cb39f783db58e641
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1568831Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#651745}
parent a4bda7b4
......@@ -376,6 +376,11 @@ void AudioFocusManager::CreateMediaControllerForSession(
}
}
void AudioFocusManager::SuspendAllSessions() {
for (auto& row : audio_focus_stack_)
row->session()->Suspend(mojom::MediaSession::SuspendType::kUI);
}
void AudioFocusManager::BindToInterface(
mojom::AudioFocusManagerRequest request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
......
......@@ -67,6 +67,7 @@ class AudioFocusManager : public mojom::AudioFocusManager,
void CreateMediaControllerForSession(
mojom::MediaControllerRequest request,
const base::UnguessableToken& request_id) override;
void SuspendAllSessions() override;
// Bind to a mojom::AudioFocusManagerRequest.
void BindToInterface(mojom::AudioFocusManagerRequest request);
......
......@@ -1158,4 +1158,34 @@ TEST_F(MediaControllerTest, BoundController_Observer_SessionChanged) {
}
}
TEST_F(MediaControllerTest, Manager_SuspendAllSessions) {
test::MockMediaSession media_session_1;
test::MockMediaSession media_session_2;
{
test::MockMediaSessionMojoObserver observer(media_session_1);
RequestAudioFocus(media_session_1, mojom::AudioFocusType::kGain);
observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
}
{
test::MockMediaSessionMojoObserver observer(media_session_2);
RequestAudioFocus(media_session_2,
mojom::AudioFocusType::kGainTransientMayDuck);
observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPlaying);
}
manager()->SuspendAllSessions();
{
test::MockMediaSessionMojoObserver observer(media_session_1);
observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
}
{
test::MockMediaSessionMojoObserver observer(media_session_2);
observer.WaitForPlaybackState(mojom::MediaPlaybackState::kPaused);
}
}
} // namespace media_session
......@@ -19,6 +19,9 @@ interface MediaControllerManager {
// automatically route commands to the correct session if the active session
// changes. If there is no active session then commands will be no-ops.
CreateActiveMediaController(MediaController& request);
// Suspends all media sessions.
SuspendAllSessions();
};
// Controls a MediaSession. If the media session is not controllable then the
......
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