• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include "audio_stream_manager.h"
17 
18 #include "audio_errors.h"
19 #include "audio_log.h"
20 #include "audio_policy_manager.h"
21 #include "audio_utils.h"
22 #include "i_audio_stream.h"
23 
24 namespace OHOS {
25 namespace AudioStandard {
26 using namespace std;
GetInstance()27 AudioStreamManager *AudioStreamManager::GetInstance()
28 {
29     static AudioStreamManager audioStreamManager;
30     return &audioStreamManager;
31 }
32 
RegisterAudioRendererEventListener(const int32_t clientPid,const std::shared_ptr<AudioRendererStateChangeCallback> & callback)33 int32_t AudioStreamManager::RegisterAudioRendererEventListener(const int32_t clientPid,
34     const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
35 {
36     AUDIO_INFO_LOG("RegisterAudioRendererEventListener client id: %{public}d", clientPid);
37     if (callback == nullptr) {
38         AUDIO_ERR_LOG("callback is null");
39         return ERR_INVALID_PARAM;
40     }
41     return AudioPolicyManager::GetInstance().RegisterAudioRendererEventListener(clientPid, callback);
42 }
43 
UnregisterAudioRendererEventListener(const int32_t clientPid)44 int32_t AudioStreamManager::UnregisterAudioRendererEventListener(const int32_t clientPid)
45 {
46     AUDIO_INFO_LOG("UnregisterAudioRendererEventListener client id: %{public}d", clientPid);
47     return AudioPolicyManager::GetInstance().UnregisterAudioRendererEventListener(clientPid);
48 }
49 
RegisterAudioCapturerEventListener(const int32_t clientPid,const std::shared_ptr<AudioCapturerStateChangeCallback> & callback)50 int32_t AudioStreamManager::RegisterAudioCapturerEventListener(const int32_t clientPid,
51     const std::shared_ptr<AudioCapturerStateChangeCallback> &callback)
52 {
53     AUDIO_INFO_LOG("RegisterAudioCapturerEventListener client id: %{public}d", clientPid);
54     if (callback == nullptr) {
55         AUDIO_ERR_LOG("callback is null");
56         return ERR_INVALID_PARAM;
57     }
58     return AudioPolicyManager::GetInstance().RegisterAudioCapturerEventListener(clientPid, callback);
59 }
60 
UnregisterAudioCapturerEventListener(const int32_t clientPid)61 int32_t AudioStreamManager::UnregisterAudioCapturerEventListener(const int32_t clientPid)
62 {
63     AUDIO_INFO_LOG("UnregisterAudioCapturerEventListener client id: %{public}d", clientPid);
64     return AudioPolicyManager::GetInstance().UnregisterAudioCapturerEventListener(clientPid);
65 }
66 
GetCurrentRendererChangeInfos(vector<unique_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)67 int32_t AudioStreamManager::GetCurrentRendererChangeInfos(
68     vector<unique_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
69 {
70     AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos");
71     return AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
72 }
73 
GetCurrentCapturerChangeInfos(vector<unique_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)74 int32_t AudioStreamManager::GetCurrentCapturerChangeInfos(
75     vector<unique_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
76 {
77     AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos");
78     return AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
79 }
80 
IsAudioRendererLowLatencySupported(const AudioStreamInfo & audioStreamInfo)81 bool AudioStreamManager::IsAudioRendererLowLatencySupported(const AudioStreamInfo &audioStreamInfo)
82 {
83     AUDIO_DEBUG_LOG("IsAudioRendererLowLatencySupported");
84     return AudioPolicyManager::GetInstance().IsAudioRendererLowLatencySupported(audioStreamInfo);
85 }
86 
UpdateEffectInfoArray(SupportedEffectConfig & supportedEffectConfig,int32_t i,AudioSceneEffectInfo & audioSceneEffectInfo)87 static void UpdateEffectInfoArray(SupportedEffectConfig &supportedEffectConfig,
88     int32_t i, AudioSceneEffectInfo &audioSceneEffectInfo)
89 {
90     uint32_t j;
91     AudioEffectMode audioEffectMode;
92     for (j = 0; j < supportedEffectConfig.postProcessNew.stream[i].streamEffectMode.size(); j++) {
93         audioEffectMode = effectModeMap.at(supportedEffectConfig.postProcessNew.stream[i].streamEffectMode[j].mode);
94         audioSceneEffectInfo.mode.push_back(audioEffectMode);
95     }
96     auto index = std::find(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end(), 0);
97     if (index == audioSceneEffectInfo.mode.end()) {
98         audioEffectMode = effectModeMap.at("EFFECT_NONE");
99         audioSceneEffectInfo.mode.push_back(audioEffectMode);
100     }
101     index = std::find(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end(), 1);
102     if (index == audioSceneEffectInfo.mode.end()) {
103         audioEffectMode = effectModeMap.at("EFFECT_DEFAULT");
104         audioSceneEffectInfo.mode.push_back(audioEffectMode);
105     }
106     std::sort(audioSceneEffectInfo.mode.begin(), audioSceneEffectInfo.mode.end());
107 }
108 
GetEffectInfoArray(AudioSceneEffectInfo & audioSceneEffectInfo,StreamUsage streamUsage)109 int32_t AudioStreamManager::GetEffectInfoArray(AudioSceneEffectInfo &audioSceneEffectInfo, StreamUsage streamUsage)
110 {
111     ContentType contentType = CONTENT_TYPE_UNKNOWN;
112     AudioStreamType streamType = IAudioStream::GetStreamType(contentType, streamUsage);
113     std::string effectScene = IAudioStream::GetEffectSceneName(streamType);
114     SupportedEffectConfig supportedEffectConfig;
115     int32_t ret = AudioPolicyManager::GetInstance().QueryEffectSceneMode(supportedEffectConfig);
116     int32_t streamNum = supportedEffectConfig.postProcessNew.stream.size();
117     if (streamNum >= 0) {
118         int32_t sceneFlag = 0;
119         for (int32_t i = 0; i < streamNum; i++) {
120             if (effectScene == supportedEffectConfig.postProcessNew.stream[i].scene) {
121                 UpdateEffectInfoArray(supportedEffectConfig, i, audioSceneEffectInfo);
122                 sceneFlag = 1;
123                 break;
124             }
125         }
126         if (sceneFlag == 0) {
127             AudioEffectMode audioEffectMode = effectModeMap.at("EFFECT_NONE");
128             audioSceneEffectInfo.mode.push_back(audioEffectMode);
129             audioEffectMode = effectModeMap.at("EFFECT_DEFAULT");
130             audioSceneEffectInfo.mode.push_back(audioEffectMode);
131         }
132     }
133     return ret;
134 }
135 
IsStreamActive(AudioVolumeType volumeType) const136 bool AudioStreamManager::IsStreamActive(AudioVolumeType volumeType) const
137 {
138     switch (volumeType) {
139         case STREAM_MUSIC:
140         case STREAM_RING:
141         case STREAM_NOTIFICATION:
142         case STREAM_VOICE_CALL:
143         case STREAM_VOICE_ASSISTANT:
144         case STREAM_ALARM:
145         case STREAM_ACCESSIBILITY:
146             break;
147         case STREAM_ULTRASONIC:
148             if (!PermissionUtil::VerifySelfPermission()) {
149                 AUDIO_ERR_LOG("IsStreamActive: volumeType=%{public}d. No system permission", volumeType);
150                 return false;
151             }
152             break;
153         case STREAM_ALL:
154         default:
155             AUDIO_ERR_LOG("IsStreamActive: volumeType=%{public}d not supported", volumeType);
156             return false;
157     }
158 
159     AudioStreamType StreamVolType = (AudioStreamType)volumeType;
160     return AudioPolicyManager::GetInstance().IsStreamActive(StreamVolType);
161 }
162 } // namespace AudioStandard
163 } // namespace OHOS
164