• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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