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

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

Issue 8568029: Add gamepad hardware data fetcher, and higher level thread container (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: swap search path order for platformsdk/directx Created 9 years, 1 month 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
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <cmath>
6 #include <set>
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/logging.h"
11 #include "base/message_loop.h"
12 #include "base/task.h"
13 #include "base/threading/thread.h"
14 #include "base/threading/thread_restrictions.h"
15 #include "content/public/browser/browser_thread.h"
16 #include "content/browser/gamepad/gamepad_provider.h"
17 #include "content/browser/gamepad/data_fetcher.h"
18 #include "content/common/gamepad_messages.h"
19
20 #if defined(OS_WIN)
21 #include "content/browser/gamepad/data_fetcher_win.h"
22 #endif
23
24 namespace gamepad {
25
26 Provider* Provider::instance_ = NULL;
27
28 using namespace content;
29
30 // Define the default data fetcher that Provider will use if none is supplied.
31 // (PlatformDataFetcher).
32 #if defined(OS_WIN)
33
34 typedef DataFetcherWindows PlatformDataFetcher;
35
36 #else
37
38 class EmptyDataFetcher : public DataFetcher {
39 public:
40 void GetGamepadData(WebKit::WebGamepads* pads, bool) {
41 pads->length = 0;
42 }
43 };
44 typedef EmptyDataFetcher PlatformDataFetcher;
45
46 #endif
47
48 Provider::Provider(DataFetcher* fetcher)
49 : creator_loop_(MessageLoop::current()->message_loop_proxy()),
50 provided_fetcher_(fetcher),
51 devices_changed_(true),
52 ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
53 size_t data_size = sizeof(GamepadHardwareBuffer);
54 base::SystemMonitor* monitor = base::SystemMonitor::Get();
55 if (monitor)
56 monitor->AddDevicesChangedObserver(this);
57 gamepad_shared_memory_.CreateAndMapAnonymous(data_size);
58 GamepadHardwareBuffer* hwbuf = SharedMemoryAsHardwareBuffer();
59 memset(hwbuf, 0, sizeof(GamepadHardwareBuffer));
60 }
61
62 Provider::~Provider() {
63 base::SystemMonitor* monitor = base::SystemMonitor::Get();
64 if (monitor)
65 monitor->RemoveDevicesChangedObserver(this);
66 Stop();
67 }
68
69 base::SharedMemoryHandle Provider::GetRendererSharedMemoryHandle(
70 base::ProcessHandle process) {
71 base::SharedMemoryHandle renderer_handle;
72 gamepad_shared_memory_.ShareToProcess(process, &renderer_handle);
73 return renderer_handle;
74 }
75
76 void Provider::OnDevicesChanged() {
77 devices_changed_ = true;
78 }
79
80 void Provider::Start() {
81 DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_);
82
83 if (polling_thread_.get())
84 return;
85
86 polling_thread_.reset(new base::Thread("Gamepad polling thread"));
87 if (!polling_thread_->Start()) {
88 LOG(ERROR) << "Failed to start gamepad polling thread";
89 polling_thread_.reset();
90 return;
91 }
92
93 MessageLoop* polling_loop = polling_thread_->message_loop();
94 polling_loop->PostTask(
95 FROM_HERE,
96 base::Bind(&Provider::DoInitializePollingThread, this));
97 }
98
99 void Provider::Stop() {
100 DCHECK(MessageLoop::current()->message_loop_proxy() == creator_loop_);
101
102 polling_thread_.reset();
103 data_fetcher_.reset();
104 }
105
106 void Provider::DoInitializePollingThread() {
107 DCHECK(MessageLoop::current() == polling_thread_->message_loop());
108
109 if (!provided_fetcher_.get())
110 provided_fetcher_.reset(new PlatformDataFetcher);
111
112 // Pass ownership of fetcher to provider_.
113 data_fetcher_.swap(provided_fetcher_);
114
115 // Start polling.
116 ScheduleDoPoll();
117 }
118
119 void Provider::DoPoll() {
120 DCHECK(MessageLoop::current() == polling_thread_->message_loop());
121 GamepadHardwareBuffer* hwbuf = SharedMemoryAsHardwareBuffer();
122 base::subtle::Barrier_AtomicIncrement(&hwbuf->start_marker, 1);
123 data_fetcher_->GetGamepadData(&hwbuf->buffer, devices_changed_);
124 base::subtle::Barrier_AtomicIncrement(&hwbuf->end_marker, 1);
125 devices_changed_ = false;
126 // Schedule our next interval of polling.
127 ScheduleDoPoll();
128 }
129
130 void Provider::ScheduleDoPoll() {
131 DCHECK(MessageLoop::current() == polling_thread_->message_loop());
132
133 MessageLoop::current()->PostDelayedTask(
134 FROM_HERE,
135 base::Bind(&Provider::DoPoll, weak_factory_.GetWeakPtr()),
136 kDesiredSamplingIntervalMs);
137 }
138
139 GamepadHardwareBuffer* Provider::SharedMemoryAsHardwareBuffer() {
140 void* mem = gamepad_shared_memory_.memory();
141 DCHECK(mem);
142 return static_cast<GamepadHardwareBuffer*>(mem);
143 }
144
145 } // namespace gamepad
OLDNEW
« no previous file with comments | « content/browser/gamepad/gamepad_provider.h ('k') | content/browser/gamepad/gamepad_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698