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

Unified Diff: content/browser/device_orientation/data_fetcher_shared_memory_win.cc

Issue 22926032: Win: implement shared memory Device Orientation fetcher. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Aug-23-mac-fetcher
Patch Set: fix compile on win Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/device_orientation/data_fetcher_shared_memory.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/device_orientation/data_fetcher_shared_memory_win.cc
diff --git a/content/browser/device_orientation/data_fetcher_impl_win.cc b/content/browser/device_orientation/data_fetcher_shared_memory_win.cc
similarity index 59%
copy from content/browser/device_orientation/data_fetcher_impl_win.cc
copy to content/browser/device_orientation/data_fetcher_shared_memory_win.cc
index d08ed446ad623f4c8e577cc7fd97fdf01f14f559..24caf3fe159488e16bdf9239961758b59268e667 100644
--- a/content/browser/device_orientation/data_fetcher_impl_win.cc
+++ b/content/browser/device_orientation/data_fetcher_shared_memory_win.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Copyright 2013 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.
-#include "content/browser/device_orientation/data_fetcher_impl_win.h"
+#include "data_fetcher_shared_memory.h"
#include <InitGuid.h>
#include <PortableDeviceTypes.h>
@@ -11,22 +11,20 @@
#include "base/logging.h"
#include "base/win/iunknown_impl.h"
#include "base/win/windows_version.h"
-#include "content/browser/device_orientation/orientation.h"
namespace {
-// This should match ProviderImpl::kDesiredSamplingIntervalMs.
const int kPeriodInMilliseconds = 100;
} // namespace
namespace content {
-class DataFetcherImplWin::SensorEventSink : public ISensorEvents,
- public base::win::IUnknownImpl {
+class DataFetcherSharedMemory::SensorEventSink
+ : public ISensorEvents, public base::win::IUnknownImpl {
public:
- explicit SensorEventSink(DataFetcherImplWin* const fetcher)
- : fetcher_(fetcher) {}
+ explicit SensorEventSink(DeviceOrientationHardwareBuffer* buffer)
+ : buffer_(buffer) {}
virtual ~SensorEventSink() {}
@@ -61,28 +59,47 @@ class DataFetcherImplWin::SensorEventSink : public ISensorEvents,
return E_INVALIDARG;
PROPVARIANT value = {};
- scoped_refptr<Orientation> orientation = new Orientation();
+ double alpha = 0;
+ bool has_alpha = false;
+ double beta = 0;
+ bool has_beta = false;
+ double gamma = 0;
+ bool has_gamma = false;
if (SUCCEEDED(new_data->GetSensorValue(
- SENSOR_DATA_TYPE_TILT_X_DEGREES, &value))) {
- orientation->set_beta(value.fltVal);
+ SENSOR_DATA_TYPE_TILT_X_DEGREES, &value))) {
+ beta = value.fltVal;
+ has_beta = true;
}
PropVariantClear(&value);
if (SUCCEEDED(new_data->GetSensorValue(
- SENSOR_DATA_TYPE_TILT_Y_DEGREES, &value))) {
- orientation->set_gamma(value.fltVal);
+ SENSOR_DATA_TYPE_TILT_Y_DEGREES, &value))) {
+ gamma = value.fltVal;
+ has_gamma = true;
}
PropVariantClear(&value);
if (SUCCEEDED(new_data->GetSensorValue(
- SENSOR_DATA_TYPE_TILT_Z_DEGREES, &value))) {
- orientation->set_alpha(value.fltVal);
+ SENSOR_DATA_TYPE_TILT_Z_DEGREES, &value))) {
+ alpha = value.fltVal;
+ has_alpha = true;
}
PropVariantClear(&value);
- orientation->set_absolute(true);
- fetcher_->OnOrientationData(orientation.get());
+ if (buffer_) {
+ buffer_->seqlock.WriteBegin();
+ buffer_->data.alpha = alpha;
+ buffer_->data.hasAlpha = has_alpha;
+ buffer_->data.beta = beta;
+ buffer_->data.hasBeta = has_beta;
+ buffer_->data.gamma = gamma;
+ buffer_->data.hasGamma = has_gamma;
+ buffer_->data.absolute = true;
+ buffer_->data.hasAbsolute = has_alpha || has_beta || has_gamma;
+ buffer_->data.allAvailableSensorsAreActive = true;
+ buffer_->seqlock.WriteEnd();
+ }
return S_OK;
}
@@ -96,56 +113,32 @@ class DataFetcherImplWin::SensorEventSink : public ISensorEvents,
}
private:
- DataFetcherImplWin* const fetcher_;
+ DeviceOrientationHardwareBuffer* buffer_;
DISALLOW_COPY_AND_ASSIGN(SensorEventSink);
};
-// Create a DataFetcherImplWin object and return NULL if no valid sensor found.
-// static
-DataFetcher* DataFetcherImplWin::Create() {
- scoped_ptr<DataFetcherImplWin> fetcher(new DataFetcherImplWin);
- if (fetcher->Initialize())
- return fetcher.release();
-
- LOG(ERROR) << "DataFetcherImplWin::Initialize failed!";
- return NULL;
-}
-
-DataFetcherImplWin::~DataFetcherImplWin() {
- if (sensor_)
- sensor_->SetEventSink(NULL);
-}
-
-DataFetcherImplWin::DataFetcherImplWin() {
-}
-void DataFetcherImplWin::OnOrientationData(Orientation* orientation) {
- // This method is called on Windows sensor thread.
- base::AutoLock autolock(next_orientation_lock_);
- next_orientation_ = orientation;
+DataFetcherSharedMemory::DataFetcherSharedMemory()
+ : motion_buffer_(NULL),
+ orientation_buffer_(NULL) {
}
-const DeviceData* DataFetcherImplWin::GetDeviceData(DeviceData::Type type) {
- if (type != DeviceData::kTypeOrientation)
- return NULL;
- return GetOrientation();
+DataFetcherSharedMemory::~DataFetcherSharedMemory() {
}
-const Orientation* DataFetcherImplWin::GetOrientation() {
- if (next_orientation_.get()) {
- base::AutoLock autolock(next_orientation_lock_);
- next_orientation_.swap(current_orientation_);
- }
- if (!current_orientation_.get())
- return new Orientation();
- return current_orientation_.get();
-}
+bool DataFetcherSharedMemory::Start(ConsumerType consumer_type, void* buffer) {
+ DCHECK(buffer);
-bool DataFetcherImplWin::Initialize() {
if (base::win::GetVersion() < base::win::VERSION_WIN7)
return false;
+ if (consumer_type != CONSUMER_TYPE_ORIENTATION)
+ return false;
+
+ orientation_buffer_ = static_cast<DeviceOrientationHardwareBuffer*>(buffer);
+ DCHECK(orientation_buffer_);
+
base::win::ScopedComPtr<ISensorManager> sensor_manager;
HRESULT hr = sensor_manager.CreateInstance(CLSID_SensorManager);
if (FAILED(hr) || !sensor_manager)
@@ -170,13 +163,15 @@ bool DataFetcherImplWin::Initialize() {
base::win::ScopedComPtr<IPortableDeviceValues> device_values;
if (SUCCEEDED(device_values.CreateInstance(CLSID_PortableDeviceValues))) {
if (SUCCEEDED(device_values->SetUnsignedIntegerValue(
- SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, kPeriodInMilliseconds))) {
+ SENSOR_PROPERTY_CURRENT_REPORT_INTERVAL, kPeriodInMilliseconds))) {
base::win::ScopedComPtr<IPortableDeviceValues> return_values;
sensor_->SetProperties(device_values.get(), return_values.Receive());
}
}
- scoped_refptr<SensorEventSink> sensor_event_impl(new SensorEventSink(this));
+ scoped_refptr<SensorEventSink> sensor_event_impl(new SensorEventSink(
+ orientation_buffer_));
+
base::win::ScopedComPtr<ISensorEvents> sensor_events;
hr = sensor_event_impl->QueryInterface(
__uuidof(ISensorEvents), sensor_events.ReceiveVoid());
@@ -190,4 +185,23 @@ bool DataFetcherImplWin::Initialize() {
return true;
}
+bool DataFetcherSharedMemory::Stop(ConsumerType consumer_type) {
+ if (consumer_type != CONSUMER_TYPE_ORIENTATION)
+ return false;
+
+ if (sensor_)
+ sensor_->SetEventSink(NULL);
+
+ if (orientation_buffer_) {
+ orientation_buffer_->seqlock.WriteBegin();
+ orientation_buffer_->data.allAvailableSensorsAreActive = false;
+ orientation_buffer_->seqlock.WriteEnd();
+ orientation_buffer_ = NULL;
+ }
+
+ return true;
+}
+
+
} // namespace content
+
« no previous file with comments | « content/browser/device_orientation/data_fetcher_shared_memory.h ('k') | content/content_browser.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698