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

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

Issue 200873002: Gamepad API: add support for connection events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 9 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() {
17 } 19 }
18 20
19 GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher) 21 GamepadService::GamepadService(scoped_ptr<GamepadDataFetcher> fetcher)
20 : num_readers_(0), 22 : provider_(new GamepadProvider(fetcher.Pass())) {
21 provider_(new GamepadProvider(fetcher.Pass())) {
22 thread_checker_.DetachFromThread(); 23 thread_checker_.DetachFromThread();
23 } 24 }
24 25
25 GamepadService::~GamepadService() { 26 GamepadService::~GamepadService() {
26 } 27 }
27 28
28 GamepadService* GamepadService::GetInstance() { 29 GamepadService* GamepadService::GetInstance() {
29 return Singleton<GamepadService, 30 return Singleton<GamepadService,
30 LeakySingletonTraits<GamepadService> >::get(); 31 LeakySingletonTraits<GamepadService> >::get();
31 } 32 }
32 33
33 void GamepadService::AddConsumer() { 34 void GamepadService::AddConsumer(GamepadConsumer* consumer) {
34 DCHECK(thread_checker_.CalledOnValidThread()); 35 DCHECK(thread_checker_.CalledOnValidThread());
35 36
36 num_readers_++; 37 DCHECK(consumers_.count(ConsumerInfo(consumer)) == 0);
37 DCHECK(num_readers_ > 0); 38 consumers_.insert(ConsumerInfo(consumer));
38 if (!provider_) 39 if (!provider_)
39 provider_.reset(new GamepadProvider); 40 provider_.reset(new GamepadProvider);
41 provider_->RegisterForUserGesture(
42 base::Bind(&GamepadService::OnUserGesture,
43 base::Unretained(this)));
40 provider_->Resume(); 44 provider_->Resume();
41 } 45 }
42 46
43 void GamepadService::RemoveConsumer() { 47 void GamepadService::OnUserGesture() {
44 DCHECK(thread_checker_.CalledOnValidThread()); 48 DCHECK(thread_checker_.CalledOnValidThread());
45 49
46 --num_readers_; 50 if (!provider_)
47 DCHECK(num_readers_ >= 0); 51 return;
48 52
49 if (num_readers_ == 0) 53 for (ConsumerSet::iterator it = consumers_.begin();
54 it != consumers_.end(); ++it) {
55 if (!it->did_observe_user_gesture) {
56 ConsumerInfo& info = const_cast<ConsumerInfo&>(*it);
57 info.did_observe_user_gesture = true;
58 blink::WebGamepads gamepads;
59 provider_->GetCurrentGamepadData(&gamepads);
60 for (unsigned i = 0; i < blink::WebGamepads::itemsLengthCap; ++i) {
61 const blink::WebGamepad& pad = gamepads.items[i];
62 if (pad.connected)
63 info.consumer->OnGamepadConnected(i, pad);
64 }
65 }
66 }
67 }
68
69 void GamepadService::RemoveConsumer(GamepadConsumer* consumer) {
70 DCHECK(thread_checker_.CalledOnValidThread());
71
72 DCHECK(consumers_.count(ConsumerInfo(consumer)) > 0);
73 consumers_.erase(ConsumerInfo(consumer));
74 if (consumers_.size() == 0)
50 provider_->Pause(); 75 provider_->Pause();
51 } 76 }
52 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)
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)
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
69 } // namespace content 118 } // 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