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

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: modified to use InitSharedMemoryBuffer() to compile on win Created 7 years, 4 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
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..e39b8b08c3439905c7e8390fa7f74495104de48c 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,45 @@ class DataFetcherImplWin::SensorEventSink : public ISensorEvents,
return E_INVALIDARG;
PROPVARIANT value = {};
- scoped_refptr<Orientation> orientation = new Orientation();
+ double alpha = 0;
+ bool hasAlpha = false;
bulach 2013/09/02 13:29:34 nit: has"_a"lpha (ditto for _b and _g below)
timvolodine 2013/09/03 17:14:51 Done.
+ double beta = 0;
+ bool hasBeta = false;
+ double gamma = 0;
+ bool hasGamma = 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;
+ hasBeta = 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;
+ hasGamma = true;
}
PropVariantClear(&value);
if (SUCCEEDED(new_data->GetSensorValue(
SENSOR_DATA_TYPE_TILT_Z_DEGREES, &value))) {
- orientation->set_alpha(value.fltVal);
+ alpha = value.fltVal;
+ hasAlpha = true;
}
PropVariantClear(&value);
- orientation->set_absolute(true);
- fetcher_->OnOrientationData(orientation.get());
+ buffer_->seqlock.WriteBegin();
+ buffer_->data.alpha = alpha;
+ buffer_->data.hasAlpha = hasAlpha;
+ buffer_->data.beta = beta;
+ buffer_->data.hasBeta = hasBeta;
+ buffer_->data.gamma = gamma;
+ buffer_->data.hasGamma = hasGamma;
+ buffer_->data.absolute = true;
+ buffer_->data.hasAbsolute = hasAlpha || hasBeta || hasGamma;
+ buffer_->data.allAvailableSensorsAreActive = true;
+ buffer_->seqlock.WriteEnd();
return S_OK;
}
@@ -96,56 +111,34 @@ 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;
+DataFetcherSharedMemory::DataFetcherSharedMemory() {
}
-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;
-}
-
-const DeviceData* DataFetcherImplWin::GetDeviceData(DeviceData::Type type) {
- if (type != DeviceData::kTypeOrientation)
- return NULL;
- return GetOrientation();
-}
-
-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();
+DataFetcherSharedMemory::~DataFetcherSharedMemory() {
}
-bool DataFetcherImplWin::Initialize() {
+bool DataFetcherSharedMemory::Start(ConsumerType consumer_type) {
if (base::win::GetVersion() < base::win::VERSION_WIN7)
return false;
+ if (consumer_type != CONSUMER_TYPE_ORIENTATION)
+ return false;
+
+ // TODO(timvolodine): replace 3 lines below with:
+ // orientation_buffer_ = static_cast<DeviceOrientationHardwareBuffer*>(
+ // GetSharedMemoryBuffer(consumer_type));
+ // DCHECK(orientation_buffer_);
+ // once https://codereview.chromium.org/23684005/ lands.
+ orientation_buffer_ = static_cast<DeviceOrientationHardwareBuffer*>(
+ InitSharedMemoryBuffer(consumer_type,
+ sizeof(DeviceOrientationHardwareBuffer)));
+
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
+

Powered by Google App Engine
This is Rietveld 408576698