1 /*
2 * Copyright (c) 2024 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 "AudioSessionManager"
17 #endif
18
19 #include "audio_session_manager.h"
20
21 #include "audio_errors.h"
22 #include "audio_service_log.h"
23 #include "audio_policy_manager.h"
24
25 namespace OHOS {
26 namespace AudioStandard {
27 using namespace std;
GetInstance()28 AudioSessionManager *AudioSessionManager::GetInstance()
29 {
30 static AudioSessionManager audioSessionManager;
31 return &audioSessionManager;
32 }
33
ActivateAudioSession(const AudioSessionStrategy & strategy)34 int32_t AudioSessionManager::ActivateAudioSession(const AudioSessionStrategy &strategy)
35 {
36 AUDIO_INFO_LOG("Activate audio session with strategy: %{public}d", static_cast<int32_t>(strategy.concurrencyMode));
37 int32_t ret = AudioPolicyManager::GetInstance().ActivateAudioSession(strategy);
38 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "ActivateAudioSession failed, ret:%{public}d", ret);
39
40 std::lock_guard<std::mutex> lock(setDefaultOutputDeviceMutex_);
41 if (setDefaultOutputDevice_) {
42 AUDIO_INFO_LOG("need retain SetDefaultOutputDevice");
43 AudioPolicyManager::GetInstance().SetDefaultOutputDevice(setDeviceType_);
44 }
45
46 RegisterAudioPolicyServerDiedCb();
47 restoreParame_.RecordAudioSessionOpt(AudioSessionRestoreParame::OperationType::AUDIO_SESSION_ACTIVATE,
48 static_cast<int32_t>(strategy.concurrencyMode));
49 return ret;
50 }
51
DeactivateAudioSession()52 int32_t AudioSessionManager::DeactivateAudioSession()
53 {
54 AUDIO_INFO_LOG("in");
55 int32_t ret = AudioPolicyManager::GetInstance().DeactivateAudioSession();
56 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "DeactivateAudioSession failed, ret:%{public}d", ret);
57
58 restoreParame_.OnAudioSessionDeactive();
59 return ret;
60 }
61
IsAudioSessionActivated()62 bool AudioSessionManager::IsAudioSessionActivated()
63 {
64 AUDIO_INFO_LOG("in");
65 return AudioPolicyManager::GetInstance().IsAudioSessionActivated();
66 }
67
SetAudioSessionCallback(const std::shared_ptr<AudioSessionCallback> & audioSessionCallback)68 int32_t AudioSessionManager::SetAudioSessionCallback(const std::shared_ptr<AudioSessionCallback> &audioSessionCallback)
69 {
70 AUDIO_INFO_LOG("in");
71 CHECK_AND_RETURN_RET_LOG(audioSessionCallback != nullptr, ERR_INVALID_PARAM, "audioSessionCallback is null");
72
73 int32_t result = AudioPolicyManager::GetInstance().SetAudioSessionCallback(audioSessionCallback);
74 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
75 "SetAudioSessionCallback result:%{public}d", result);
76 return result;
77 }
78
UnsetAudioSessionCallback()79 int32_t AudioSessionManager::UnsetAudioSessionCallback()
80 {
81 AUDIO_INFO_LOG("Unset all audio session callbacks");
82 int32_t result = AudioPolicyManager::GetInstance().UnsetAudioSessionCallback();
83 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
84 "UnsetAudioSessionCallback(all) result:%{public}d", result);
85 return result;
86 }
87
UnsetAudioSessionCallback(const std::shared_ptr<AudioSessionCallback> & audioSessionCallback)88 int32_t AudioSessionManager::UnsetAudioSessionCallback(
89 const std::shared_ptr<AudioSessionCallback> &audioSessionCallback)
90 {
91 AUDIO_INFO_LOG("Unset one audio session callback");
92 CHECK_AND_RETURN_RET_LOG(audioSessionCallback != nullptr, ERR_INVALID_PARAM, "audioSessionCallback is null");
93
94 int32_t result = AudioPolicyManager::GetInstance().UnsetAudioSessionCallback(audioSessionCallback);
95 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
96 "UnsetAudioSessionCallback result:%{public}d", result);
97 return result;
98 }
99
SetAudioSessionScene(const AudioSessionScene audioSessionScene)100 int32_t AudioSessionManager::SetAudioSessionScene(const AudioSessionScene audioSessionScene)
101 {
102 AUDIO_INFO_LOG("Set audio session scene: %{public}d", static_cast<int32_t>(audioSessionScene));
103
104 int32_t result = AudioPolicyManager::GetInstance().SetAudioSessionScene(audioSessionScene);
105 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, "SetAudioSessionScene failed, result:%{public}d", result);
106
107 RegisterAudioPolicyServerDiedCb();
108 restoreParame_.RecordAudioSessionOpt(AudioSessionRestoreParame::OperationType::AUDIO_SESSION_SET_SCENE,
109 static_cast<int32_t>(audioSessionScene));
110 return result;
111 }
112
SetAudioSessionStateChangeCallback(const std::shared_ptr<AudioSessionStateChangedCallback> & stateChangedCallback)113 int32_t AudioSessionManager::SetAudioSessionStateChangeCallback(
114 const std::shared_ptr<AudioSessionStateChangedCallback> &stateChangedCallback)
115 {
116 AUDIO_INFO_LOG("in");
117 CHECK_AND_RETURN_RET_LOG(stateChangedCallback != nullptr, ERR_INVALID_PARAM, "stateChangedCallback is null");
118
119 int32_t result = AudioPolicyManager::GetInstance().SetAudioSessionStateChangeCallback(stateChangedCallback);
120 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
121 "SetAudioSessionStateChangeCallback result:%{public}d", result);
122 return result;
123 }
124
UnsetAudioSessionStateChangeCallback()125 int32_t AudioSessionManager::UnsetAudioSessionStateChangeCallback()
126 {
127 AUDIO_INFO_LOG("Unset all audio session state callbacks");
128 int32_t result = AudioPolicyManager::GetInstance().UnsetAudioSessionStateChangeCallback();
129 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
130 "UnsetAudioSessionStateChangeCallback(all) result:%{public}d", result);
131 return result;
132 }
133
UnsetAudioSessionStateChangeCallback(const std::shared_ptr<AudioSessionStateChangedCallback> & stateChangedCallback)134 int32_t AudioSessionManager::UnsetAudioSessionStateChangeCallback(
135 const std::shared_ptr<AudioSessionStateChangedCallback> &stateChangedCallback)
136 {
137 AUDIO_INFO_LOG("Unset one audio session state callback");
138 CHECK_AND_RETURN_RET_LOG(stateChangedCallback != nullptr, ERR_INVALID_PARAM, "stateChangedCallback is null");
139
140 int32_t result = AudioPolicyManager::GetInstance().UnsetAudioSessionStateChangeCallback(stateChangedCallback);
141 CHECK_AND_RETURN_RET_LOG(result == SUCCESS, ERR_OPERATION_FAILED,
142 "UnsetAudioSessionStateChangeCallback result:%{public}d", result);
143 return result;
144 }
145
GetDefaultOutputDevice(DeviceType & deviceType)146 int32_t AudioSessionManager::GetDefaultOutputDevice(DeviceType &deviceType)
147 {
148 AUDIO_INFO_LOG("GetDefaultOutputDevice");
149 return AudioPolicyManager::GetInstance().GetDefaultOutputDevice(deviceType);
150 }
151
SetDefaultOutputDevice(DeviceType deviceType)152 int32_t AudioSessionManager::SetDefaultOutputDevice(DeviceType deviceType)
153 {
154 AUDIO_INFO_LOG("SetDefaultOutputDevice with deviceType: %{public}d", static_cast<int32_t>(deviceType));
155 int32_t ret = AudioPolicyManager::GetInstance().SetDefaultOutputDevice(deviceType);
156 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetDefaultOutputDevice failed ret:%{public}d", ret);
157
158 AUDIO_INFO_LOG("SetDefaultOutputDevice successful.");
159 std::lock_guard<std::mutex> lock(setDefaultOutputDeviceMutex_);
160 setDefaultOutputDevice_ = true;
161 setDeviceType_ = deviceType;
162
163 RegisterAudioPolicyServerDiedCb();
164 return ret;
165 }
166
SetAudioSessionCurrentDeviceChangeCallback(const std::shared_ptr<AudioSessionCurrentDeviceChangedCallback> & deviceChangedCallback)167 int32_t AudioSessionManager::SetAudioSessionCurrentDeviceChangeCallback(
168 const std::shared_ptr<AudioSessionCurrentDeviceChangedCallback> &deviceChangedCallback)
169 {
170 AUDIO_INFO_LOG("in");
171 CHECK_AND_RETURN_RET_LOG(deviceChangedCallback != nullptr, ERR_INVALID_PARAM, "deviceChangedCallback is nullptr");
172
173 int32_t ret = AudioPolicyManager::GetInstance().SetAudioSessionCurrentDeviceChangeCallback(deviceChangedCallback);
174 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret,
175 "SetAudioSessionCurrentDeviceChangeCallback ret:%{public}d", ret);
176 return ret;
177 }
178
UnsetAudioSessionCurrentDeviceChangeCallback()179 int32_t AudioSessionManager::UnsetAudioSessionCurrentDeviceChangeCallback()
180 {
181 AUDIO_INFO_LOG("Unset all audio session device callbacks");
182 int32_t ret = AudioPolicyManager::GetInstance().UnsetAudioSessionCurrentDeviceChangeCallback();
183 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret,
184 "UnsetAudioSessionCurrentDeviceChangeCallback(all) ret:%{public}d", ret);
185 return ret;
186 }
187
UnsetAudioSessionCurrentDeviceChangeCallback(const std::shared_ptr<AudioSessionCurrentDeviceChangedCallback> & deviceChangedCallback)188 int32_t AudioSessionManager::UnsetAudioSessionCurrentDeviceChangeCallback(
189 const std::shared_ptr<AudioSessionCurrentDeviceChangedCallback> &deviceChangedCallback)
190 {
191 AUDIO_INFO_LOG("Unset one audio session device callback");
192 CHECK_AND_RETURN_RET_LOG(deviceChangedCallback != nullptr, ERR_INVALID_PARAM, "deviceChangedCallback is nullptr");
193
194 int32_t ret = AudioPolicyManager::GetInstance().UnsetAudioSessionCurrentDeviceChangeCallback(deviceChangedCallback);
195 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "UnsetAudioSessionCurrentDeviceChangeCallback ret:%{public}d", ret);
196 return ret;
197 }
198
RegisterAudioPolicyServerDiedCb()199 void AudioSessionManager::RegisterAudioPolicyServerDiedCb()
200 {
201 std::lock_guard<std::mutex> lock(sessionManagerRestoreMutex_);
202 CHECK_AND_RETURN(!policyServerDiedCbRegistered_);
203
204 sessionManagerRestoreCb_ = std::make_shared<AudioSessionManagerServiceDiedRestore>();
205 CHECK_AND_RETURN_LOG(sessionManagerRestoreCb_ != nullptr,
206 "get AudioSessionManagerServiceDiedRestore malloc failed.");
207
208 AudioPolicyManager::GetInstance().RegisterAudioPolicyServerDiedCb(sessionManagerRestoreCb_);
209
210 std::shared_ptr<AudioSessionManagerStateCallback> stateCallback =
211 std::make_shared<AudioSessionManagerStateCallback>();
212 CHECK_AND_RETURN_LOG(stateCallback != nullptr, "Failed to create AudioSessionState callback!");
213 SetAudioSessionStateChangeCallback(stateCallback);
214
215 std::shared_ptr<AudioSessionManagerDeactivedCallback> activeStateCallback =
216 std::make_shared<AudioSessionManagerDeactivedCallback>();
217 CHECK_AND_RETURN_LOG(activeStateCallback != nullptr, "Failed to create AudioSession actived callback!");
218 SetAudioSessionCallback(activeStateCallback);
219
220 policyServerDiedCbRegistered_ = true;
221 AUDIO_INFO_LOG("Audio session RegisterAudioPolicyServerDiedCb successed");
222 }
223
OnAudioSessionDeactive(const AudioSessionDeactiveEvent & deactiveEvent)224 void AudioSessionManager::OnAudioSessionDeactive(const AudioSessionDeactiveEvent &deactiveEvent)
225 {
226 restoreParame_.OnAudioSessionDeactive();
227 }
228
OnAudioSessionStateChanged(const AudioSessionStateChangedEvent & stateChangedEvent)229 void AudioSessionManager::OnAudioSessionStateChanged(const AudioSessionStateChangedEvent &stateChangedEvent)
230 {
231 restoreParame_.OnAudioSessionStateChanged(stateChangedEvent.stateChangeHint);
232 }
233
Restore()234 bool AudioSessionManager::Restore()
235 {
236 AUDIO_INFO_LOG("start restore audio session manager parame.");
237
238 // restore devicetype
239 {
240 std::lock_guard<std::mutex> lock(setDefaultOutputDeviceMutex_);
241 if (setDefaultOutputDevice_) {
242 AUDIO_INFO_LOG("restore need SetDefaultOutputDevice");
243 auto ret = AudioPolicyManager::GetInstance().SetDefaultOutputDevice(setDeviceType_);
244 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "SetDefaultOutputDevice failed, ret:%{public}d", ret);
245 }
246 }
247
248 // restore active and setscene
249 bool restoreResult = restoreParame_.RestoreParame();
250 AUDIO_INFO_LOG("end restore audio session manager parame.");
251
252 return restoreResult;
253 }
254
OnAudioPolicyServiceDied()255 void AudioSessionManagerServiceDiedRestore::OnAudioPolicyServiceDied()
256 {
257 int32_t tryCounter = 10;
258 uint32_t sleepTime = 300000;
259 bool restoreResult = false;
260 while (!restoreResult && tryCounter > 0) {
261 tryCounter--;
262 usleep(sleepTime);
263
264 auto sessionManager = AudioSessionManager::GetInstance();
265 CHECK_AND_RETURN_LOG(sessionManager != nullptr, "can not get audio sessionManager, session is nullptr.");
266
267 restoreResult = sessionManager->Restore();
268 }
269 }
270
OnAudioSessionDeactive(const AudioSessionDeactiveEvent & deactiveEvent)271 void AudioSessionManagerDeactivedCallback::OnAudioSessionDeactive(const AudioSessionDeactiveEvent &deactiveEvent)
272 {
273 auto sessionManager = AudioSessionManager::GetInstance();
274 CHECK_AND_RETURN_LOG(sessionManager != nullptr, "can not get audio sessionManager, session is nullptr.");
275
276 sessionManager->OnAudioSessionDeactive(deactiveEvent);
277 }
278
OnAudioSessionStateChanged(const AudioSessionStateChangedEvent & stateChangedEvent)279 void AudioSessionManagerStateCallback::OnAudioSessionStateChanged(
280 const AudioSessionStateChangedEvent &stateChangedEvent)
281 {
282 auto sessionManager = AudioSessionManager::GetInstance();
283 CHECK_AND_RETURN_LOG(sessionManager != nullptr, "can not get audio sessionManager, session is nullptr.");
284
285 sessionManager->OnAudioSessionStateChanged(stateChangedEvent);
286 }
287
OnAudioSessionDeactive()288 void AudioSessionRestoreParame::OnAudioSessionDeactive()
289 {
290 std::lock_guard<std::mutex> lock(actionsMutex_);
291 actions_.clear();
292 }
293
OnAudioSessionStateChanged(AudioSessionStateChangeHint stateChangeHint)294 void AudioSessionRestoreParame::OnAudioSessionStateChanged(AudioSessionStateChangeHint stateChangeHint)
295 {
296 if ((stateChangeHint == AudioSessionStateChangeHint::STOP) ||
297 (stateChangeHint == AudioSessionStateChangeHint::TIME_OUT_STOP) ||
298 (stateChangeHint == AudioSessionStateChangeHint::PAUSE)) {
299 std::lock_guard<std::mutex> lock(actionsMutex_);
300 actions_.clear();
301 }
302 }
303
RecordAudioSessionOpt(const OperationType type,const int32_t value)304 void AudioSessionRestoreParame::RecordAudioSessionOpt(const OperationType type, const int32_t value)
305 {
306 std::lock_guard<std::mutex> lock(actionsMutex_);
307 if (actions_.empty()) {
308 auto action = std::make_unique<AudioSessionAction>(type, value);
309 CHECK_AND_RETURN_LOG(action != nullptr, "get action failed, malloc failed.");
310 actions_.push_back(std::move(action));
311 return;
312 }
313
314 // Deduplication of continuous and repeated operations
315 if (actions_.back() != nullptr && actions_.back()->type == type) {
316 actions_.back()->optValue = value;
317 return;
318 }
319
320 // iscontinuously repeated operation record
321 auto action = std::make_unique<AudioSessionAction>(type, value);
322 CHECK_AND_RETURN_LOG(action != nullptr, "get action failed, malloc failed.");
323 actions_.push_back(std::move(action));
324
325 // The previous active operation needs to be deleted and the set scene operation needs to be deduplicated.
326 if (type == AudioSessionRestoreParame::OperationType::AUDIO_SESSION_ACTIVATE) {
327 for (auto it = actions_.begin(); it != std::prev(actions_.end());) {
328 CHECK_AND_CONTINUE(*it != nullptr);
329 if ((*it)->type == AudioSessionRestoreParame::OperationType::AUDIO_SESSION_ACTIVATE) {
330 it = actions_.erase(it);
331 } else {
332 ++it;
333 }
334 }
335
336 bool firstFound = false;
337 for (int idx = actions_.size() - 1; idx >= 0; idx--) {
338 CHECK_AND_CONTINUE(actions_[idx] != nullptr);
339 if (actions_[idx]->type != OperationType::AUDIO_SESSION_SET_SCENE) {
340 continue;
341 }
342
343 if (!firstFound) {
344 firstFound = true;
345 } else {
346 actions_.erase(actions_.begin() + idx);
347 }
348 }
349 }
350 }
351
RestoreParame()352 bool AudioSessionRestoreParame::RestoreParame()
353 {
354 int32_t ret;
355 std::lock_guard<std::mutex> lock(actionsMutex_);
356 for (auto it = actions_.begin(); it != actions_.end(); ++it) {
357 CHECK_AND_CONTINUE(*it != nullptr);
358
359 AUDIO_INFO_LOG("AudioSessionManager RestoreParame type = %{public}d, value = %{public}d.",
360 (*it)->type, (*it)->optValue);
361
362 if ((*it)->type == AudioSessionRestoreParame::OperationType::AUDIO_SESSION_ACTIVATE) {
363 AudioSessionStrategy strategy;
364 strategy.concurrencyMode = static_cast<AudioConcurrencyMode>((*it)->optValue);
365 ret = AudioPolicyManager::GetInstance().ActivateAudioSession(strategy);
366 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "Restore Activate parame failed, ret:%{public}d", ret);
367 }
368
369 if ((*it)->type == AudioSessionRestoreParame::OperationType::AUDIO_SESSION_SET_SCENE) {
370 AudioSessionScene audioSessionScene = static_cast<AudioSessionScene>((*it)->optValue);
371 ret = AudioPolicyManager::GetInstance().SetAudioSessionScene(audioSessionScene);
372 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, false, "Restore DeviceType parame failed, ret:%{public}d", ret);
373 }
374 }
375
376 return true;
377 }
378
379 } // namespace AudioStandard
380 } // namespace OHOS
381