Loading media/libheadtracking/Android.bp +1 −2 Original line number Diff line number Diff line Loading @@ -38,9 +38,9 @@ cc_library { ], shared_libs: [ "libheadtracking", "libandroid", "liblog", "libsensor", "libutils", ], export_shared_lib_headers: [ "libheadtracking", Loading @@ -53,7 +53,6 @@ cc_binary { "SensorPoseProvider-example.cpp", ], shared_libs: [ "libandroid", "libheadtracking", "libheadtracking-binding", "libsensor", Loading media/libheadtracking/SensorPoseProvider-example.cpp +12 −11 Original line number Diff line number Diff line Loading @@ -22,12 +22,19 @@ #include <utils/SystemClock.h> #include <media/SensorPoseProvider.h> #include <sensor/Sensor.h> #include <sensor/SensorManager.h> using android::elapsedRealtimeNano; using android::Sensor; using android::SensorManager; using android::String16; using android::media::Pose3f; using android::media::SensorPoseProvider; using android::media::Twist3f; using namespace std::chrono_literals; const char kPackageName[] = "SensorPoseProvider-example"; class Listener : public SensorPoseProvider::Listener { Loading @@ -51,24 +58,18 @@ class Listener : public SensorPoseProvider::Listener { }; int main() { ASensorManager* sensor_manager = ASensorManager_getInstanceForPackage(kPackageName); if (!sensor_manager) { std::cerr << "Failed to get a sensor manager" << std::endl; return 1; } SensorManager& sensorManager = SensorManager::getInstanceForPackage(String16(kPackageName)); const ASensor* headSensor = ASensorManager_getDefaultSensor(sensor_manager, SENSOR_TYPE_GAME_ROTATION_VECTOR); const ASensor* screenSensor = ASensorManager_getDefaultSensor(sensor_manager, SENSOR_TYPE_ROTATION_VECTOR); const Sensor* headSensor = sensorManager.getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR); const Sensor* screenSensor = sensorManager.getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR); Listener listener; std::unique_ptr<SensorPoseProvider> provider = SensorPoseProvider::create(kPackageName, &listener); int32_t headHandle = provider->startSensor(headSensor, std::chrono::milliseconds(500)); int32_t headHandle = provider->startSensor(headSensor->getHandle(), 500ms); sleep(2); provider->startSensor(screenSensor, std::chrono::milliseconds(500)); provider->startSensor(screenSensor->getHandle(), 500ms); sleep(2); provider->stopSensor(headHandle); sleep(2); Loading media/libheadtracking/SensorPoseProvider.cpp +52 −43 Original line number Diff line number Diff line Loading @@ -24,8 +24,11 @@ #include <map> #include <thread> #include <android/looper.h> #include <log/log_main.h> #include <sensor/Sensor.h> #include <sensor/SensorEventQueue.h> #include <sensor/SensorManager.h> #include <utils/Looper.h> #include "QuaternionUtil.h" Loading @@ -33,31 +36,42 @@ namespace android { namespace media { namespace { // Identifier to use for our event queue on the loop. // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; static inline Looper* ALooper_to_Looper(ALooper* alooper) { return reinterpret_cast<Looper*>(alooper); } static inline ALooper* Looper_to_ALooper(Looper* looper) { return reinterpret_cast<ALooper*>(looper); } /** * RAII-wrapper around ASensorEventQueue, which destroys it on destruction. * RAII-wrapper around SensorEventQueue, which unregisters it on destruction. */ class EventQueueGuard { public: EventQueueGuard(ASensorManager* manager, ASensorEventQueue* queue) : mManager(manager), mQueue(queue) {} EventQueueGuard(const sp<SensorEventQueue>& queue, Looper* looper) : mQueue(queue) { mQueue->looper = Looper_to_ALooper(looper); mQueue->requestAdditionalInfo = false; looper->addFd(mQueue->getFd(), kIdent, ALOOPER_EVENT_INPUT, nullptr, nullptr); } ~EventQueueGuard() { if (mQueue) { int ret = ASensorManager_destroyEventQueue(mManager, mQueue); if (ret) { ALOGE("Failed to destroy event queue: %s\n", strerror(ret)); } ALooper_to_Looper(mQueue->looper)->removeFd(mQueue->getFd()); } } EventQueueGuard(const EventQueueGuard&) = delete; EventQueueGuard& operator=(const EventQueueGuard&) = delete; [[nodiscard]] ASensorEventQueue* get() const { return mQueue; } [[nodiscard]] SensorEventQueue* get() const { return mQueue.get(); } private: ASensorManager* const mManager; ASensorEventQueue* mQueue; sp<SensorEventQueue> mQueue; }; /** Loading @@ -65,12 +79,12 @@ class EventQueueGuard { */ class SensorEnableGuard { public: SensorEnableGuard(ASensorEventQueue* queue, const ASensor* sensor) SensorEnableGuard(const sp<SensorEventQueue>& queue, int32_t sensor) : mQueue(queue), mSensor(sensor) {} ~SensorEnableGuard() { if (mSensor) { int ret = ASensorEventQueue_disableSensor(mQueue, mSensor); if (mSensor != SensorPoseProvider::INVALID_HANDLE) { int ret = mQueue->disableSensor(mSensor); if (ret) { ALOGE("Failed to disable sensor: %s\n", strerror(ret)); } Loading @@ -82,12 +96,12 @@ class SensorEnableGuard { // Enable moving. SensorEnableGuard(SensorEnableGuard&& other) : mQueue(other.mQueue), mSensor(other.mSensor) { other.mSensor = nullptr; other.mSensor = SensorPoseProvider::INVALID_HANDLE; } private: ASensorEventQueue* const mQueue; const ASensor* mSensor; sp<SensorEventQueue> const mQueue; int32_t mSensor; }; /** Loading @@ -104,32 +118,30 @@ class SensorPoseProviderImpl : public SensorPoseProvider { ~SensorPoseProviderImpl() override { // Disable all active sensors. mEnabledSensors.clear(); ALooper_wake(mLooper); mLooper->wake(); mThread.join(); } int32_t startSensor(const ASensor* sensor, std::chrono::microseconds samplingPeriod) override { int32_t handle = ASensor_getHandle(sensor); bool startSensor(int32_t sensor, std::chrono::microseconds samplingPeriod) override { // Enable the sensor. if (ASensorEventQueue_registerSensor(mQueue, sensor, samplingPeriod.count(), 0)) { if (mQueue->enableSensor(sensor, samplingPeriod.count(), 0, 0)) { ALOGE("Failed to enable sensor"); return INVALID_HANDLE; return false; } mEnabledSensors.emplace(handle, SensorEnableGuard(mQueue, sensor)); return handle; mEnabledSensors.emplace(sensor, SensorEnableGuard(mQueue.get(), sensor)); return true; } void stopSensor(int handle) override { mEnabledSensors.erase(handle); } private: ALooper* mLooper; sp<Looper> mLooper; Listener* const mListener; std::thread mThread; std::map<int32_t, SensorEnableGuard> mEnabledSensors; ASensorEventQueue* mQueue; sp<SensorEventQueue> mQueue; // We must do some of the initialization operations on the worker thread, because the API relies // on the thread-local looper. In addition, as a matter of convenience, we store some of the Loading @@ -149,21 +161,13 @@ class SensorPoseProviderImpl : public SensorPoseProvider { void threadFunc(const char* packageName) { // Obtain looper. mLooper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; mLooper = Looper::prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); // Obtain sensor manager. ASensorManager* sensor_manager = ASensorManager_getInstanceForPackage(packageName); if (!sensor_manager) { ALOGE("Failed to get a sensor manager"); initFinished(false); return; } SensorManager& sensorManager = SensorManager::getInstanceForPackage(String16(packageName)); // Create event queue. mQueue = ASensorManager_createEventQueue(sensor_manager, mLooper, kIdent, nullptr, nullptr); mQueue = sensorManager.createEventQueue(); if (mQueue == nullptr) { ALOGE("Failed to create a sensor event queue"); Loading @@ -171,12 +175,12 @@ class SensorPoseProviderImpl : public SensorPoseProvider { return; } EventQueueGuard eventQueueGuard(sensor_manager, mQueue); EventQueueGuard eventQueueGuard(mQueue, mLooper.get()); initFinished(true); while (true) { int ret = ALooper_pollOnce(-1 /* no timeout */, nullptr, nullptr, nullptr); int ret = mLooper->pollOnce(-1 /* no timeout */, nullptr, nullptr, nullptr); switch (ret) { case ALOOPER_POLL_WAKE: Loading @@ -188,14 +192,19 @@ class SensorPoseProviderImpl : public SensorPoseProvider { break; default: ALOGE("Unexpected status out of ALooper_pollOnce: %d", ret); ALOGE("Unexpected status out of Looper::pollOnce: %d", ret); } // Process an event. ASensorEvent event; ssize_t size = ASensorEventQueue_getEvents(mQueue, &event, 1); ssize_t actual = mQueue->read(&event, 1); if (actual > 0) { mQueue->sendAck(&event, actual); } ssize_t size = mQueue->filterEvents(&event, actual); if (size < 0 || size > 1) { ALOGE("Unexpected return value from ASensorEventQueue_getEvents: %zd", size); ALOGE("Unexpected return value from SensorEventQueue::filterEvents: %zd", size); break; } if (size == 0) { Loading media/libheadtracking/include/media/SensorPoseProvider.h +3 −6 Original line number Diff line number Diff line Loading @@ -81,17 +81,14 @@ class SensorPoseProvider { * @param sensor The sensor to subscribe to. * @param samplingPeriod Sampling interval, in microseconds. Actual rate might be slightly * different. * @return The sensor handle, which can be later used for stopSensor(). INVALID_HANDLE would be * returned in case of error. This is guaranteed to be the same handle as the one returned by * ASensor_getHandle(sensor). * @return true iff succeeded. */ virtual int32_t startSensor(const ASensor* sensor, std::chrono::microseconds samplingPeriod) = 0; virtual bool startSensor(int32_t sensor, std::chrono::microseconds samplingPeriod) = 0; /** * Stop a sensor, previously started with startSensor(). It is not required to stop all sensors * before deleting the SensorPoseProvider instance. * @param handle The sensor handle, as returned from startSensor(). * @param handle The sensor handle, as provided to startSensor(). */ virtual void stopSensor(int32_t handle) = 0; }; Loading services/audiopolicy/service/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ cc_library_shared { shared_libs: [ "libactivitymanager_aidl", "libandroid", "libaudioclient", "libaudioclient_aidl_conversion", "libaudiofoundation", Loading Loading
media/libheadtracking/Android.bp +1 −2 Original line number Diff line number Diff line Loading @@ -38,9 +38,9 @@ cc_library { ], shared_libs: [ "libheadtracking", "libandroid", "liblog", "libsensor", "libutils", ], export_shared_lib_headers: [ "libheadtracking", Loading @@ -53,7 +53,6 @@ cc_binary { "SensorPoseProvider-example.cpp", ], shared_libs: [ "libandroid", "libheadtracking", "libheadtracking-binding", "libsensor", Loading
media/libheadtracking/SensorPoseProvider-example.cpp +12 −11 Original line number Diff line number Diff line Loading @@ -22,12 +22,19 @@ #include <utils/SystemClock.h> #include <media/SensorPoseProvider.h> #include <sensor/Sensor.h> #include <sensor/SensorManager.h> using android::elapsedRealtimeNano; using android::Sensor; using android::SensorManager; using android::String16; using android::media::Pose3f; using android::media::SensorPoseProvider; using android::media::Twist3f; using namespace std::chrono_literals; const char kPackageName[] = "SensorPoseProvider-example"; class Listener : public SensorPoseProvider::Listener { Loading @@ -51,24 +58,18 @@ class Listener : public SensorPoseProvider::Listener { }; int main() { ASensorManager* sensor_manager = ASensorManager_getInstanceForPackage(kPackageName); if (!sensor_manager) { std::cerr << "Failed to get a sensor manager" << std::endl; return 1; } SensorManager& sensorManager = SensorManager::getInstanceForPackage(String16(kPackageName)); const ASensor* headSensor = ASensorManager_getDefaultSensor(sensor_manager, SENSOR_TYPE_GAME_ROTATION_VECTOR); const ASensor* screenSensor = ASensorManager_getDefaultSensor(sensor_manager, SENSOR_TYPE_ROTATION_VECTOR); const Sensor* headSensor = sensorManager.getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR); const Sensor* screenSensor = sensorManager.getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR); Listener listener; std::unique_ptr<SensorPoseProvider> provider = SensorPoseProvider::create(kPackageName, &listener); int32_t headHandle = provider->startSensor(headSensor, std::chrono::milliseconds(500)); int32_t headHandle = provider->startSensor(headSensor->getHandle(), 500ms); sleep(2); provider->startSensor(screenSensor, std::chrono::milliseconds(500)); provider->startSensor(screenSensor->getHandle(), 500ms); sleep(2); provider->stopSensor(headHandle); sleep(2); Loading
media/libheadtracking/SensorPoseProvider.cpp +52 −43 Original line number Diff line number Diff line Loading @@ -24,8 +24,11 @@ #include <map> #include <thread> #include <android/looper.h> #include <log/log_main.h> #include <sensor/Sensor.h> #include <sensor/SensorEventQueue.h> #include <sensor/SensorManager.h> #include <utils/Looper.h> #include "QuaternionUtil.h" Loading @@ -33,31 +36,42 @@ namespace android { namespace media { namespace { // Identifier to use for our event queue on the loop. // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; static inline Looper* ALooper_to_Looper(ALooper* alooper) { return reinterpret_cast<Looper*>(alooper); } static inline ALooper* Looper_to_ALooper(Looper* looper) { return reinterpret_cast<ALooper*>(looper); } /** * RAII-wrapper around ASensorEventQueue, which destroys it on destruction. * RAII-wrapper around SensorEventQueue, which unregisters it on destruction. */ class EventQueueGuard { public: EventQueueGuard(ASensorManager* manager, ASensorEventQueue* queue) : mManager(manager), mQueue(queue) {} EventQueueGuard(const sp<SensorEventQueue>& queue, Looper* looper) : mQueue(queue) { mQueue->looper = Looper_to_ALooper(looper); mQueue->requestAdditionalInfo = false; looper->addFd(mQueue->getFd(), kIdent, ALOOPER_EVENT_INPUT, nullptr, nullptr); } ~EventQueueGuard() { if (mQueue) { int ret = ASensorManager_destroyEventQueue(mManager, mQueue); if (ret) { ALOGE("Failed to destroy event queue: %s\n", strerror(ret)); } ALooper_to_Looper(mQueue->looper)->removeFd(mQueue->getFd()); } } EventQueueGuard(const EventQueueGuard&) = delete; EventQueueGuard& operator=(const EventQueueGuard&) = delete; [[nodiscard]] ASensorEventQueue* get() const { return mQueue; } [[nodiscard]] SensorEventQueue* get() const { return mQueue.get(); } private: ASensorManager* const mManager; ASensorEventQueue* mQueue; sp<SensorEventQueue> mQueue; }; /** Loading @@ -65,12 +79,12 @@ class EventQueueGuard { */ class SensorEnableGuard { public: SensorEnableGuard(ASensorEventQueue* queue, const ASensor* sensor) SensorEnableGuard(const sp<SensorEventQueue>& queue, int32_t sensor) : mQueue(queue), mSensor(sensor) {} ~SensorEnableGuard() { if (mSensor) { int ret = ASensorEventQueue_disableSensor(mQueue, mSensor); if (mSensor != SensorPoseProvider::INVALID_HANDLE) { int ret = mQueue->disableSensor(mSensor); if (ret) { ALOGE("Failed to disable sensor: %s\n", strerror(ret)); } Loading @@ -82,12 +96,12 @@ class SensorEnableGuard { // Enable moving. SensorEnableGuard(SensorEnableGuard&& other) : mQueue(other.mQueue), mSensor(other.mSensor) { other.mSensor = nullptr; other.mSensor = SensorPoseProvider::INVALID_HANDLE; } private: ASensorEventQueue* const mQueue; const ASensor* mSensor; sp<SensorEventQueue> const mQueue; int32_t mSensor; }; /** Loading @@ -104,32 +118,30 @@ class SensorPoseProviderImpl : public SensorPoseProvider { ~SensorPoseProviderImpl() override { // Disable all active sensors. mEnabledSensors.clear(); ALooper_wake(mLooper); mLooper->wake(); mThread.join(); } int32_t startSensor(const ASensor* sensor, std::chrono::microseconds samplingPeriod) override { int32_t handle = ASensor_getHandle(sensor); bool startSensor(int32_t sensor, std::chrono::microseconds samplingPeriod) override { // Enable the sensor. if (ASensorEventQueue_registerSensor(mQueue, sensor, samplingPeriod.count(), 0)) { if (mQueue->enableSensor(sensor, samplingPeriod.count(), 0, 0)) { ALOGE("Failed to enable sensor"); return INVALID_HANDLE; return false; } mEnabledSensors.emplace(handle, SensorEnableGuard(mQueue, sensor)); return handle; mEnabledSensors.emplace(sensor, SensorEnableGuard(mQueue.get(), sensor)); return true; } void stopSensor(int handle) override { mEnabledSensors.erase(handle); } private: ALooper* mLooper; sp<Looper> mLooper; Listener* const mListener; std::thread mThread; std::map<int32_t, SensorEnableGuard> mEnabledSensors; ASensorEventQueue* mQueue; sp<SensorEventQueue> mQueue; // We must do some of the initialization operations on the worker thread, because the API relies // on the thread-local looper. In addition, as a matter of convenience, we store some of the Loading @@ -149,21 +161,13 @@ class SensorPoseProviderImpl : public SensorPoseProvider { void threadFunc(const char* packageName) { // Obtain looper. mLooper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; mLooper = Looper::prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); // Obtain sensor manager. ASensorManager* sensor_manager = ASensorManager_getInstanceForPackage(packageName); if (!sensor_manager) { ALOGE("Failed to get a sensor manager"); initFinished(false); return; } SensorManager& sensorManager = SensorManager::getInstanceForPackage(String16(packageName)); // Create event queue. mQueue = ASensorManager_createEventQueue(sensor_manager, mLooper, kIdent, nullptr, nullptr); mQueue = sensorManager.createEventQueue(); if (mQueue == nullptr) { ALOGE("Failed to create a sensor event queue"); Loading @@ -171,12 +175,12 @@ class SensorPoseProviderImpl : public SensorPoseProvider { return; } EventQueueGuard eventQueueGuard(sensor_manager, mQueue); EventQueueGuard eventQueueGuard(mQueue, mLooper.get()); initFinished(true); while (true) { int ret = ALooper_pollOnce(-1 /* no timeout */, nullptr, nullptr, nullptr); int ret = mLooper->pollOnce(-1 /* no timeout */, nullptr, nullptr, nullptr); switch (ret) { case ALOOPER_POLL_WAKE: Loading @@ -188,14 +192,19 @@ class SensorPoseProviderImpl : public SensorPoseProvider { break; default: ALOGE("Unexpected status out of ALooper_pollOnce: %d", ret); ALOGE("Unexpected status out of Looper::pollOnce: %d", ret); } // Process an event. ASensorEvent event; ssize_t size = ASensorEventQueue_getEvents(mQueue, &event, 1); ssize_t actual = mQueue->read(&event, 1); if (actual > 0) { mQueue->sendAck(&event, actual); } ssize_t size = mQueue->filterEvents(&event, actual); if (size < 0 || size > 1) { ALOGE("Unexpected return value from ASensorEventQueue_getEvents: %zd", size); ALOGE("Unexpected return value from SensorEventQueue::filterEvents: %zd", size); break; } if (size == 0) { Loading
media/libheadtracking/include/media/SensorPoseProvider.h +3 −6 Original line number Diff line number Diff line Loading @@ -81,17 +81,14 @@ class SensorPoseProvider { * @param sensor The sensor to subscribe to. * @param samplingPeriod Sampling interval, in microseconds. Actual rate might be slightly * different. * @return The sensor handle, which can be later used for stopSensor(). INVALID_HANDLE would be * returned in case of error. This is guaranteed to be the same handle as the one returned by * ASensor_getHandle(sensor). * @return true iff succeeded. */ virtual int32_t startSensor(const ASensor* sensor, std::chrono::microseconds samplingPeriod) = 0; virtual bool startSensor(int32_t sensor, std::chrono::microseconds samplingPeriod) = 0; /** * Stop a sensor, previously started with startSensor(). It is not required to stop all sensors * before deleting the SensorPoseProvider instance. * @param handle The sensor handle, as returned from startSensor(). * @param handle The sensor handle, as provided to startSensor(). */ virtual void stopSensor(int32_t handle) = 0; }; Loading
services/audiopolicy/service/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -26,7 +26,6 @@ cc_library_shared { shared_libs: [ "libactivitymanager_aidl", "libandroid", "libaudioclient", "libaudioclient_aidl_conversion", "libaudiofoundation", Loading