1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Copyright (c) 2013 Intel Corporation. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
6 #include "xwalk/tizen/browser/media/browser_mediaplayer_manager.h"
8 #include "content/browser/renderer_host/media/audio_renderer_host.h"
9 #include "content/browser/renderer_host/render_process_host_impl.h"
10 #include "content/public/browser/render_frame_host.h"
11 #include "content/public/browser/web_contents.h"
12 #include "xwalk/tizen/common/media/media_player_messages.h"
16 BrowserMediaPlayerManager::BrowserMediaPlayerManager(
17 content::RenderFrameHost* render_frame_host,
18 MurphyResourceManager* resource_manager)
19 : render_frame_host_(render_frame_host),
20 resource_manager_(resource_manager) {
23 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {}
25 BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create(
26 content::RenderFrameHost* render_frame_host,
27 MurphyResourceManager* resource_manager) {
28 return new BrowserMediaPlayerManager(render_frame_host, resource_manager);
31 MurphyResource* BrowserMediaPlayerManager::GetMurphyResource(
32 MediaPlayerID player_id) {
33 for (ScopedVector<MurphyResource>::iterator it =
34 murphy_resources_.begin(); it != murphy_resources_.end();
36 if ((*it)->player_id() == player_id)
43 int BrowserMediaPlayerManager::RoutingID() {
44 return render_frame_host_->GetRoutingID();
47 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
48 return render_frame_host_->Send(msg);
51 void BrowserMediaPlayerManager::ResourceNotifyCallback(
52 mrp_res_resource_state_t state,
53 MediaPlayerID player_id) {
55 MurphyResource* resource = GetMurphyResource(player_id);
57 mrp_res_resource_state_t prev_state = resource->GetResourceState();
59 // Received a resource event from Murphy
61 case MRP_RES_RESOURCE_AVAILABLE:
62 if (prev_state == MRP_RES_RESOURCE_ACQUIRED)
63 Send(new MediaPlayerMsg_MediaPlayerPause(RoutingID(), player_id));
64 case MRP_RES_RESOURCE_LOST:
65 if (prev_state == MRP_RES_RESOURCE_ACQUIRED ||
66 prev_state == MRP_RES_RESOURCE_LOST)
67 Send(new MediaPlayerMsg_MediaPlayerPause(RoutingID(), player_id));
69 case MRP_RES_RESOURCE_ACQUIRED:
70 if (prev_state == MRP_RES_RESOURCE_LOST)
71 Send(new MediaPlayerMsg_MediaPlayerPlay(RoutingID(), player_id));
73 case MRP_RES_RESOURCE_PENDING:
81 void BrowserMediaPlayerManager::OnInitialize(
82 MediaPlayerID player_id,
85 scoped_refptr<content::AudioRendererHost> audio_host =
86 static_cast<content::RenderProcessHostImpl*>(
87 render_frame_host_->GetProcess())->audio_renderer_host();
89 // Create murphy resource for the given player id.
90 if (resource_manager_ && resource_manager_->IsConnected()) {
91 MurphyResource* resource = new MurphyResource(
92 this, player_id, audio_host->app_id(),
93 audio_host->app_class(), resource_manager_);
94 RemoveMurphyResource(player_id);
95 AddMurphyResource(resource);
99 void BrowserMediaPlayerManager::OnDestroyPlayer(MediaPlayerID player_id) {
100 RemoveMurphyResource(player_id);
103 void BrowserMediaPlayerManager::OnPause(MediaPlayerID player_id) {
104 if (MurphyResource* resource = GetMurphyResource(player_id))
105 resource->ReleaseResource();
108 void BrowserMediaPlayerManager::OnStart(MediaPlayerID player_id) {
109 if (MurphyResource* resource = GetMurphyResource(player_id))
110 resource->AcquireResource();
113 void BrowserMediaPlayerManager::AddMurphyResource(
114 MurphyResource* resource) {
115 DCHECK(!GetMurphyResource(resource->player_id()));
116 murphy_resources_.push_back(resource);
119 void BrowserMediaPlayerManager::RemoveMurphyResource(
120 MediaPlayerID player_id) {
121 for (ScopedVector<MurphyResource>::iterator it =
122 murphy_resources_.begin(); it != murphy_resources_.end();
124 if ((*it)->player_id() == player_id) {
125 murphy_resources_.erase(it);