blob: 875d799ffc0182f49fceb6e94c36607d0ec5312b [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/pepper_playback_observer.h"
#include "base/command_line.h"
#include "base/metrics/histogram_macros.h"
#include "content/browser/media/session/media_session_impl.h"
#include "content/browser/media/session/pepper_player_delegate.h"
#include "content/common/frame_messages.h"
#include "ipc/ipc_message_macros.h"
#include "media/base/media_content_type.h"
#include "media/base/media_switches.h"
namespace content {
PepperPlaybackObserver::PepperPlaybackObserver(WebContents* contents)
: contents_(contents) {}
PepperPlaybackObserver::~PepperPlaybackObserver() {
// At this point WebContents is being destructed, so it's safe to
// call this. MediaSession may decide to send further IPC messages
// through PepperPlayerDelegates, which might be declined if the
// RenderViewHost has been destroyed.
for (auto it = players_played_sound_map_.begin();
it != players_played_sound_map_.end();) {
const PlayerId& id = (it++)->first;
PepperInstanceDeleted(id.first, id.second);
}
}
void PepperPlaybackObserver::RenderFrameDeleted(
RenderFrameHost* render_frame_host) {
std::vector<PlayerId> players_to_remove;
for (auto it = players_played_sound_map_.begin();
it != players_played_sound_map_.end();) {
const PlayerId& id = (it++)->first;
if (id.first == render_frame_host)
PepperInstanceDeleted(id.first, id.second);
}
}
void PepperPlaybackObserver::PepperInstanceCreated(
RenderFrameHost* render_frame_host, int32_t pp_instance) {
PlayerId id(render_frame_host, pp_instance);
players_played_sound_map_[id] = false;
}
void PepperPlaybackObserver::PepperInstanceDeleted(
RenderFrameHost* render_frame_host, int32_t pp_instance) {
PlayerId id(render_frame_host, pp_instance);
auto iter = players_played_sound_map_.find(id);
if (iter == players_played_sound_map_.end())
return;
UMA_HISTOGRAM_BOOLEAN("Media.Pepper.PlayedSound", iter->second);
players_played_sound_map_.erase(iter);
PepperStopsPlayback(render_frame_host, pp_instance);
}
void PepperPlaybackObserver::PepperStartsPlayback(
RenderFrameHost* render_frame_host, int32_t pp_instance) {
PlayerId id(render_frame_host, pp_instance);
players_played_sound_map_[id] = true;
if (players_map_.count(id))
return;
players_map_[id].reset(new PepperPlayerDelegate(
render_frame_host, pp_instance));
MediaSessionImpl::Get(contents_)->AddPlayer(
players_map_[id].get(), PepperPlayerDelegate::kPlayerId,
base::FeatureList::IsEnabled(media::kAudioFocusDuckFlash)
? media::MediaContentType::Pepper
: media::MediaContentType::OneShot);
}
void PepperPlaybackObserver::PepperStopsPlayback(
RenderFrameHost* render_frame_host, int32_t pp_instance) {
PlayerId id(render_frame_host, pp_instance);
if (!players_map_.count(id))
return;
MediaSessionImpl::Get(contents_)->RemovePlayer(
players_map_[id].get(), PepperPlayerDelegate::kPlayerId);
players_map_.erase(id);
}
} // namespace content