Upstream version 11.39.244.0
[platform/framework/web/crosswalk.git] / src / xwalk / tizen / browser / media / browser_mediaplayer_manager.cc
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.
5
6 #include "xwalk/tizen/browser/media/browser_mediaplayer_manager.h"
7
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"
13
14 namespace tizen {
15
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) {
21 }
22
23 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {}
24
25 BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create(
26     content::RenderFrameHost* render_frame_host,
27     MurphyResourceManager* resource_manager) {
28   return new BrowserMediaPlayerManager(render_frame_host, resource_manager);
29 }
30
31 MurphyResource* BrowserMediaPlayerManager::GetMurphyResource(
32     MediaPlayerID player_id) {
33   for (ScopedVector<MurphyResource>::iterator it =
34       murphy_resources_.begin(); it != murphy_resources_.end();
35       ++it) {
36     if ((*it)->player_id() == player_id)
37       return *it;
38   }
39
40   return NULL;
41 }
42
43 int BrowserMediaPlayerManager::RoutingID() {
44   return render_frame_host_->GetRoutingID();
45 }
46
47 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
48   return render_frame_host_->Send(msg);
49 }
50
51 void BrowserMediaPlayerManager::ResourceNotifyCallback(
52     mrp_res_resource_state_t state,
53     MediaPlayerID player_id) {
54
55   MurphyResource* resource = GetMurphyResource(player_id);
56
57   mrp_res_resource_state_t prev_state = resource->GetResourceState();
58
59   // Received a resource event from Murphy
60   switch (state) {
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));
68       break;
69     case MRP_RES_RESOURCE_ACQUIRED:
70       if (prev_state == MRP_RES_RESOURCE_LOST)
71         Send(new MediaPlayerMsg_MediaPlayerPlay(RoutingID(), player_id));
72       break;
73     case MRP_RES_RESOURCE_PENDING:
74       break;
75     default:
76       NOTREACHED();
77       break;
78     }
79 }
80
81 void BrowserMediaPlayerManager::OnInitialize(
82     MediaPlayerID player_id,
83     int process_id,
84     const GURL& url) {
85   scoped_refptr<content::AudioRendererHost> audio_host =
86       static_cast<content::RenderProcessHostImpl*>(
87           render_frame_host_->GetProcess())->audio_renderer_host();
88
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);
96   }
97 }
98
99 void BrowserMediaPlayerManager::OnDestroyPlayer(MediaPlayerID player_id) {
100   RemoveMurphyResource(player_id);
101 }
102
103 void BrowserMediaPlayerManager::OnPause(MediaPlayerID player_id) {
104   if (MurphyResource* resource = GetMurphyResource(player_id))
105     resource->ReleaseResource();
106 }
107
108 void BrowserMediaPlayerManager::OnStart(MediaPlayerID player_id) {
109   if (MurphyResource* resource = GetMurphyResource(player_id))
110     resource->AcquireResource();
111 }
112
113 void BrowserMediaPlayerManager::AddMurphyResource(
114     MurphyResource* resource) {
115   DCHECK(!GetMurphyResource(resource->player_id()));
116   murphy_resources_.push_back(resource);
117 }
118
119 void BrowserMediaPlayerManager::RemoveMurphyResource(
120     MediaPlayerID player_id) {
121   for (ScopedVector<MurphyResource>::iterator it =
122       murphy_resources_.begin(); it != murphy_resources_.end();
123       ++it) {
124     if ((*it)->player_id() == player_id) {
125       murphy_resources_.erase(it);
126       break;
127     }
128   }
129 }
130
131 }  // namespace tizen