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