blob: 586bbf361c1df3431df30f87c246e2284baa62fa [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/media/session/audio_focus_delegate.h"
#include "base/command_line.h"
#include "content/browser/media/session/audio_focus_manager.h"
#include "media/base/media_switches.h"
namespace content {
using AudioFocusType = AudioFocusManager::AudioFocusType;
namespace {
// AudioFocusDelegateDefault is the default implementation of
// AudioFocusDelegate which only handles audio focus between WebContents.
class AudioFocusDelegateDefault : public AudioFocusDelegate {
public:
explicit AudioFocusDelegateDefault(MediaSessionImpl* media_session);
~AudioFocusDelegateDefault() override;
// AudioFocusDelegate implementation.
bool RequestAudioFocus(
AudioFocusManager::AudioFocusType audio_focus_type) override;
void AbandonAudioFocus() override;
private:
// Weak pointer because |this| is owned by |media_session_|.
MediaSessionImpl* media_session_;
};
} // anonymous namespace
AudioFocusDelegateDefault::AudioFocusDelegateDefault(
MediaSessionImpl* media_session)
: media_session_(media_session) {}
AudioFocusDelegateDefault::~AudioFocusDelegateDefault() = default;
bool AudioFocusDelegateDefault::RequestAudioFocus(
AudioFocusManager::AudioFocusType audio_focus_type) {
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableAudioFocus)) {
return true;
}
AudioFocusManager::GetInstance()->RequestAudioFocus(media_session_,
audio_focus_type);
return true;
}
void AudioFocusDelegateDefault::AbandonAudioFocus() {
AudioFocusManager::GetInstance()->AbandonAudioFocus(media_session_);
}
// static
std::unique_ptr<AudioFocusDelegate> AudioFocusDelegate::Create(
MediaSessionImpl* media_session) {
return std::unique_ptr<AudioFocusDelegate>(
new AudioFocusDelegateDefault(media_session));
}
} // namespace content