Upstream version 9.38.204.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/public/browser/render_frame_host.h"
9 #include "content/public/browser/web_contents.h"
10 #include "xwalk/tizen/common/media/media_player_messages.h"
11
12 namespace tizen {
13
14 BrowserMediaPlayerManager::BrowserMediaPlayerManager(
15     content::RenderFrameHost* render_frame_host,
16     MurphyResourceManager* resource_manager)
17     : render_frame_host_(render_frame_host),
18       resource_manager_(resource_manager) {
19 }
20
21 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {}
22
23 BrowserMediaPlayerManager* BrowserMediaPlayerManager::Create(
24     content::RenderFrameHost* render_frame_host,
25     MurphyResourceManager* resource_manager) {
26   return new BrowserMediaPlayerManager(render_frame_host, resource_manager);
27 }
28
29 MurphyResource* BrowserMediaPlayerManager::GetMurphyResource(
30     MediaPlayerID player_id) {
31   for (ScopedVector<MurphyResource>::iterator it =
32       murphy_resources_.begin(); it != murphy_resources_.end();
33       ++it) {
34     if ((*it)->player_id() == player_id)
35       return *it;
36   }
37
38   return NULL;
39 }
40
41 int BrowserMediaPlayerManager::RoutingID() {
42   return render_frame_host_->GetRoutingID();
43 }
44
45 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) {
46   return render_frame_host_->Send(msg);
47 }
48
49 void BrowserMediaPlayerManager::ResourceNotifyCallback(
50     mrp_res_resource_state_t state,
51     MediaPlayerID player_id) {
52
53   MurphyResource* resource = GetMurphyResource(player_id);
54
55   mrp_res_resource_state_t prev_state = resource->GetResourceState();
56
57   // Received a resource event from Murphy
58   switch (state) {
59     case MRP_RES_RESOURCE_AVAILABLE:
60       if (prev_state == MRP_RES_RESOURCE_ACQUIRED)
61         Send(new MediaPlayerMsg_MediaPlayerPause(RoutingID(), player_id));
62     case MRP_RES_RESOURCE_LOST:
63       if (prev_state == MRP_RES_RESOURCE_ACQUIRED ||
64           prev_state == MRP_RES_RESOURCE_LOST)
65         Send(new MediaPlayerMsg_MediaPlayerPause(RoutingID(), player_id));
66       break;
67     case MRP_RES_RESOURCE_ACQUIRED:
68       if (prev_state == MRP_RES_RESOURCE_LOST)
69         Send(new MediaPlayerMsg_MediaPlayerPlay(RoutingID(), player_id));
70       break;
71     case MRP_RES_RESOURCE_PENDING:
72       break;
73     default:
74       NOTREACHED();
75       break;
76     }
77 }
78
79 void BrowserMediaPlayerManager::OnInitialize(
80     MediaPlayerID player_id,
81     int process_id,
82     const GURL& url) {
83   // Create murphy resource for the given player id.
84   if (resource_manager_ && resource_manager_->IsConnected()) {
85     MurphyResource* resource = new MurphyResource(this,
86         player_id, resource_manager_);
87     RemoveMurphyResource(player_id);
88     AddMurphyResource(resource);
89   }
90 }
91
92 void BrowserMediaPlayerManager::OnDestroyPlayer(MediaPlayerID player_id) {
93   RemoveMurphyResource(player_id);
94 }
95
96 void BrowserMediaPlayerManager::OnPause(MediaPlayerID player_id) {
97   if (MurphyResource* resource = GetMurphyResource(player_id))
98     resource->ReleaseResource();
99 }
100
101 void BrowserMediaPlayerManager::OnStart(MediaPlayerID player_id) {
102   if (MurphyResource* resource = GetMurphyResource(player_id))
103     resource->AcquireResource();
104 }
105
106 void BrowserMediaPlayerManager::AddMurphyResource(
107     MurphyResource* resource) {
108   DCHECK(!GetMurphyResource(resource->player_id()));
109   murphy_resources_.push_back(resource);
110 }
111
112 void BrowserMediaPlayerManager::RemoveMurphyResource(
113     MediaPlayerID player_id) {
114   for (ScopedVector<MurphyResource>::iterator it =
115       murphy_resources_.begin(); it != murphy_resources_.end();
116       ++it) {
117     if ((*it)->player_id() == player_id) {
118       murphy_resources_.erase(it);
119       break;
120     }
121   }
122 }
123
124 }  // namespace tizen