| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CONTENT_BROWSER_GAMEPAD_GAMEPAD_PROVIDER_H_ |
| #define CONTENT_BROWSER_GAMEPAD_GAMEPAD_PROVIDER_H_ |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/message_loop_proxy.h" |
| #include "base/shared_memory.h" |
| #include "base/synchronization/lock.h" |
| #include "base/system_monitor/system_monitor.h" |
| #include "content/common/content_export.h" |
| |
| namespace base { |
| class Thread; |
| } |
| |
| namespace content { |
| |
| class GamepadDataFetcher; |
| struct GamepadHardwareBuffer; |
| |
| class CONTENT_EXPORT GamepadProvider : |
| public base::RefCountedThreadSafe<GamepadProvider>, |
| public base::SystemMonitor::DevicesChangedObserver { |
| public: |
| explicit GamepadProvider(GamepadDataFetcher* fetcher); |
| |
| base::SharedMemoryHandle GetRendererSharedMemoryHandle( |
| base::ProcessHandle renderer_process); |
| |
| // Pause and resume the background polling thread. Can be called from any |
| // thread. |
| void Pause(); |
| void Resume(); |
| |
| // base::SystemMonitor::DevicesChangedObserver implementation. |
| virtual void OnDevicesChanged() OVERRIDE; |
| |
| private: |
| friend class base::RefCountedThreadSafe<GamepadProvider>; |
| |
| virtual ~GamepadProvider(); |
| |
| // Method for starting the polling, runs on polling_thread_. |
| void DoInitializePollingThread(); |
| |
| // Method for polling a GamepadDataFetcher. Runs on the polling_thread_. |
| void DoPoll(); |
| void ScheduleDoPoll(); |
| |
| GamepadHardwareBuffer* SharedMemoryAsHardwareBuffer(); |
| |
| enum { kDesiredSamplingIntervalMs = 16 }; |
| |
| // Keeps track of when the background thread is paused. Access to is_paused_ |
| // must be guarded by is_paused_lock_. |
| base::Lock is_paused_lock_; |
| bool is_paused_; |
| |
| // Updated based on notification from SystemMonitor when the system devices |
| // have been updated, and this notification is passed on to the data fetcher |
| // to enable it to avoid redundant (and possibly expensive) is-connected |
| // tests. Access to devices_changed_ must be guarded by |
| // devices_changed_lock_. |
| base::Lock devices_changed_lock_; |
| bool devices_changed_; |
| |
| // The Message Loop on which this object was created. |
| // Typically the I/O loop, but may be something else during testing. |
| scoped_ptr<GamepadDataFetcher> provided_fetcher_; |
| |
| // When polling_thread_ is running, members below are only to be used |
| // from that thread. |
| scoped_ptr<GamepadDataFetcher> data_fetcher_; |
| base::SharedMemory gamepad_shared_memory_; |
| |
| // Polling is done on this background thread. |
| scoped_ptr<base::Thread> polling_thread_; |
| |
| static GamepadProvider* instance_; |
| base::WeakPtrFactory<GamepadProvider> weak_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(GamepadProvider); |
| }; |
| |
| } // namespace content |
| |
| #endif // CONTENT_BROWSER_GAMEPAD_GAMEPAD_PROVIDER_H_ |