1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #ifndef LOG_TAG
16 #define LOG_TAG "HeadTracker"
17 #endif
18
19 #include "audio_head_tracker.h"
20 #include "audio_effect_log.h"
21 #include "audio_errors.h"
22
23 namespace OHOS {
24 namespace AudioStandard {
25 #ifdef SENSOR_ENABLE
26 HeadPostureData HeadTracker::headPostureData_ = {1, 1.0, 0.0, 0.0, 0.0};
27 std::mutex HeadTracker::headTrackerMutex_;
28
29 const uint32_t ORDER_ONE = 1;
30 const uint32_t HP_DATA_PRINT_COUNT_DEBUG = 20; // Print 3 times per second
31 const uint32_t HP_DATA_PRINT_COUNT_INFO = 300; // Print once per 5 seconds
32
HeadPostureDataProcCb(SensorEvent * event)33 void HeadTracker::HeadPostureDataProcCb(SensorEvent *event)
34 {
35 std::lock_guard<std::mutex> lock(headTrackerMutex_);
36
37 if (event == nullptr) {
38 AUDIO_ERR_LOG("Audio HeadTracker Sensor event is nullptr!");
39 return;
40 }
41
42 if (event[0].data == nullptr) {
43 AUDIO_ERR_LOG("Audio HeadTracker Sensor event[0].data is nullptr!");
44 return;
45 }
46
47 if (event[0].dataLen < sizeof(HeadPostureData)) {
48 AUDIO_ERR_LOG("Event dataLen less than head posture data size, event.dataLen:%{public}u", event[0].dataLen);
49 return;
50 }
51 HeadPostureData *headPostureDataTmp = reinterpret_cast<HeadPostureData *>(event[0].data);
52 headPostureData_.order = headPostureDataTmp->order;
53 headPostureData_.w = headPostureDataTmp->w;
54 headPostureData_.x = headPostureDataTmp->x;
55 headPostureData_.y = headPostureDataTmp->y;
56 headPostureData_.z = headPostureDataTmp->z;
57 if (headPostureData_.order % HP_DATA_PRINT_COUNT_DEBUG == ORDER_ONE) {
58 AUDIO_DEBUG_LOG("[DEBUG] Head posture data of order %{public}d received, w: %{public}f, x: %{public}f, "
59 "y: %{public}f, z: %{public}f", headPostureData_.order, headPostureDataTmp->w, headPostureDataTmp->x,
60 headPostureDataTmp->y, headPostureDataTmp->z);
61 }
62 if (headPostureData_.order % HP_DATA_PRINT_COUNT_INFO == ORDER_ONE) {
63 AUDIO_INFO_LOG("Head posture data of order %{public}d received, w: %{public}f, x: %{public}f, "
64 "y: %{public}f, z: %{public}f", headPostureData_.order, headPostureDataTmp->w, headPostureDataTmp->x,
65 headPostureDataTmp->y, headPostureDataTmp->z);
66 }
67 }
68
HeadTracker()69 HeadTracker::HeadTracker()
70 {
71 AUDIO_INFO_LOG("HeadTracker created!");
72 }
73
~HeadTracker()74 HeadTracker::~HeadTracker()
75 {
76 AUDIO_INFO_LOG("HeadTracker destroyed!");
77 }
78
SensorInit()79 int32_t HeadTracker::SensorInit()
80 {
81 sensorUser_.callback = HeadPostureDataProcCb;
82 return SubscribeSensor(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_);
83 }
84
SensorSetConfig(int32_t spatializerEngineState)85 int32_t HeadTracker::SensorSetConfig(int32_t spatializerEngineState)
86 {
87 int32_t ret;
88 switch (spatializerEngineState) {
89 case NONE_SPATIALIZER_ENGINE:
90 AUDIO_ERR_LOG("system has no spatializer engine!");
91 ret = ERROR;
92 break;
93 case ARM_SPATIALIZER_ENGINE:
94 AUDIO_INFO_LOG("system uses arm spatializer engine!");
95 ret = SetBatch(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_,
96 sensorSamplingInterval_, sensorSamplingInterval_);
97 break;
98 case DSP_SPATIALIZER_ENGINE:
99 AUDIO_INFO_LOG("system uses dsp spatializer engine!");
100 ret = SetBatch(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_,
101 sensorSamplingInterval_, sensorSamplingInterval_ * 2); // 2 * sampling for DSP
102 break;
103 default:
104 AUDIO_ERR_LOG("spatializerEngineState error!");
105 ret = ERROR;
106 break;
107 }
108 return ret;
109 }
110
SensorActive()111 int32_t HeadTracker::SensorActive()
112 {
113 return ActivateSensor(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_);
114 }
115
SensorDeactive()116 int32_t HeadTracker::SensorDeactive()
117 {
118 return DeactivateSensor(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_);
119 }
120
SensorUnsubscribe()121 int32_t HeadTracker::SensorUnsubscribe()
122 {
123 return UnsubscribeSensor(SENSOR_TYPE_ID_HEADPOSTURE, &sensorUser_);
124 }
125
GetHeadPostureData()126 HeadPostureData HeadTracker::GetHeadPostureData()
127 {
128 std::lock_guard<std::mutex> lock(headTrackerMutex_);
129 return headPostureData_;
130 }
131
SetHeadPostureData(HeadPostureData headPostureData)132 void HeadTracker::SetHeadPostureData(HeadPostureData headPostureData)
133 {
134 std::lock_guard<std::mutex> lock(headTrackerMutex_);
135 headPostureData_ = headPostureData;
136 }
137 #endif
138 } // namespace AudioStandard
139 } // namespace OHOS