1 /*
2 * Copyright (c) 2025 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
16 #include "cj_audio_haptic_manager.h"
17
18 #include "audio_haptic_log.h"
19 #include "cj_audio_haptic_player.h"
20
21 namespace {
22 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN_AUDIO_NAPI, "CJAudioHapticManager"};
23 }
24
25 namespace OHOS {
26 namespace Media {
27
CjAudioHapticManager()28 CjAudioHapticManager::CjAudioHapticManager()
29 : audioHapticMgrClient_(AudioHapticManagerFactory::CreateAudioHapticManager()) {}
30
31 CjAudioHapticManager::~CjAudioHapticManager() = default;
32
RegisterSource(const char * audioUri,const char * hapticUri,int32_t & resId)33 int32_t CjAudioHapticManager::RegisterSource(const char* audioUri, const char* hapticUri, int32_t& resId)
34 {
35 if (!audioUri || !hapticUri) {
36 return ERR_INVALID_ARG;
37 }
38 resId = audioHapticMgrClient_->RegisterSource(audioUri, hapticUri);
39 return SUCCESS;
40 }
41
UnregisterSource(int32_t id)42 int32_t CjAudioHapticManager::UnregisterSource(int32_t id)
43 {
44 return audioHapticMgrClient_->UnregisterSource(id);
45 }
46
SetAudioLatencyMode(int32_t id,int32_t latencyMode)47 int32_t CjAudioHapticManager::SetAudioLatencyMode(int32_t id, int32_t latencyMode)
48 {
49 if (!IsLegalAudioLatencyMode(latencyMode)) {
50 MEDIA_LOGE("SetAudioLatencyMode: the value of latencyMode is invalid");
51 return ERR_INVALID_ARG;
52 }
53
54 int32_t ret = audioHapticMgrClient_->SetAudioLatencyMode(id, static_cast<AudioLatencyMode>(latencyMode));
55 if (ret != SUCCESS) {
56 MEDIA_LOGE("SetAudioLatencyMode: Failed to set audio latency mode");
57 return ERR_OPERATE_NOT_ALLOWED;
58 }
59 return ret;
60 }
61
IsLegalAudioLatencyMode(int32_t latencyMode)62 bool CjAudioHapticManager::IsLegalAudioLatencyMode(int32_t latencyMode)
63 {
64 switch (latencyMode) {
65 case AUDIO_LATENCY_MODE_NORMAL:
66 case AUDIO_LATENCY_MODE_FAST:
67 return true;
68 default:
69 break;
70 }
71 MEDIA_LOGE("IsLegalAudioLatencyMode: latencyMode %{public}d is invalid", latencyMode);
72 return false;
73 }
74
SetStreamUsage(int32_t id,int32_t streamUsage)75 int32_t CjAudioHapticManager::SetStreamUsage(int32_t id, int32_t streamUsage)
76 {
77 if (!IsLegalAudioStreamUsage (streamUsage)) {
78 MEDIA_LOGE("SetStreamUsage: the value of streamUsage is invalid");
79 return ERR_INVALID_ARG;
80 }
81 int32_t ret = audioHapticMgrClient_->SetStreamUsage(id, static_cast<AudioStandard::StreamUsage>(streamUsage));
82 if (ret != SUCCESS) {
83 MEDIA_LOGE("SetStreamUsage: Failed to set audio stream usage");
84 return ERR_OPERATE_NOT_ALLOWED;
85 }
86 return ret;
87 }
88
IsLegalAudioStreamUsage(int32_t streamUsage)89 bool CjAudioHapticManager::IsLegalAudioStreamUsage(int32_t streamUsage)
90 {
91 switch (streamUsage) {
92 case AudioStandard::STREAM_USAGE_MUSIC:
93 case AudioStandard::STREAM_USAGE_VOICE_COMMUNICATION:
94 case AudioStandard::STREAM_USAGE_VOICE_ASSISTANT:
95 case AudioStandard::STREAM_USAGE_ALARM:
96 case AudioStandard::STREAM_USAGE_VOICE_MESSAGE:
97 case AudioStandard::STREAM_USAGE_RINGTONE:
98 case AudioStandard::STREAM_USAGE_NOTIFICATION:
99 case AudioStandard::STREAM_USAGE_ACCESSIBILITY:
100 case AudioStandard::STREAM_USAGE_SYSTEM:
101 case AudioStandard::STREAM_USAGE_MOVIE:
102 case AudioStandard::STREAM_USAGE_GAME:
103 case AudioStandard::STREAM_USAGE_AUDIOBOOK:
104 case AudioStandard::STREAM_USAGE_NAVIGATION:
105 case AudioStandard::STREAM_USAGE_DTMF:
106 case AudioStandard::STREAM_USAGE_ENFORCED_TONE:
107 return true;
108 default:
109 break;
110 }
111 MEDIA_LOGE("IsLegalAudioStreamUsage: streamUsage %{public}d is invalid", streamUsage);
112 return false;
113 }
114
CreatePlayer(int32_t id,bool muteAudio,bool muteHaptics,int32_t & errCode)115 int64_t CjAudioHapticManager::CreatePlayer(int32_t id, bool muteAudio, bool muteHaptics, int32_t &errCode)
116 {
117 std::shared_ptr<AudioHapticPlayer> audioHapticPlayer =
118 audioHapticMgrClient_->CreatePlayer(id, AudioHapticPlayerOptions {muteAudio, muteHaptics});
119 if (audioHapticPlayer != nullptr) {
120 int32_t result = audioHapticPlayer->Prepare();
121 if (result == MSERR_OK) {
122 errCode = SUCCESS;
123 auto instance = FFIData::Create<CjAudioHapticPlayer>(audioHapticPlayer);
124 return instance == nullptr ? INVALID_OBJ : instance->GetID();
125 }
126 // Fail to prepare the audio haptic player. Throw err.
127 if (result == MSERR_OPEN_FILE_FAILED) {
128 errCode = ERR_IO_ERROR;
129 } else if (result == MSERR_UNSUPPORT_FILE) {
130 errCode = ERR_UNSUPPORTED_FORMAT;
131 } else {
132 errCode = ERR_OPERATE_NOT_ALLOWED;
133 }
134 } else {
135 errCode = ERR_OPERATE_NOT_ALLOWED;
136 }
137 return INVALID_OBJ;
138 }
139 } // OHOS
140 } // Media