1 /*
2  * Copyright (c) 2021-2022 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 "AudioStreamManager"
17 #endif
18 
19 #include "audio_stream_manager.h"
20 
21 #include "audio_errors.h"
22 #include "audio_common_log.h"
23 #include "audio_policy_manager.h"
24 #include "audio_utils.h"
25 #include "i_audio_stream.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 using namespace std;
GetInstance()30 AudioStreamManager *AudioStreamManager::GetInstance()
31 {
32     static AudioStreamManager audioStreamManager;
33     return &audioStreamManager;
34 }
35 
RegisterAudioRendererEventListener(const int32_t clientPid,const std::shared_ptr<AudioRendererStateChangeCallback> & callback)36 int32_t AudioStreamManager::RegisterAudioRendererEventListener(const int32_t clientPid,
37     const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
38 {
39     AUDIO_INFO_LOG("client id: %{public}d", clientPid);
40     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
41 
42     std::lock_guard<std::mutex> lock(rendererStateChangeCallbacksMutex_);
43     int32_t ret = AudioPolicyManager::GetInstance().RegisterAudioRendererEventListener(callback);
44     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "ret: %{public}d", ret);
45 
46     rendererStateChangeCallbacks_.push_back(callback);
47     return ret;
48 }
49 
UnregisterAudioRendererEventListener(const int32_t clientPid)50 int32_t AudioStreamManager::UnregisterAudioRendererEventListener(const int32_t clientPid)
51 {
52     AUDIO_INFO_LOG("client id: %{public}d", clientPid);
53 
54     std::lock_guard<std::mutex> lock(rendererStateChangeCallbacksMutex_);
55     int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioRendererEventListener(
56         rendererStateChangeCallbacks_);
57     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "ret: %{public}d", ret);
58 
59     rendererStateChangeCallbacks_.clear();
60     return ret;
61 }
62 
RegisterAudioRendererEventListener(const std::shared_ptr<AudioRendererStateChangeCallback> & callback)63 int32_t AudioStreamManager::RegisterAudioRendererEventListener(
64     const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
65 {
66     AUDIO_INFO_LOG("in");
67     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
68 
69     int32_t ret = AudioPolicyManager::GetInstance().RegisterAudioRendererEventListener(callback);
70     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "ret: %{public}d", ret);
71 
72     return ret;
73 }
74 
UnregisterAudioRendererEventListener(const std::shared_ptr<AudioRendererStateChangeCallback> & callback)75 int32_t AudioStreamManager::UnregisterAudioRendererEventListener(
76     const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
77 {
78     AUDIO_INFO_LOG("in");
79 
80     int32_t ret = AudioPolicyManager::GetInstance().UnregisterAudioRendererEventListener(callback);
81     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "ret: %{public}d", ret);
82 
83     return ret;
84 }
85 
RegisterAudioCapturerEventListener(const int32_t clientPid,const std::shared_ptr<AudioCapturerStateChangeCallback> & callback)86 int32_t AudioStreamManager::RegisterAudioCapturerEventListener(const int32_t clientPid,
87     const std::shared_ptr<AudioCapturerStateChangeCallback> &callback)
88 {
89     AUDIO_INFO_LOG("client id: %{public}d", clientPid);
90     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
91     return AudioPolicyManager::GetInstance().RegisterAudioCapturerEventListener(clientPid, callback);
92 }
93 
UnregisterAudioCapturerEventListener(const int32_t clientPid)94 int32_t AudioStreamManager::UnregisterAudioCapturerEventListener(const int32_t clientPid)
95 {
96     AUDIO_INFO_LOG("client id: %{public}d", clientPid);
97     return AudioPolicyManager::GetInstance().UnregisterAudioCapturerEventListener(clientPid);
98 }
99 
GetCurrentRendererChangeInfos(vector<unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)100 int32_t AudioStreamManager::GetCurrentRendererChangeInfos(
101     vector<unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
102 {
103     AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos");
104     return AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
105 }
106 
GetCurrentCapturerChangeInfos(vector<unique_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)107 int32_t AudioStreamManager::GetCurrentCapturerChangeInfos(
108     vector<unique_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
109 {
110     AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos");
111     return AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
112 }
113 
IsAudioRendererLowLatencySupported(const AudioStreamInfo & audioStreamInfo)114 bool AudioStreamManager::IsAudioRendererLowLatencySupported(const AudioStreamInfo &audioStreamInfo)
115 {
116     AUDIO_DEBUG_LOG("IsAudioRendererLowLatencySupported");
117     return AudioPolicyManager::GetInstance().IsAudioRendererLowLatencySupported(audioStreamInfo);
118 }
119 
UpdateEffectInfoArray(SupportedEffectConfig & supportedEffectConfig,int32_t i,AudioSceneEffectInfo & audioSceneEffectInfo)120 static void UpdateEffectInfoArray(SupportedEffectConfig &supportedEffectConfig,
121     int32_t i, AudioSceneEffectInfo &audioSceneEffectInfo)
122 {
123     uint32_t j;
124     AudioEffectMode audioEffectMode;
125     for (j = 0; j < supportedEffectConfig.postProcessNew.stream[i].streamEffectMode.size(); j++) {
126         audioEffectMode = effectModeMap.at(supportedEffectConfig.postProcessNew.stream[i].streamEffectMode[j].mode);
127         audioSceneEffectInfo.mode.push_back(audioEffectMode);
128     }
129     auto index = std::find(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end(), 0);
130     if (index == audioSceneEffectInfo.mode.end()) {
131         audioEffectMode = effectModeMap.at("EFFECT_NONE");
132         audioSceneEffectInfo.mode.push_back(audioEffectMode);
133     }
134     index = std::find(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end(), 1);
135     if (index == audioSceneEffectInfo.mode.end()) {
136         audioEffectMode = effectModeMap.at("EFFECT_DEFAULT");
137         audioSceneEffectInfo.mode.push_back(audioEffectMode);
138     }
139     std::sort(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end());
140 }
141 
GetEffectInfoArray(AudioSceneEffectInfo & audioSceneEffectInfo,StreamUsage streamUsage)142 int32_t AudioStreamManager::GetEffectInfoArray(AudioSceneEffectInfo &audioSceneEffectInfo, StreamUsage streamUsage)
143 {
144     std::string effectScene = IAudioStream::GetEffectSceneName(streamUsage);
145     SupportedEffectConfig supportedEffectConfig;
146     int32_t ret = AudioPolicyManager::GetInstance().QueryEffectSceneMode(supportedEffectConfig);
147     uint32_t streamNum = supportedEffectConfig.postProcessNew.stream.size();
148     if (streamNum >= 0) {
149         int32_t sceneFlag = 0;
150         for (uint32_t i = 0; i < streamNum; i++) {
151             if (effectScene == supportedEffectConfig.postProcessNew.stream[i].scene) {
152                 UpdateEffectInfoArray(supportedEffectConfig, i, audioSceneEffectInfo);
153                 sceneFlag = 1;
154                 break;
155             }
156         }
157         if (sceneFlag == 0) {
158             AudioEffectMode audioEffectMode = effectModeMap.at("EFFECT_NONE");
159             audioSceneEffectInfo.mode.push_back(audioEffectMode);
160             audioEffectMode = effectModeMap.at("EFFECT_DEFAULT");
161             audioSceneEffectInfo.mode.push_back(audioEffectMode);
162         }
163     }
164     return ret;
165 }
166 
IsStreamActive(AudioVolumeType volumeType) const167 bool AudioStreamManager::IsStreamActive(AudioVolumeType volumeType) const
168 {
169     switch (volumeType) {
170         case STREAM_MUSIC:
171         case STREAM_RING:
172         case STREAM_NOTIFICATION:
173         case STREAM_VOICE_CALL:
174         case STREAM_VOICE_COMMUNICATION:
175         case STREAM_VOICE_ASSISTANT:
176         case STREAM_ALARM:
177         case STREAM_ACCESSIBILITY:
178         case STREAM_VOICE_RING:
179         case STREAM_CAMCORDER:
180             break;
181         case STREAM_ULTRASONIC:{
182             bool ret = PermissionUtil::VerifySelfPermission();
183             CHECK_AND_RETURN_RET_LOG(ret, false, "volumeType=%{public}d. No system permission", volumeType);
184             break;
185         }
186         case STREAM_ALL:
187         default:
188             AUDIO_ERR_LOG("IsStreamActive: volumeType=%{public}d not supported", volumeType);
189             return false;
190     }
191 
192     return AudioPolicyManager::GetInstance().IsStreamActive(volumeType);
193 }
194 
GetHardwareOutputSamplingRate(sptr<AudioDeviceDescriptor> & desc)195 int32_t AudioStreamManager::GetHardwareOutputSamplingRate(sptr<AudioDeviceDescriptor> &desc)
196 {
197     int32_t result = 0;
198 
199     if (desc == nullptr) {
200         sptr<AudioDeviceDescriptor> desc = new (std::nothrow) AudioDeviceDescriptor();
201         desc->deviceType_ = DEVICE_TYPE_SPEAKER;
202         desc->deviceRole_ = OUTPUT_DEVICE;
203     }
204 
205     result = AudioPolicyManager::GetInstance().GetHardwareOutputSamplingRate(desc);
206     return result;
207 }
208 } // namespace AudioStandard
209 } // namespace OHOS
210