Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: content/browser/gamepad/gamepad_service.cc

Issue 195873019: Gamepad API: add support for connection events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: and a missing override Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/gamepad/gamepad_service.h" 5 #include "content/browser/gamepad/gamepad_service.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/singleton.h" 9 #include "base/memory/singleton.h"
10 #include "content/browser/gamepad/gamepad_consumer.h"
10 #include "content/browser/gamepad/gamepad_data_fetcher.h" 11 #include "content/browser/gamepad/gamepad_data_fetcher.h"
11 #include "content/browser/gamepad/gamepad_provider.h" 12 #include "content/browser/gamepad/gamepad_provider.h"
13 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_process_host.h" 14 #include "content/public/browser/render_process_host.h"
13 15
14 namespace content { 16 namespace content {
15 17
16 GamepadService::GamepadService() : num_readers_(0) { 18 GamepadService::GamepadService()
19 : num_active_consumers_(0),
20 gesture_callback_pending_(false) {
17 } 21 }
18 22
19 GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher) 23 GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher)
20 : num_readers_(0), 24 : provider_(new GamepadProvider(fetcher.Pass())),
21 provider_(new GamepadProvider(fetcher.Pass())) { 25 num_active_consumers_(0),
26 gesture_callback_pending_(false) {
22 thread_checker_.DetachFromThread(); 27 thread_checker_.DetachFromThread();
23 } 28 }
24 29
25 GamepadService::~GamepadService() { 30 GamepadService::~GamepadService() {
26 } 31 }
27 32
28 GamepadService* GamepadService::GetInstance() { 33 GamepadService* GamepadService::GetInstance() {
29 return Singleton<GamepadService, 34 return Singleton<GamepadService,
30 LeakySingletonTraits<GamepadService> >::get(); 35 LeakySingletonTraits<GamepadService> >::get();
31 } 36 }
32 37
33 void GamepadService::AddConsumer() { 38 void GamepadService::ConsumerBecameActive(GamepadConsumer* consumer) {
34 DCHECK(thread_checker_.CalledOnValidThread()); 39 DCHECK(thread_checker_.CalledOnValidThread());
35 40
36 num_readers_++;
37 DCHECK(num_readers_ > 0);
38 if (!provider_) 41 if (!provider_)
39 provider_.reset(new GamepadProvider); 42 provider_.reset(new GamepadProvider);
40 provider_->Resume(); 43
44 std::pair<ConsumerSet::iterator, bool> insert_result =
45 consumers_.insert(consumer);
46 insert_result.first->is_active = true;
47 if (!insert_result.first->did_observe_user_gesture &&
48 !gesture_callback_pending_) {
49 provider_->RegisterForUserGesture(
50 base::Bind(&GamepadService::OnUserGesture,
51 base::Unretained(this)));
52 }
53
54 if (num_active_consumers_++ == 0)
55 provider_->Resume();
41 } 56 }
42 57
43 void GamepadService::RemoveConsumer() { 58 void GamepadService::ConsumerBecameInactive(GamepadConsumer* consumer) {
44 DCHECK(thread_checker_.CalledOnValidThread()); 59 DCHECK(provider_);
60 DCHECK(num_active_consumers_ > 0);
61 DCHECK(consumers_.count(consumer) > 0);
62 DCHECK(consumers_.find(consumer)->is_active);
45 63
46 --num_readers_; 64 consumers_.find(consumer)->is_active = false;
47 DCHECK(num_readers_ >= 0); 65 if (--num_active_consumers_ == 0)
48
49 if (num_readers_ == 0)
50 provider_->Pause(); 66 provider_->Pause();
51 } 67 }
52 68
69 void GamepadService::RemoveConsumer(GamepadConsumer* consumer) {
70 DCHECK(thread_checker_.CalledOnValidThread());
71
72 ConsumerSet::iterator it = consumers_.find(consumer);
73 if (it->is_active && --num_active_consumers_ == 0)
74 provider_->Pause();
75 consumers_.erase(it);
76 }
77
53 void GamepadService::RegisterForUserGesture(const base::Closure& closure) { 78 void GamepadService::RegisterForUserGesture(const base::Closure& closure) {
54 DCHECK(num_readers_ > 0); 79 DCHECK(consumers_.size() > 0);
55 DCHECK(thread_checker_.CalledOnValidThread()); 80 DCHECK(thread_checker_.CalledOnValidThread());
56 provider_->RegisterForUserGesture(closure); 81 provider_->RegisterForUserGesture(closure);
57 } 82 }
58 83
59 void GamepadService::Terminate() { 84 void GamepadService::Terminate() {
60 provider_.reset(); 85 provider_.reset();
61 } 86 }
62 87
88 void GamepadService::OnGamepadConnected(
89 int index,
90 const blink::WebGamepad& pad) {
91 DCHECK(thread_checker_.CalledOnValidThread());
92
93 for (ConsumerSet::iterator it = consumers_.begin();
94 it != consumers_.end(); ++it) {
95 if (it->did_observe_user_gesture && it->is_active)
96 it->consumer->OnGamepadConnected(index, pad);
97 }
98 }
99
100 void GamepadService::OnGamepadDisconnected(
101 int index,
102 const blink::WebGamepad& pad) {
103 DCHECK(thread_checker_.CalledOnValidThread());
104
105 for (ConsumerSet::iterator it = consumers_.begin();
106 it != consumers_.end(); ++it) {
107 if (it->did_observe_user_gesture && it->is_active)
108 it->consumer->OnGamepadDisconnected(index, pad);
109 }
110 }
111
63 base::SharedMemoryHandle GamepadService::GetSharedMemoryHandleForProcess( 112 base::SharedMemoryHandle GamepadService::GetSharedMemoryHandleForProcess(
64 base::ProcessHandle handle) { 113 base::ProcessHandle handle) {
65 DCHECK(thread_checker_.CalledOnValidThread()); 114 DCHECK(thread_checker_.CalledOnValidThread());
66 return provider_->GetSharedMemoryHandleForProcess(handle); 115 return provider_->GetSharedMemoryHandleForProcess(handle);
67 } 116 }
68 117
118 void GamepadService::OnUserGesture() {
119 DCHECK(thread_checker_.CalledOnValidThread());
120
121 gesture_callback_pending_ = false;
122
123 if (!provider_ ||
124 num_active_consumers_ == 0)
125 return;
126
127 for (ConsumerSet::iterator it = consumers_.begin();
128 it != consumers_.end(); ++it) {
129 if (!it->did_observe_user_gesture && it->is_active) {
130 const ConsumerInfo& info = *it;
131 info.did_observe_user_gesture = true;
132 blink::WebGamepads gamepads;
133 provider_->GetCurrentGamepadData(&gamepads);
134 for (unsigned i = 0; i < blink::WebGamepads::itemsLengthCap; ++i) {
135 const blink::WebGamepad& pad = gamepads.items[i];
136 if (pad.connected)
137 info.consumer->OnGamepadConnected(i, pad);
138 }
139 }
140 }
141 }
142
69 } // namespace content 143 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gamepad/gamepad_service.h ('k') | content/browser/renderer_host/gamepad_browser_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698