1 /*
2 * Copyright (c) 2022-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 "AudioStreamCollector"
17 #endif
18
19 #include "audio_stream_collector.h"
20
21 #include "audio_client_tracker_callback_proxy.h"
22 #include "audio_spatialization_service.h"
23 #include "audio_utils.h"
24
25 #include "media_monitor_manager.h"
26
27 namespace OHOS {
28 namespace AudioStandard {
29 using namespace std;
30
31 const map<pair<ContentType, StreamUsage>, AudioStreamType> AudioStreamCollector::streamTypeMap_ =
32 AudioStreamCollector::CreateStreamMap();
33
CreateStreamMap()34 map<pair<ContentType, StreamUsage>, AudioStreamType> AudioStreamCollector::CreateStreamMap()
35 {
36 map<pair<ContentType, StreamUsage>, AudioStreamType> streamMap;
37 // Mapping relationships from content and usage to stream type in design
38 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_UNKNOWN)] = STREAM_MUSIC;
39 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
40 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VIDEO_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
41 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_MODEM_COMMUNICATION)] = STREAM_VOICE_CALL;
42 streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_SYSTEM)] = STREAM_SYSTEM;
43 streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
44 streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_MEDIA)] = STREAM_MUSIC;
45 streamMap[make_pair(CONTENT_TYPE_MOVIE, STREAM_USAGE_MEDIA)] = STREAM_MOVIE;
46 streamMap[make_pair(CONTENT_TYPE_GAME, STREAM_USAGE_MEDIA)] = STREAM_GAME;
47 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_MEDIA)] = STREAM_SPEECH;
48 streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_ALARM)] = STREAM_ALARM;
49 streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_NOTIFICATION)] = STREAM_NOTIFICATION;
50 streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_ENFORCED_TONE)] = STREAM_SYSTEM_ENFORCED;
51 streamMap[make_pair(CONTENT_TYPE_DTMF, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_DTMF;
52 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
53 streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_ACCESSIBILITY)] = STREAM_ACCESSIBILITY;
54 streamMap[make_pair(CONTENT_TYPE_ULTRASONIC, STREAM_USAGE_SYSTEM)] = STREAM_ULTRASONIC;
55
56 // Old mapping relationships from content and usage to stream type
57 streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
58 streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_UNKNOWN)] = STREAM_NOTIFICATION;
59 streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_MEDIA)] = STREAM_NOTIFICATION;
60 streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
61 streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_UNKNOWN)] = STREAM_RING;
62 streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_MEDIA)] = STREAM_RING;
63 streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
64
65 // Only use stream usage to choose stream type
66 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MEDIA)] = STREAM_MUSIC;
67 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MUSIC)] = STREAM_MUSIC;
68 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
69 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VIDEO_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
70 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_MODEM_COMMUNICATION)] = STREAM_VOICE_CALL;
71 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
72 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ALARM)] = STREAM_ALARM;
73 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_MESSAGE)] = STREAM_VOICE_MESSAGE;
74 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
75 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_RINGTONE)] = STREAM_RING;
76 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NOTIFICATION)] = STREAM_NOTIFICATION;
77 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ACCESSIBILITY)] = STREAM_ACCESSIBILITY;
78 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_SYSTEM)] = STREAM_SYSTEM;
79 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MOVIE)] = STREAM_MOVIE;
80 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_GAME)] = STREAM_GAME;
81 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_AUDIOBOOK)] = STREAM_SPEECH;
82 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NAVIGATION)] = STREAM_NAVIGATION;
83 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_DTMF)] = STREAM_DTMF;
84 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ENFORCED_TONE)] = STREAM_SYSTEM_ENFORCED;
85 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ULTRASONIC)] = STREAM_ULTRASONIC;
86 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_RINGTONE)] = STREAM_VOICE_RING;
87 streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_CALL_ASSISTANT)] = STREAM_VOICE_CALL_ASSISTANT;
88
89 return streamMap;
90 }
91
AudioStreamCollector()92 AudioStreamCollector::AudioStreamCollector() : audioSystemMgr_
93 (AudioSystemManager::GetInstance())
94 {
95 audioPolicyServerHandler_ = DelayedSingleton<AudioPolicyServerHandler>::GetInstance();
96 audioConcurrencyService_ = std::make_shared<AudioConcurrencyService>();
97 audioPolicyServerHandler_->AddConcurrencyEventDispatcher(audioConcurrencyService_);
98 audioConcurrencyService_->Init();
99 audioConcurrencyService_->SetCallbackHandler(audioPolicyServerHandler_);
100 AUDIO_INFO_LOG("AudioStreamCollector()");
101 }
102
~AudioStreamCollector()103 AudioStreamCollector::~AudioStreamCollector()
104 {
105 AUDIO_INFO_LOG("~AudioStreamCollector()");
106 }
107
AddRendererStream(AudioStreamChangeInfo & streamChangeInfo)108 int32_t AudioStreamCollector::AddRendererStream(AudioStreamChangeInfo &streamChangeInfo)
109 {
110 AUDIO_INFO_LOG("Add playback client uid %{public}d sessionId %{public}d",
111 streamChangeInfo.audioRendererChangeInfo.clientUID, streamChangeInfo.audioRendererChangeInfo.sessionId);
112
113 rendererStatequeue_.insert({{streamChangeInfo.audioRendererChangeInfo.clientUID,
114 streamChangeInfo.audioRendererChangeInfo.sessionId},
115 streamChangeInfo.audioRendererChangeInfo.rendererState});
116
117 unique_ptr<AudioRendererChangeInfo> rendererChangeInfo = make_unique<AudioRendererChangeInfo>();
118 if (!rendererChangeInfo) {
119 AUDIO_ERR_LOG("AddRendererStream Memory Allocation Failed");
120 return ERR_MEMORY_ALLOC_FAILED;
121 }
122 rendererChangeInfo->createrUID = streamChangeInfo.audioRendererChangeInfo.createrUID;
123 rendererChangeInfo->clientUID = streamChangeInfo.audioRendererChangeInfo.clientUID;
124 rendererChangeInfo->sessionId = streamChangeInfo.audioRendererChangeInfo.sessionId;
125 rendererChangeInfo->callerPid = streamChangeInfo.audioRendererChangeInfo.callerPid;
126 rendererChangeInfo->tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
127 rendererChangeInfo->rendererState = streamChangeInfo.audioRendererChangeInfo.rendererState;
128 rendererChangeInfo->rendererInfo = streamChangeInfo.audioRendererChangeInfo.rendererInfo;
129 rendererChangeInfo->outputDeviceInfo = streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo;
130 rendererChangeInfo->channelCount = streamChangeInfo.audioRendererChangeInfo.channelCount;
131 audioRendererChangeInfos_.push_back(move(rendererChangeInfo));
132
133 CHECK_AND_RETURN_RET_LOG(audioPolicyServerHandler_ != nullptr, ERR_MEMORY_ALLOC_FAILED,
134 "audioPolicyServerHandler_ is nullptr, callback error");
135 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
136 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
137 return SUCCESS;
138 }
139
GetRendererStreamInfo(AudioStreamChangeInfo & streamChangeInfo,AudioRendererChangeInfo & rendererInfo)140 void AudioStreamCollector::GetRendererStreamInfo(AudioStreamChangeInfo &streamChangeInfo,
141 AudioRendererChangeInfo &rendererInfo)
142 {
143 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
144 if ((*it)->clientUID == streamChangeInfo.audioRendererChangeInfo.clientUID &&
145 (*it)->sessionId == streamChangeInfo.audioRendererChangeInfo.sessionId) {
146 rendererInfo.outputDeviceInfo = (*it)->outputDeviceInfo;
147 return;
148 }
149 }
150 }
151
GetCapturerStreamInfo(AudioStreamChangeInfo & streamChangeInfo,AudioCapturerChangeInfo & capturerInfo)152 void AudioStreamCollector::GetCapturerStreamInfo(AudioStreamChangeInfo &streamChangeInfo,
153 AudioCapturerChangeInfo &capturerInfo)
154 {
155 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
156 if ((*it)->clientUID == streamChangeInfo.audioCapturerChangeInfo.clientUID &&
157 (*it)->sessionId == streamChangeInfo.audioCapturerChangeInfo.sessionId) {
158 capturerInfo.inputDeviceInfo = (*it)->inputDeviceInfo;
159 return;
160 }
161 }
162 }
163
GetPipeType(const int32_t sessionId,AudioPipeType & pipeType)164 int32_t AudioStreamCollector::GetPipeType(const int32_t sessionId, AudioPipeType &pipeType)
165 {
166 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
167 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
168 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
169 return changeInfo->sessionId == sessionId;
170 });
171 if (it == audioRendererChangeInfos_.end()) {
172 AUDIO_WARNING_LOG("invalid session id: %{public}d", sessionId);
173 return ERROR;
174 }
175
176 pipeType = (*it)->rendererInfo.pipeType;
177 return SUCCESS;
178 }
179
ExistStreamForPipe(AudioPipeType pipeType)180 bool AudioStreamCollector::ExistStreamForPipe(AudioPipeType pipeType)
181 {
182 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
183 [&pipeType](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
184 return changeInfo->rendererInfo.pipeType == pipeType;
185 });
186 if (it == audioRendererChangeInfos_.end()) {
187 return false;
188 }
189 return true;
190 }
191
GetRendererDeviceInfo(const int32_t sessionId,DeviceInfo & outputDeviceInfo)192 int32_t AudioStreamCollector::GetRendererDeviceInfo(const int32_t sessionId, DeviceInfo &outputDeviceInfo)
193 {
194 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
195 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
196 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
197 return changeInfo->sessionId == sessionId;
198 });
199 if (it == audioRendererChangeInfos_.end()) {
200 AUDIO_WARNING_LOG("invalid session id: %{public}d", sessionId);
201 return ERROR;
202 }
203 outputDeviceInfo = (*it)->outputDeviceInfo;
204 return SUCCESS;
205 }
206
AddCapturerStream(AudioStreamChangeInfo & streamChangeInfo)207 int32_t AudioStreamCollector::AddCapturerStream(AudioStreamChangeInfo &streamChangeInfo)
208 {
209 AUDIO_INFO_LOG("Add recording client uid %{public}d sessionId %{public}d",
210 streamChangeInfo.audioCapturerChangeInfo.clientUID, streamChangeInfo.audioCapturerChangeInfo.sessionId);
211
212 capturerStatequeue_.insert({{streamChangeInfo.audioCapturerChangeInfo.clientUID,
213 streamChangeInfo.audioCapturerChangeInfo.sessionId},
214 streamChangeInfo.audioCapturerChangeInfo.capturerState});
215
216 unique_ptr<AudioCapturerChangeInfo> capturerChangeInfo = make_unique<AudioCapturerChangeInfo>();
217 if (!capturerChangeInfo) {
218 AUDIO_ERR_LOG("AddCapturerStream Memory Allocation Failed");
219 return ERR_MEMORY_ALLOC_FAILED;
220 }
221 capturerChangeInfo->createrUID = streamChangeInfo.audioCapturerChangeInfo.createrUID;
222 capturerChangeInfo->clientUID = streamChangeInfo.audioCapturerChangeInfo.clientUID;
223 capturerChangeInfo->sessionId = streamChangeInfo.audioCapturerChangeInfo.sessionId;
224 capturerChangeInfo->callerPid = streamChangeInfo.audioCapturerChangeInfo.callerPid;
225 capturerChangeInfo->muted = streamChangeInfo.audioCapturerChangeInfo.muted;
226 capturerChangeInfo->appTokenId = streamChangeInfo.audioCapturerChangeInfo.appTokenId;
227
228 capturerChangeInfo->capturerState = streamChangeInfo.audioCapturerChangeInfo.capturerState;
229 capturerChangeInfo->capturerInfo = streamChangeInfo.audioCapturerChangeInfo.capturerInfo;
230 capturerChangeInfo->inputDeviceInfo = streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo;
231 audioCapturerChangeInfos_.push_back(move(capturerChangeInfo));
232
233 CHECK_AND_RETURN_RET_LOG(audioPolicyServerHandler_ != nullptr, ERR_MEMORY_ALLOC_FAILED,
234 "audioPolicyServerHandler_ is nullptr, callback error");
235 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
236 return SUCCESS;
237 }
238
RegisterTracker(AudioMode & mode,AudioStreamChangeInfo & streamChangeInfo,const sptr<IRemoteObject> & object)239 int32_t AudioStreamCollector::RegisterTracker(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo,
240 const sptr<IRemoteObject> &object)
241 {
242 AUDIO_DEBUG_LOG("RegisterTracker mode %{public}d", mode);
243
244 int32_t clientId;
245 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
246 if (mode == AUDIO_MODE_PLAYBACK) {
247 AddRendererStream(streamChangeInfo);
248 clientId = streamChangeInfo.audioRendererChangeInfo.sessionId;
249 } else {
250 // mode = AUDIO_MODE_RECORD
251 AddCapturerStream(streamChangeInfo);
252 clientId = streamChangeInfo.audioCapturerChangeInfo.sessionId;
253 }
254
255 sptr<IStandardClientTracker> listener = iface_cast<IStandardClientTracker>(object);
256 CHECK_AND_RETURN_RET_LOG(listener != nullptr,
257 ERR_INVALID_PARAM, "AudioStreamCollector: client tracker obj cast failed");
258 std::shared_ptr<AudioClientTracker> callback = std::make_shared<ClientTrackerCallbackListener>(listener);
259 CHECK_AND_RETURN_RET_LOG(callback != nullptr,
260 ERR_INVALID_PARAM, "AudioStreamCollector: failed to create tracker cb obj");
261 clientTracker_[clientId] = callback;
262 WriterStreamChangeSysEvent(mode, streamChangeInfo);
263 return SUCCESS;
264 }
265
SetRendererStreamParam(AudioStreamChangeInfo & streamChangeInfo,unique_ptr<AudioRendererChangeInfo> & rendererChangeInfo)266 void AudioStreamCollector::SetRendererStreamParam(AudioStreamChangeInfo &streamChangeInfo,
267 unique_ptr<AudioRendererChangeInfo> &rendererChangeInfo)
268 {
269 rendererChangeInfo->createrUID = streamChangeInfo.audioRendererChangeInfo.createrUID;
270 rendererChangeInfo->clientUID = streamChangeInfo.audioRendererChangeInfo.clientUID;
271 rendererChangeInfo->sessionId = streamChangeInfo.audioRendererChangeInfo.sessionId;
272 rendererChangeInfo->callerPid = streamChangeInfo.audioRendererChangeInfo.callerPid;
273 rendererChangeInfo->clientPid = streamChangeInfo.audioRendererChangeInfo.clientPid;
274 rendererChangeInfo->tokenId = static_cast<int32_t>(IPCSkeleton::GetCallingTokenID());
275 rendererChangeInfo->rendererState = streamChangeInfo.audioRendererChangeInfo.rendererState;
276 rendererChangeInfo->rendererInfo = streamChangeInfo.audioRendererChangeInfo.rendererInfo;
277 rendererChangeInfo->outputDeviceInfo = streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo;
278 rendererChangeInfo->prerunningState = streamChangeInfo.audioRendererChangeInfo.prerunningState;
279 }
280
SetCapturerStreamParam(AudioStreamChangeInfo & streamChangeInfo,unique_ptr<AudioCapturerChangeInfo> & capturerChangeInfo)281 void AudioStreamCollector::SetCapturerStreamParam(AudioStreamChangeInfo &streamChangeInfo,
282 unique_ptr<AudioCapturerChangeInfo> &capturerChangeInfo)
283 {
284 capturerChangeInfo->createrUID = streamChangeInfo.audioCapturerChangeInfo.createrUID;
285 capturerChangeInfo->clientUID = streamChangeInfo.audioCapturerChangeInfo.clientUID;
286 capturerChangeInfo->sessionId = streamChangeInfo.audioCapturerChangeInfo.sessionId;
287 capturerChangeInfo->callerPid = streamChangeInfo.audioCapturerChangeInfo.callerPid;
288 capturerChangeInfo->clientPid = streamChangeInfo.audioCapturerChangeInfo.clientPid;
289 capturerChangeInfo->muted = streamChangeInfo.audioCapturerChangeInfo.muted;
290 capturerChangeInfo->capturerState = streamChangeInfo.audioCapturerChangeInfo.capturerState;
291 capturerChangeInfo->capturerInfo = streamChangeInfo.audioCapturerChangeInfo.capturerInfo;
292 capturerChangeInfo->inputDeviceInfo = streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo;
293 }
294
ResetRendererStreamDeviceInfo(const AudioDeviceDescriptor & updatedDesc)295 void AudioStreamCollector::ResetRendererStreamDeviceInfo(const AudioDeviceDescriptor& updatedDesc)
296 {
297 AUDIO_INFO_LOG("ResetRendererStreamDeviceInfo, deviceType:[%{public}d]", updatedDesc.deviceType_);
298 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
299 if ((*it)->outputDeviceInfo.deviceType == updatedDesc.deviceType_ &&
300 (*it)->outputDeviceInfo.macAddress == updatedDesc.macAddress_ &&
301 (*it)->outputDeviceInfo.networkId == updatedDesc.networkId_ &&
302 (*it)->rendererState != RENDERER_RUNNING) {
303 (*it)->outputDeviceInfo.deviceType = DEVICE_TYPE_NONE;
304 (*it)->outputDeviceInfo.macAddress = "";
305 (*it)->outputDeviceInfo.networkId = LOCAL_NETWORK_ID;
306 }
307 }
308 }
309
ResetCapturerStreamDeviceInfo(const AudioDeviceDescriptor & updatedDesc)310 void AudioStreamCollector::ResetCapturerStreamDeviceInfo(const AudioDeviceDescriptor& updatedDesc)
311 {
312 AUDIO_INFO_LOG("ResetCapturerStreamDeviceInfo, deviceType:[%{public}d]", updatedDesc.deviceType_);
313 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
314 if ((*it)->inputDeviceInfo.deviceType == updatedDesc.deviceType_ &&
315 (*it)->inputDeviceInfo.macAddress == updatedDesc.macAddress_ &&
316 (*it)->inputDeviceInfo.networkId == updatedDesc.networkId_ &&
317 (*it)->capturerState != CAPTURER_RUNNING) {
318 (*it)->inputDeviceInfo.deviceType = DEVICE_TYPE_NONE;
319 (*it)->inputDeviceInfo.macAddress = "";
320 (*it)->inputDeviceInfo.networkId = LOCAL_NETWORK_ID;
321 }
322 }
323 }
324
CheckRendererStateInfoChanged(AudioStreamChangeInfo & streamChangeInfo)325 bool AudioStreamCollector::CheckRendererStateInfoChanged(AudioStreamChangeInfo &streamChangeInfo)
326 {
327 if (rendererStatequeue_.find(make_pair(streamChangeInfo.audioRendererChangeInfo.clientUID,
328 streamChangeInfo.audioRendererChangeInfo.sessionId)) != rendererStatequeue_.end()) {
329 if (streamChangeInfo.audioRendererChangeInfo.rendererState ==
330 rendererStatequeue_[make_pair(streamChangeInfo.audioRendererChangeInfo.clientUID,
331 streamChangeInfo.audioRendererChangeInfo.sessionId)]) {
332 // Renderer state not changed
333 return false;
334 }
335 } else {
336 AUDIO_INFO_LOG("client %{public}d not found ", streamChangeInfo.audioRendererChangeInfo.clientUID);
337 }
338 return true;
339 }
340
CheckRendererInfoChanged(AudioStreamChangeInfo & streamChangeInfo)341 bool AudioStreamCollector::CheckRendererInfoChanged(AudioStreamChangeInfo &streamChangeInfo)
342 {
343 int32_t sessionId = streamChangeInfo.audioRendererChangeInfo.sessionId;
344 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
345 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
346 return changeInfo->sessionId == sessionId;
347 });
348 if (it == audioRendererChangeInfos_.end()) {
349 return true;
350 }
351
352 bool changed = false;
353 bool isOffloadAllowed = (*it)->rendererInfo.isOffloadAllowed;
354 if (isOffloadAllowed != streamChangeInfo.audioRendererChangeInfo.rendererInfo.isOffloadAllowed) {
355 changed = true;
356 }
357 AudioPipeType pipeType = (*it)->rendererInfo.pipeType;
358 if (pipeType != streamChangeInfo.audioRendererChangeInfo.rendererInfo.pipeType) {
359 changed = true;
360 }
361 return changed;
362 }
363
UpdateRendererStream(AudioStreamChangeInfo & streamChangeInfo)364 int32_t AudioStreamCollector::UpdateRendererStream(AudioStreamChangeInfo &streamChangeInfo)
365 {
366 AUDIO_INFO_LOG("UpdateRendererStream client %{public}d state %{public}d session %{public}d",
367 streamChangeInfo.audioRendererChangeInfo.clientUID, streamChangeInfo.audioRendererChangeInfo.rendererState,
368 streamChangeInfo.audioRendererChangeInfo.sessionId);
369 bool stateChanged = CheckRendererStateInfoChanged(streamChangeInfo);
370 bool infoChanged = CheckRendererInfoChanged(streamChangeInfo);
371 CHECK_AND_RETURN_RET(stateChanged || infoChanged, SUCCESS);
372
373 // Update the renderer info in audioRendererChangeInfos_
374 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
375 AudioRendererChangeInfo audioRendererChangeInfo = **it;
376 if (audioRendererChangeInfo.clientUID == streamChangeInfo.audioRendererChangeInfo.clientUID &&
377 audioRendererChangeInfo.sessionId == streamChangeInfo.audioRendererChangeInfo.sessionId) {
378 rendererStatequeue_[make_pair(audioRendererChangeInfo.clientUID, audioRendererChangeInfo.sessionId)] =
379 streamChangeInfo.audioRendererChangeInfo.rendererState;
380 streamChangeInfo.audioRendererChangeInfo.rendererInfo.pipeType = (*it)->rendererInfo.pipeType;
381 AUDIO_DEBUG_LOG("update client %{public}d session %{public}d", audioRendererChangeInfo.clientUID,
382 audioRendererChangeInfo.sessionId);
383 unique_ptr<AudioRendererChangeInfo> rendererChangeInfo = make_unique<AudioRendererChangeInfo>();
384 CHECK_AND_RETURN_RET_LOG(rendererChangeInfo != nullptr, ERR_MEMORY_ALLOC_FAILED,
385 "Memory Allocation Failed");
386 SetRendererStreamParam(streamChangeInfo, rendererChangeInfo);
387 rendererChangeInfo->channelCount = (*it)->channelCount;
388 if (rendererChangeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_INVALID) {
389 streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo = (*it)->outputDeviceInfo;
390 rendererChangeInfo->outputDeviceInfo = (*it)->outputDeviceInfo;
391 }
392 *it = move(rendererChangeInfo);
393
394 if (audioPolicyServerHandler_ != nullptr && stateChanged) {
395 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
396 }
397 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
398
399 if (streamChangeInfo.audioRendererChangeInfo.rendererState == RENDERER_RELEASED) {
400 audioRendererChangeInfos_.erase(it);
401 rendererStatequeue_.erase(make_pair(audioRendererChangeInfo.clientUID,
402 audioRendererChangeInfo.sessionId));
403 clientTracker_.erase(audioRendererChangeInfo.sessionId);
404 }
405 return SUCCESS;
406 }
407 }
408
409 AUDIO_INFO_LOG("UpdateRendererStream: Not found clientUid:%{public}d sessionId:%{public}d",
410 streamChangeInfo.audioRendererChangeInfo.clientUID, streamChangeInfo.audioRendererChangeInfo.clientUID);
411 return SUCCESS;
412 }
413
414
UpdateRendererStreamInternal(AudioStreamChangeInfo & streamChangeInfo)415 int32_t AudioStreamCollector::UpdateRendererStreamInternal(AudioStreamChangeInfo &streamChangeInfo)
416 {
417 // Update the renderer internal info in audioRendererChangeInfos_
418 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
419 AudioRendererChangeInfo audioRendererChangeInfo = **it;
420 if ((*it)->clientUID == streamChangeInfo.audioRendererChangeInfo.clientUID &&
421 (*it)->sessionId == streamChangeInfo.audioRendererChangeInfo.sessionId) {
422 AUDIO_DEBUG_LOG("update client %{public}d session %{public}d", (*it)->clientUID, (*it)->sessionId);
423 (*it)->prerunningState = streamChangeInfo.audioRendererChangeInfo.prerunningState;
424 return SUCCESS;
425 }
426 }
427
428 AUDIO_ERR_LOG("Not found clientUid:%{public}d sessionId:%{public}d",
429 streamChangeInfo.audioRendererChangeInfo.clientUID, streamChangeInfo.audioRendererChangeInfo.sessionId);
430 return ERROR;
431 }
432
UpdateCapturerStream(AudioStreamChangeInfo & streamChangeInfo)433 int32_t AudioStreamCollector::UpdateCapturerStream(AudioStreamChangeInfo &streamChangeInfo)
434 {
435 AUDIO_INFO_LOG("UpdateCapturerStream client %{public}d state %{public}d session %{public}d",
436 streamChangeInfo.audioCapturerChangeInfo.clientUID, streamChangeInfo.audioCapturerChangeInfo.capturerState,
437 streamChangeInfo.audioCapturerChangeInfo.sessionId);
438
439 if (capturerStatequeue_.find(make_pair(streamChangeInfo.audioCapturerChangeInfo.clientUID,
440 streamChangeInfo.audioCapturerChangeInfo.sessionId)) != capturerStatequeue_.end()) {
441 if (streamChangeInfo.audioCapturerChangeInfo.capturerState ==
442 capturerStatequeue_[make_pair(streamChangeInfo.audioCapturerChangeInfo.clientUID,
443 streamChangeInfo.audioCapturerChangeInfo.sessionId)]) {
444 // Capturer state not changed
445 return SUCCESS;
446 }
447 }
448
449 // Update the capturer info in audioCapturerChangeInfos_
450 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
451 AudioCapturerChangeInfo audioCapturerChangeInfo = **it;
452 if (audioCapturerChangeInfo.clientUID == streamChangeInfo.audioCapturerChangeInfo.clientUID &&
453 audioCapturerChangeInfo.sessionId == streamChangeInfo.audioCapturerChangeInfo.sessionId) {
454 capturerStatequeue_[make_pair(audioCapturerChangeInfo.clientUID, audioCapturerChangeInfo.sessionId)] =
455 streamChangeInfo.audioCapturerChangeInfo.capturerState;
456
457 AUDIO_DEBUG_LOG("Session is updated for client %{public}d session %{public}d",
458 streamChangeInfo.audioCapturerChangeInfo.clientUID,
459 streamChangeInfo.audioCapturerChangeInfo.sessionId);
460
461 unique_ptr<AudioCapturerChangeInfo> capturerChangeInfo = make_unique<AudioCapturerChangeInfo>();
462 CHECK_AND_RETURN_RET_LOG(capturerChangeInfo != nullptr,
463 ERR_MEMORY_ALLOC_FAILED, "CapturerChangeInfo Memory Allocation Failed");
464 SetCapturerStreamParam(streamChangeInfo, capturerChangeInfo);
465 if (capturerChangeInfo->inputDeviceInfo.deviceType == DEVICE_TYPE_INVALID) {
466 streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo = (*it)->inputDeviceInfo;
467 capturerChangeInfo->inputDeviceInfo = (*it)->inputDeviceInfo;
468 }
469 capturerChangeInfo->appTokenId = (*it)->appTokenId;
470 *it = move(capturerChangeInfo);
471 if (audioPolicyServerHandler_ != nullptr) {
472 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
473 }
474 if (streamChangeInfo.audioCapturerChangeInfo.capturerState == CAPTURER_RELEASED) {
475 audioCapturerChangeInfos_.erase(it);
476 capturerStatequeue_.erase(make_pair(audioCapturerChangeInfo.clientUID,
477 audioCapturerChangeInfo.sessionId));
478 clientTracker_.erase(audioCapturerChangeInfo.sessionId);
479 }
480 return SUCCESS;
481 }
482 }
483 AUDIO_DEBUG_LOG("UpdateCapturerStream: clientUI not in audioCapturerChangeInfos_::%{public}d",
484 streamChangeInfo.audioCapturerChangeInfo.clientUID);
485 return SUCCESS;
486 }
487
UpdateRendererDeviceInfo(DeviceInfo & outputDeviceInfo)488 int32_t AudioStreamCollector::UpdateRendererDeviceInfo(DeviceInfo &outputDeviceInfo)
489 {
490 bool deviceInfoUpdated = false;
491
492 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
493 if (!(*it)->outputDeviceInfo.IsSameDeviceInfo(outputDeviceInfo)) {
494 AUDIO_DEBUG_LOG("UpdateRendererDeviceInfo: old device: %{public}d new device: %{public}d",
495 (*it)->outputDeviceInfo.deviceType, outputDeviceInfo.deviceType);
496 (*it)->outputDeviceInfo = outputDeviceInfo;
497 deviceInfoUpdated = true;
498 }
499 }
500
501 if (deviceInfoUpdated && audioPolicyServerHandler_ != nullptr) {
502 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
503 }
504 if (deviceInfoUpdated) {
505 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
506 }
507
508 return SUCCESS;
509 }
510
UpdateCapturerDeviceInfo(DeviceInfo & inputDeviceInfo)511 int32_t AudioStreamCollector::UpdateCapturerDeviceInfo(DeviceInfo &inputDeviceInfo)
512 {
513 bool deviceInfoUpdated = false;
514
515 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
516 if (!(*it)->inputDeviceInfo.IsSameDeviceInfo(inputDeviceInfo)) {
517 AUDIO_DEBUG_LOG("UpdateCapturerDeviceInfo: old device: %{public}d new device: %{public}d",
518 (*it)->inputDeviceInfo.deviceType, inputDeviceInfo.deviceType);
519 (*it)->inputDeviceInfo = inputDeviceInfo;
520 deviceInfoUpdated = true;
521 }
522 }
523
524 if (deviceInfoUpdated && audioPolicyServerHandler_ != nullptr) {
525 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
526 }
527
528 return SUCCESS;
529 }
530
UpdateRendererDeviceInfo(int32_t clientUID,int32_t sessionId,DeviceInfo & outputDeviceInfo)531 int32_t AudioStreamCollector::UpdateRendererDeviceInfo(int32_t clientUID, int32_t sessionId,
532 DeviceInfo &outputDeviceInfo)
533 {
534 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
535 bool deviceInfoUpdated = false;
536
537 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
538 if ((*it)->clientUID == clientUID && (*it)->sessionId == sessionId &&
539 !(*it)->outputDeviceInfo.IsSameDeviceInfo(outputDeviceInfo)) {
540 AUDIO_DEBUG_LOG("uid %{public}d sessionId %{public}d update device: old %{public}d, new %{public}d",
541 clientUID, sessionId, (*it)->outputDeviceInfo.deviceType, outputDeviceInfo.deviceType);
542 (*it)->outputDeviceInfo = outputDeviceInfo;
543 deviceInfoUpdated = true;
544 }
545 }
546
547 if (deviceInfoUpdated && audioPolicyServerHandler_ != nullptr) {
548 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
549 }
550 if (deviceInfoUpdated) {
551 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
552 }
553 return SUCCESS;
554 }
555
UpdateRendererPipeInfo(const int32_t sessionId,const AudioPipeType pipeType)556 int32_t AudioStreamCollector::UpdateRendererPipeInfo(const int32_t sessionId, const AudioPipeType pipeType)
557 {
558 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
559 bool pipeTypeUpdated = false;
560
561 for (auto it = audioRendererChangeInfos_.begin(); it != audioRendererChangeInfos_.end(); it++) {
562 if ((*it)->sessionId == sessionId && (*it)->rendererInfo.pipeType != pipeType) {
563 AUDIO_INFO_LOG("sessionId %{public}d update pipeType: old %{public}d, new %{public}d",
564 sessionId, (*it)->rendererInfo.pipeType, pipeType);
565 (*it)->rendererInfo.pipeType = pipeType;
566 pipeTypeUpdated = true;
567 }
568 }
569
570 if (pipeTypeUpdated && audioPolicyServerHandler_ != nullptr) {
571 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
572 }
573 if (pipeTypeUpdated) {
574 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
575 }
576 return SUCCESS;
577 }
578
UpdateCapturerDeviceInfo(int32_t clientUID,int32_t sessionId,DeviceInfo & inputDeviceInfo)579 int32_t AudioStreamCollector::UpdateCapturerDeviceInfo(int32_t clientUID, int32_t sessionId,
580 DeviceInfo &inputDeviceInfo)
581 {
582 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
583 bool deviceInfoUpdated = false;
584
585 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
586 if ((*it)->clientUID == clientUID && (*it)->sessionId == sessionId &&
587 !(*it)->inputDeviceInfo.IsSameDeviceInfo(inputDeviceInfo)) {
588 AUDIO_DEBUG_LOG("uid %{public}d sessionId %{public}d update device: old %{public}d, new %{public}d",
589 (*it)->clientUID, (*it)->sessionId, (*it)->inputDeviceInfo.deviceType, inputDeviceInfo.deviceType);
590 (*it)->inputDeviceInfo = inputDeviceInfo;
591 deviceInfoUpdated = true;
592 }
593 }
594
595 if (deviceInfoUpdated && audioPolicyServerHandler_ != nullptr) {
596 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
597 }
598
599 return SUCCESS;
600 }
601
UpdateTracker(const AudioMode & mode,DeviceInfo & deviceInfo)602 int32_t AudioStreamCollector::UpdateTracker(const AudioMode &mode, DeviceInfo &deviceInfo)
603 {
604 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
605 if (mode == AUDIO_MODE_PLAYBACK) {
606 UpdateRendererDeviceInfo(deviceInfo);
607 } else {
608 UpdateCapturerDeviceInfo(deviceInfo);
609 }
610
611 return SUCCESS;
612 }
613
UpdateTracker(AudioMode & mode,AudioStreamChangeInfo & streamChangeInfo)614 int32_t AudioStreamCollector::UpdateTracker(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo)
615 {
616 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
617 // update the stream change info
618 if (mode == AUDIO_MODE_PLAYBACK) {
619 UpdateRendererStream(streamChangeInfo);
620 } else {
621 // mode = AUDIO_MODE_RECORD
622 UpdateCapturerStream(streamChangeInfo);
623 }
624 WriterStreamChangeSysEvent(mode, streamChangeInfo);
625 return SUCCESS;
626 }
627
UpdateTrackerInternal(AudioMode & mode,AudioStreamChangeInfo & streamChangeInfo)628 int32_t AudioStreamCollector::UpdateTrackerInternal(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo)
629 {
630 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
631 // update the stream change internal info
632 if (mode == AUDIO_MODE_PLAYBACK) {
633 return UpdateRendererStreamInternal(streamChangeInfo);
634 }
635 return SUCCESS;
636 }
637
GetStreamType(ContentType contentType,StreamUsage streamUsage)638 AudioStreamType AudioStreamCollector::GetStreamType(ContentType contentType, StreamUsage streamUsage)
639 {
640 AudioStreamType streamType = STREAM_MUSIC;
641 auto pos = streamTypeMap_.find(std::make_pair(contentType, streamUsage));
642 if (pos != streamTypeMap_.end()) {
643 streamType = pos->second;
644 }
645
646 if (streamType == STREAM_MEDIA) {
647 streamType = STREAM_MUSIC;
648 }
649
650 return streamType;
651 }
652
GetStreamType(int32_t sessionId)653 AudioStreamType AudioStreamCollector::GetStreamType(int32_t sessionId)
654 {
655 AudioStreamType streamType = STREAM_MUSIC;
656 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
657 for (const auto &changeInfo : audioRendererChangeInfos_) {
658 if (changeInfo->sessionId == sessionId) {
659 streamType = GetStreamType(changeInfo->rendererInfo.contentType, changeInfo->rendererInfo.streamUsage);
660 }
661 }
662 return streamType;
663 }
664
GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage streamUsage)665 std::set<int32_t> AudioStreamCollector::GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage streamUsage)
666 {
667 std::set<int32_t> sessionIdSet;
668 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
669 for (const auto &changeInfo : audioRendererChangeInfos_) {
670 if (changeInfo->rendererInfo.streamUsage == streamUsage &&
671 changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_SPEAKER &&
672 changeInfo->outputDeviceInfo.networkId != LOCAL_NETWORK_ID) {
673 sessionIdSet.insert(changeInfo->sessionId);
674 }
675 }
676 return sessionIdSet;
677 }
678
GetSessionIdsOnRemoteDeviceBySourceType(SourceType sourceType)679 std::set<int32_t> AudioStreamCollector::GetSessionIdsOnRemoteDeviceBySourceType(SourceType sourceType)
680 {
681 std::set<int32_t> sessionIdSet;
682 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
683 for (const auto &changeInfo : audioCapturerChangeInfos_) {
684 if (changeInfo->capturerInfo.sourceType == sourceType &&
685 changeInfo->inputDeviceInfo.deviceType == DEVICE_TYPE_MIC &&
686 changeInfo->inputDeviceInfo.networkId != LOCAL_NETWORK_ID) {
687 sessionIdSet.insert(changeInfo->sessionId);
688 }
689 }
690 return sessionIdSet;
691 }
692
GetSessionIdsOnRemoteDeviceByDeviceType(DeviceType deviceType)693 std::set<int32_t> AudioStreamCollector::GetSessionIdsOnRemoteDeviceByDeviceType(DeviceType deviceType)
694 {
695 std::set<int32_t> sessionIdSet;
696 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
697 for (const auto &changeInfo : audioRendererChangeInfos_) {
698 if (changeInfo->outputDeviceInfo.deviceType == deviceType) {
699 sessionIdSet.insert(changeInfo->sessionId);
700 }
701 }
702 return sessionIdSet;
703 }
704
GetSessionIdsPauseOnRemoteDeviceByRemote(InterruptHint hintType)705 int32_t AudioStreamCollector::GetSessionIdsPauseOnRemoteDeviceByRemote(InterruptHint hintType)
706 {
707 int32_t sessionIdVec = -1;
708 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
709 for (const auto &changeInfo : audioRendererChangeInfos_) {
710 if (changeInfo->outputDeviceInfo.deviceType == DEVICE_TYPE_REMOTE_CAST &&
711 changeInfo->rendererState == RendererState::RENDERER_RUNNING) {
712 return changeInfo->sessionId;
713 }
714 }
715 return sessionIdVec;
716 }
717
IsOffloadAllowed(const int32_t sessionId)718 bool AudioStreamCollector::IsOffloadAllowed(const int32_t sessionId)
719 {
720 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
721 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
722 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
723 return changeInfo->sessionId == sessionId;
724 });
725 if (it == audioRendererChangeInfos_.end()) {
726 AUDIO_WARNING_LOG("invalid session id: %{public}d", sessionId);
727 return false;
728 }
729 return (*it)->rendererInfo.isOffloadAllowed;
730 }
731
GetChannelCount(int32_t sessionId)732 int32_t AudioStreamCollector::GetChannelCount(int32_t sessionId)
733 {
734 int32_t channelCount = 0;
735 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
736 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
737 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
738 return changeInfo->sessionId == sessionId;
739 });
740 if (it != audioRendererChangeInfos_.end()) {
741 channelCount = (*it)->channelCount;
742 }
743 return channelCount;
744 }
745
GetCurrentRendererChangeInfos(std::vector<unique_ptr<AudioRendererChangeInfo>> & rendererChangeInfos)746 int32_t AudioStreamCollector::GetCurrentRendererChangeInfos(
747 std::vector<unique_ptr<AudioRendererChangeInfo>> &rendererChangeInfos)
748 {
749 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
750 for (const auto &changeInfo : audioRendererChangeInfos_) {
751 rendererChangeInfos.push_back(make_unique<AudioRendererChangeInfo>(*changeInfo));
752 }
753 AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos returned");
754
755 return SUCCESS;
756 }
757
GetCurrentCapturerChangeInfos(std::vector<unique_ptr<AudioCapturerChangeInfo>> & capturerChangeInfos)758 int32_t AudioStreamCollector::GetCurrentCapturerChangeInfos(
759 std::vector<unique_ptr<AudioCapturerChangeInfo>> &capturerChangeInfos)
760 {
761 AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos");
762 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
763 for (const auto &changeInfo : audioCapturerChangeInfos_) {
764 capturerChangeInfos.push_back(make_unique<AudioCapturerChangeInfo>(*changeInfo));
765 AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos returned");
766 }
767
768 return SUCCESS;
769 }
770
RegisteredRendererTrackerClientDied(const int32_t uid)771 void AudioStreamCollector::RegisteredRendererTrackerClientDied(const int32_t uid)
772 {
773 int32_t sessionID = -1;
774 auto audioRendererBegin = audioRendererChangeInfos_.begin();
775 while (audioRendererBegin != audioRendererChangeInfos_.end()) {
776 const auto &audioRendererChangeInfo = *audioRendererBegin;
777 if (audioRendererChangeInfo == nullptr ||
778 (audioRendererChangeInfo->clientUID != uid && audioRendererChangeInfo->createrUID != uid)) {
779 audioRendererBegin++;
780 continue;
781 }
782 sessionID = audioRendererChangeInfo->sessionId;
783 audioRendererChangeInfo->rendererState = RENDERER_RELEASED;
784 WriteRenderStreamReleaseSysEvent(audioRendererChangeInfo);
785 if (audioPolicyServerHandler_ != nullptr) {
786 audioPolicyServerHandler_->SendRendererInfoEvent(audioRendererChangeInfos_);
787 }
788 AudioSpatializationService::GetAudioSpatializationService().UpdateRendererInfo(audioRendererChangeInfos_);
789 rendererStatequeue_.erase(make_pair(audioRendererChangeInfo->clientUID, audioRendererChangeInfo->sessionId));
790 auto temp = audioRendererBegin;
791 audioRendererBegin = audioRendererChangeInfos_.erase(temp);
792 if ((sessionID != -1) && clientTracker_.erase(sessionID)) {
793 AUDIO_INFO_LOG("TrackerClientDied:client %{public}d cleared", sessionID);
794 }
795 }
796 }
797
RegisteredCapturerTrackerClientDied(const int32_t uid)798 void AudioStreamCollector::RegisteredCapturerTrackerClientDied(const int32_t uid)
799 {
800 int32_t sessionID = -1;
801 auto audioCapturerBegin = audioCapturerChangeInfos_.begin();
802 while (audioCapturerBegin != audioCapturerChangeInfos_.end()) {
803 const auto &audioCapturerChangeInfo = *audioCapturerBegin;
804 if (audioCapturerChangeInfo == nullptr ||
805 (audioCapturerChangeInfo->clientUID != uid && audioCapturerChangeInfo->createrUID != uid)) {
806 audioCapturerBegin++;
807 continue;
808 }
809 sessionID = audioCapturerChangeInfo->sessionId;
810 audioCapturerChangeInfo->capturerState = CAPTURER_RELEASED;
811 WriteCaptureStreamReleaseSysEvent(audioCapturerChangeInfo);
812 if (audioPolicyServerHandler_ != nullptr) {
813 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
814 }
815 capturerStatequeue_.erase(make_pair(audioCapturerChangeInfo->clientUID, audioCapturerChangeInfo->sessionId));
816 auto temp = audioCapturerBegin;
817 audioCapturerBegin = audioCapturerChangeInfos_.erase(temp);
818 if ((sessionID != -1) && clientTracker_.erase(sessionID)) {
819 AUDIO_INFO_LOG("TrackerClientDied:client %{public}d cleared", sessionID);
820 }
821 }
822 }
823
RegisteredTrackerClientDied(int32_t uid)824 void AudioStreamCollector::RegisteredTrackerClientDied(int32_t uid)
825 {
826 AUDIO_INFO_LOG("TrackerClientDied:client:%{public}d Died", uid);
827
828 // Send the release state event notification for all streams of died client to registered app
829 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
830 RegisteredRendererTrackerClientDied(uid);
831 RegisteredCapturerTrackerClientDied(uid);
832 }
833
GetAndCompareStreamType(StreamUsage targetUsage,AudioRendererInfo rendererInfo)834 bool AudioStreamCollector::GetAndCompareStreamType(StreamUsage targetUsage, AudioRendererInfo rendererInfo)
835 {
836 AudioStreamType requiredType = GetStreamType(CONTENT_TYPE_UNKNOWN, targetUsage);
837 AUDIO_INFO_LOG("GetAndCompareStreamType:requiredType:%{public}d ", requiredType);
838 AudioStreamType defaultStreamType = STREAM_MUSIC;
839 auto pos = streamTypeMap_.find(make_pair(rendererInfo.contentType, rendererInfo.streamUsage));
840 if (pos != streamTypeMap_.end()) {
841 defaultStreamType = pos->second;
842 }
843 return defaultStreamType == requiredType;
844 }
845
GetUid(int32_t sessionId)846 int32_t AudioStreamCollector::GetUid(int32_t sessionId)
847 {
848 int32_t defaultUid = -1;
849 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
850 const auto &it = std::find_if(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
851 [&sessionId](const std::unique_ptr<AudioRendererChangeInfo> &changeInfo) {
852 return changeInfo->sessionId == sessionId;
853 });
854 if (it != audioRendererChangeInfos_.end()) {
855 defaultUid = (*it)->createrUID;
856 }
857 return defaultUid;
858 }
859
UpdateStreamState(int32_t clientUid,StreamSetStateEventInternal & streamSetStateEventInternal)860 int32_t AudioStreamCollector::UpdateStreamState(int32_t clientUid,
861 StreamSetStateEventInternal &streamSetStateEventInternal)
862 {
863 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
864 for (const auto &changeInfo : audioRendererChangeInfos_) {
865 if (changeInfo->clientUID == clientUid &&
866 streamSetStateEventInternal.streamUsage == changeInfo->rendererInfo.streamUsage) {
867 AUDIO_INFO_LOG("UpdateStreamState Found matching uid=%{public}d and usage=%{public}d",
868 clientUid, streamSetStateEventInternal.streamUsage);
869 std::shared_ptr<AudioClientTracker> callback = clientTracker_[changeInfo->sessionId];
870 if (callback == nullptr) {
871 AUDIO_ERR_LOG("UpdateStreamState callback failed sId:%{public}d",
872 changeInfo->sessionId);
873 continue;
874 }
875 if (streamSetStateEventInternal.streamSetState == StreamSetState::STREAM_PAUSE) {
876 callback->PausedStreamImpl(streamSetStateEventInternal);
877 } else if (streamSetStateEventInternal.streamSetState == StreamSetState::STREAM_RESUME) {
878 callback->ResumeStreamImpl(streamSetStateEventInternal);
879 }
880 }
881 }
882
883 return SUCCESS;
884 }
885
IsStreamActive(AudioStreamType volumeType)886 bool AudioStreamCollector::IsStreamActive(AudioStreamType volumeType)
887 {
888 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
889 bool result = false;
890 for (auto &changeInfo: audioRendererChangeInfos_) {
891 if (changeInfo->rendererState != RENDERER_RUNNING) {
892 continue;
893 }
894 AudioVolumeType rendererVolumeType = GetVolumeTypeFromContentUsage((changeInfo->rendererInfo).contentType,
895 (changeInfo->rendererInfo).streamUsage);
896 if (rendererVolumeType == volumeType) {
897 // An active stream has been found, return true directly.
898 AUDIO_INFO_LOG("matched clientUid: %{public}d id: %{public}d",
899 changeInfo->clientUID, changeInfo->sessionId);
900 return true;
901 }
902 }
903 return result;
904 }
905
GetRunningStream(AudioStreamType certainType,int32_t certainChannelCount)906 int32_t AudioStreamCollector::GetRunningStream(AudioStreamType certainType, int32_t certainChannelCount)
907 {
908 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
909 int32_t runningStream = -1;
910 if ((certainType == STREAM_DEFAULT) && (certainChannelCount == 0)) {
911 for (auto &changeInfo : audioRendererChangeInfos_) {
912 if (changeInfo->rendererState == RENDERER_RUNNING) {
913 runningStream = changeInfo->sessionId;
914 break;
915 }
916 }
917 } else if (certainChannelCount == 0) {
918 for (auto &changeInfo : audioRendererChangeInfos_) {
919 if ((changeInfo->rendererState == RENDERER_RUNNING) &&
920 (certainType == GetStreamType(changeInfo->rendererInfo.contentType,
921 changeInfo->rendererInfo.streamUsage))) {
922 runningStream = changeInfo->sessionId;
923 break;
924 }
925 }
926 } else {
927 for (auto &changeInfo : audioRendererChangeInfos_) {
928 if ((changeInfo->rendererState == RENDERER_RUNNING) &&
929 (certainType == GetStreamType(changeInfo->rendererInfo.contentType,
930 changeInfo->rendererInfo.streamUsage)) && (certainChannelCount == changeInfo->channelCount)) {
931 runningStream = changeInfo->sessionId;
932 break;
933 }
934 }
935 }
936 return runningStream;
937 }
938
GetVolumeTypeFromContentUsage(ContentType contentType,StreamUsage streamUsage)939 AudioStreamType AudioStreamCollector::GetVolumeTypeFromContentUsage(ContentType contentType, StreamUsage streamUsage)
940 {
941 AudioStreamType streamType = STREAM_MUSIC;
942 auto pos = streamTypeMap_.find(make_pair(contentType, streamUsage));
943 if (pos != streamTypeMap_.end()) {
944 streamType = pos->second;
945 }
946 return VolumeUtils::GetVolumeTypeFromStreamType(streamType);
947 }
948
GetStreamTypeFromSourceType(SourceType sourceType)949 AudioStreamType AudioStreamCollector::GetStreamTypeFromSourceType(SourceType sourceType)
950 {
951 switch (sourceType) {
952 case SOURCE_TYPE_MIC:
953 case SOURCE_TYPE_UNPROCESSED:
954 return STREAM_MUSIC;
955 case SOURCE_TYPE_VOICE_COMMUNICATION:
956 return STREAM_VOICE_CALL;
957 case SOURCE_TYPE_ULTRASONIC:
958 return STREAM_ULTRASONIC;
959 case SOURCE_TYPE_WAKEUP:
960 return STREAM_WAKEUP;
961 case SOURCE_TYPE_CAMCORDER:
962 return STREAM_CAMCORDER;
963 default:
964 return STREAM_MUSIC;
965 }
966 }
967
SetLowPowerVolume(int32_t streamId,float volume)968 int32_t AudioStreamCollector::SetLowPowerVolume(int32_t streamId, float volume)
969 {
970 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
971 CHECK_AND_RETURN_RET_LOG(!(clientTracker_.count(streamId) == 0),
972 ERR_INVALID_PARAM, "SetLowPowerVolume streamId invalid.");
973 std::shared_ptr<AudioClientTracker> callback = clientTracker_[streamId];
974 CHECK_AND_RETURN_RET_LOG(callback != nullptr,
975 ERR_INVALID_PARAM, "SetLowPowerVolume callback failed");
976 callback->SetLowPowerVolumeImpl(volume);
977 return SUCCESS;
978 }
979
GetLowPowerVolume(int32_t streamId)980 float AudioStreamCollector::GetLowPowerVolume(int32_t streamId)
981 {
982 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
983 float ret = 1.0; // invalue volume
984 CHECK_AND_RETURN_RET_LOG(!(clientTracker_.count(streamId) == 0),
985 ret, "GetLowPowerVolume streamId invalid.");
986 float volume;
987 std::shared_ptr<AudioClientTracker> callback = clientTracker_[streamId];
988 CHECK_AND_RETURN_RET_LOG(callback != nullptr,
989 ret, "GetLowPowerVolume callback failed");
990 callback->GetLowPowerVolumeImpl(volume);
991 return volume;
992 }
993
SetOffloadMode(int32_t streamId,int32_t state,bool isAppBack)994 int32_t AudioStreamCollector::SetOffloadMode(int32_t streamId, int32_t state, bool isAppBack)
995 {
996 std::shared_ptr<AudioClientTracker> callback;
997 {
998 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
999 CHECK_AND_RETURN_RET_LOG(!(clientTracker_.count(streamId) == 0),
1000 ERR_INVALID_PARAM, "streamId (%{public}d) invalid.", streamId);
1001 callback = clientTracker_[streamId];
1002 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback failed");
1003 }
1004 callback->SetOffloadModeImpl(state, isAppBack);
1005 return SUCCESS;
1006 }
1007
UnsetOffloadMode(int32_t streamId)1008 int32_t AudioStreamCollector::UnsetOffloadMode(int32_t streamId)
1009 {
1010 std::shared_ptr<AudioClientTracker> callback;
1011 {
1012 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1013 CHECK_AND_RETURN_RET_LOG(!(clientTracker_.count(streamId) == 0),
1014 ERR_INVALID_PARAM, "streamId (%{public}d) invalid.", streamId);
1015 callback = clientTracker_[streamId];
1016 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback failed");
1017 }
1018 callback->UnsetOffloadModeImpl();
1019 return SUCCESS;
1020 }
1021
GetSingleStreamVolume(int32_t streamId)1022 float AudioStreamCollector::GetSingleStreamVolume(int32_t streamId)
1023 {
1024 std::shared_ptr<AudioClientTracker> callback;
1025 {
1026 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1027 float ret = 1.0; // invalue volume
1028 CHECK_AND_RETURN_RET_LOG(!(clientTracker_.count(streamId) == 0),
1029 ret, "GetSingleStreamVolume streamId invalid.");
1030 callback = clientTracker_[streamId];
1031 CHECK_AND_RETURN_RET_LOG(callback != nullptr,
1032 ret, "GetSingleStreamVolume callback failed");
1033 }
1034 float volume;
1035 callback->GetSingleStreamVolumeImpl(volume);
1036 return volume;
1037 }
1038
UpdateCapturerInfoMuteStatus(int32_t uid,bool muteStatus)1039 int32_t AudioStreamCollector::UpdateCapturerInfoMuteStatus(int32_t uid, bool muteStatus)
1040 {
1041 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1042 bool capturerInfoUpdated = false;
1043 for (auto it = audioCapturerChangeInfos_.begin(); it != audioCapturerChangeInfos_.end(); it++) {
1044 if ((*it)->clientUID == uid || uid == 0) {
1045 (*it)->muted = muteStatus;
1046 capturerInfoUpdated = true;
1047 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1048 Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::CAPTURE_MUTE_STATUS_CHANGE,
1049 Media::MediaMonitor::EventType::BEHAVIOR_EVENT);
1050 bean->Add("ISOUTPUT", 0);
1051 bean->Add("STREAMID", (*it)->sessionId);
1052 bean->Add("STREAM_TYPE", (*it)->capturerInfo.sourceType);
1053 bean->Add("DEVICETYPE", (*it)->inputDeviceInfo.deviceType);
1054 bean->Add("MUTED", (*it)->muted);
1055 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1056 }
1057 }
1058
1059 if (capturerInfoUpdated && audioPolicyServerHandler_ != nullptr) {
1060 audioPolicyServerHandler_->SendCapturerInfoEvent(audioCapturerChangeInfos_);
1061 }
1062
1063 return SUCCESS;
1064 }
1065
SetAudioConcurrencyCallback(const uint32_t sessionID,const sptr<IRemoteObject> & object)1066 int32_t AudioStreamCollector::SetAudioConcurrencyCallback(const uint32_t sessionID, const sptr<IRemoteObject> &object)
1067 {
1068 return audioConcurrencyService_->SetAudioConcurrencyCallback(sessionID, object);
1069 }
1070
UnsetAudioConcurrencyCallback(const uint32_t sessionID)1071 int32_t AudioStreamCollector::UnsetAudioConcurrencyCallback(const uint32_t sessionID)
1072 {
1073 return audioConcurrencyService_->UnsetAudioConcurrencyCallback(sessionID);
1074 }
1075
ActivateAudioConcurrency(const AudioPipeType & pipeType)1076 int32_t AudioStreamCollector::ActivateAudioConcurrency(const AudioPipeType &pipeType)
1077 {
1078 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1079 return audioConcurrencyService_->ActivateAudioConcurrency(pipeType,
1080 audioRendererChangeInfos_, audioCapturerChangeInfos_);
1081 }
1082
WriterStreamChangeSysEvent(AudioMode & mode,AudioStreamChangeInfo & streamChangeInfo)1083 void AudioStreamCollector::WriterStreamChangeSysEvent(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo)
1084 {
1085 if (mode == AUDIO_MODE_PLAYBACK) {
1086 WriterRenderStreamChangeSysEvent(streamChangeInfo);
1087 } else {
1088 WriterCaptureStreamChangeSysEvent(streamChangeInfo);
1089 }
1090 }
1091
WriterRenderStreamChangeSysEvent(AudioStreamChangeInfo & streamChangeInfo)1092 void AudioStreamCollector::WriterRenderStreamChangeSysEvent(AudioStreamChangeInfo &streamChangeInfo)
1093 {
1094 bool isOutput = true;
1095 AudioStreamType streamType = GetVolumeTypeFromContentUsage(
1096 streamChangeInfo.audioRendererChangeInfo.rendererInfo.contentType,
1097 streamChangeInfo.audioRendererChangeInfo.rendererInfo.streamUsage);
1098 uint64_t transactionId = audioSystemMgr_->GetTransactionId(
1099 streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.deviceType, OUTPUT_DEVICE);
1100
1101 uint8_t effectChainType = EFFECT_CHAIN_TYPE_MAP.count(
1102 streamChangeInfo.audioRendererChangeInfo.rendererInfo.sceneType) ?
1103 EFFECT_CHAIN_TYPE_MAP.at(streamChangeInfo.audioRendererChangeInfo.rendererInfo.sceneType) :
1104 EFFECT_CHAIN_TYPE_MAP.at("UNKNOWN");
1105
1106 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1107 Media::MediaMonitor::AUDIO, Media::MediaMonitor::STREAM_CHANGE,
1108 Media::MediaMonitor::BEHAVIOR_EVENT);
1109 bean->Add("ISOUTPUT", isOutput ? 1 : 0);
1110 bean->Add("STREAMID", streamChangeInfo.audioRendererChangeInfo.sessionId);
1111 bean->Add("UID", streamChangeInfo.audioRendererChangeInfo.clientUID);
1112 bean->Add("PID", streamChangeInfo.audioRendererChangeInfo.clientPid);
1113 bean->Add("TRANSACTIONID", transactionId);
1114 bean->Add("STREAMTYPE", streamType);
1115 bean->Add("STATE", streamChangeInfo.audioRendererChangeInfo.rendererState);
1116 bean->Add("DEVICETYPE", streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.deviceType);
1117 bean->Add("BT_TYPE", streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.deviceCategory);
1118 bean->Add("PIPE_TYPE", streamChangeInfo.audioRendererChangeInfo.rendererInfo.pipeType);
1119 bean->Add("STREAM_TYPE", streamChangeInfo.audioRendererChangeInfo.rendererInfo.streamUsage);
1120 bean->Add("SAMPLE_RATE", streamChangeInfo.audioRendererChangeInfo.rendererInfo.samplingRate);
1121 bean->Add("NETWORKID", ConvertNetworkId(streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.networkId));
1122 bean->Add("ENCODING_TYPE", streamChangeInfo.audioRendererChangeInfo.rendererInfo.encodingType);
1123 bean->Add("CHANNEL_LAYOUT", streamChangeInfo.audioRendererChangeInfo.rendererInfo.channelLayout);
1124 bean->Add("EFFECT_CHAIN", effectChainType);
1125 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1126 }
1127
WriterCaptureStreamChangeSysEvent(AudioStreamChangeInfo & streamChangeInfo)1128 void AudioStreamCollector::WriterCaptureStreamChangeSysEvent(AudioStreamChangeInfo &streamChangeInfo)
1129 {
1130 bool isOutput = false;
1131 AudioStreamType streamType = GetStreamTypeFromSourceType(
1132 streamChangeInfo.audioCapturerChangeInfo.capturerInfo.sourceType);
1133 uint64_t transactionId = audioSystemMgr_->GetTransactionId(
1134 streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.deviceType, INPUT_DEVICE);
1135
1136 uint8_t effectChainType = EFFECT_CHAIN_TYPE_MAP.count(
1137 streamChangeInfo.audioCapturerChangeInfo.capturerInfo.sceneType) ?
1138 EFFECT_CHAIN_TYPE_MAP.at(streamChangeInfo.audioCapturerChangeInfo.capturerInfo.sceneType) :
1139 EFFECT_CHAIN_TYPE_MAP.at("UNKNOWN");
1140
1141 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1142 Media::MediaMonitor::AUDIO, Media::MediaMonitor::STREAM_CHANGE,
1143 Media::MediaMonitor::BEHAVIOR_EVENT);
1144 bean->Add("ISOUTPUT", isOutput ? 1 : 0);
1145 bean->Add("STREAMID", streamChangeInfo.audioCapturerChangeInfo.sessionId);
1146 bean->Add("UID", streamChangeInfo.audioCapturerChangeInfo.clientUID);
1147 bean->Add("PID", streamChangeInfo.audioCapturerChangeInfo.clientPid);
1148 bean->Add("TRANSACTIONID", transactionId);
1149 bean->Add("STREAMTYPE", streamType);
1150 bean->Add("STATE", streamChangeInfo.audioCapturerChangeInfo.capturerState);
1151 bean->Add("DEVICETYPE", streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.deviceType);
1152 bean->Add("BT_TYPE", streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.deviceCategory);
1153 bean->Add("PIPE_TYPE", streamChangeInfo.audioCapturerChangeInfo.capturerInfo.pipeType);
1154 bean->Add("STREAM_TYPE", streamChangeInfo.audioCapturerChangeInfo.capturerInfo.sourceType);
1155 bean->Add("SAMPLE_RATE", streamChangeInfo.audioCapturerChangeInfo.capturerInfo.samplingRate);
1156 bean->Add("MUTED", streamChangeInfo.audioCapturerChangeInfo.muted);
1157 bean->Add("NETWORKID", ConvertNetworkId(streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.networkId));
1158 bean->Add("ENCODING_TYPE", streamChangeInfo.audioCapturerChangeInfo.capturerInfo.encodingType);
1159 bean->Add("CHANNEL_LAYOUT", streamChangeInfo.audioCapturerChangeInfo.capturerInfo.channelLayout);
1160 bean->Add("EFFECT_CHAIN", effectChainType);
1161 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1162 }
1163
1164
WriteRenderStreamReleaseSysEvent(const std::unique_ptr<AudioRendererChangeInfo> & audioRendererChangeInfo)1165 void AudioStreamCollector::WriteRenderStreamReleaseSysEvent(
1166 const std::unique_ptr<AudioRendererChangeInfo> &audioRendererChangeInfo)
1167 {
1168 AudioStreamType streamType = GetVolumeTypeFromContentUsage(audioRendererChangeInfo->rendererInfo.contentType,
1169 audioRendererChangeInfo->rendererInfo.streamUsage);
1170 uint64_t transactionId = audioSystemMgr_->GetTransactionId(
1171 audioRendererChangeInfo->outputDeviceInfo.deviceType, OUTPUT_DEVICE);
1172
1173 uint8_t effectChainType = EFFECT_CHAIN_TYPE_MAP.count(
1174 audioRendererChangeInfo->rendererInfo.sceneType) ?
1175 EFFECT_CHAIN_TYPE_MAP.at(audioRendererChangeInfo->rendererInfo.sceneType) :
1176 EFFECT_CHAIN_TYPE_MAP.at("UNKNOWN");
1177
1178 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1179 Media::MediaMonitor::AUDIO, Media::MediaMonitor::STREAM_CHANGE,
1180 Media::MediaMonitor::BEHAVIOR_EVENT);
1181 bean->Add("ISOUTPUT", 1);
1182 bean->Add("STREAMID", audioRendererChangeInfo->sessionId);
1183 bean->Add("UID", audioRendererChangeInfo->clientUID);
1184 bean->Add("PID", audioRendererChangeInfo->clientPid);
1185 bean->Add("TRANSACTIONID", transactionId);
1186 bean->Add("STREAMTYPE", streamType);
1187 bean->Add("STATE", audioRendererChangeInfo->rendererState);
1188 bean->Add("DEVICETYPE", audioRendererChangeInfo->outputDeviceInfo.deviceType);
1189 bean->Add("BT_TYPE", audioRendererChangeInfo->outputDeviceInfo.deviceCategory);
1190 bean->Add("PIPE_TYPE", audioRendererChangeInfo->rendererInfo.pipeType);
1191 bean->Add("STREAM_TYPE", audioRendererChangeInfo->rendererInfo.streamUsage);
1192 bean->Add("SAMPLE_RATE", audioRendererChangeInfo->rendererInfo.samplingRate);
1193 bean->Add("NETWORKID", ConvertNetworkId(audioRendererChangeInfo->outputDeviceInfo.networkId));
1194 bean->Add("ENCODING_TYPE", audioRendererChangeInfo->rendererInfo.encodingType);
1195 bean->Add("CHANNEL_LAYOUT", audioRendererChangeInfo->rendererInfo.channelLayout);
1196 bean->Add("EFFECT_CHAIN", effectChainType);
1197 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1198 }
1199
WriteCaptureStreamReleaseSysEvent(const std::unique_ptr<AudioCapturerChangeInfo> & audioCapturerChangeInfo)1200 void AudioStreamCollector::WriteCaptureStreamReleaseSysEvent(
1201 const std::unique_ptr<AudioCapturerChangeInfo> &audioCapturerChangeInfo)
1202 {
1203 AudioStreamType streamType = GetStreamTypeFromSourceType(audioCapturerChangeInfo->capturerInfo.sourceType);
1204 uint64_t transactionId = audioSystemMgr_->GetTransactionId(
1205 audioCapturerChangeInfo->inputDeviceInfo.deviceType, INPUT_DEVICE);
1206
1207 uint8_t effectChainType = EFFECT_CHAIN_TYPE_MAP.count(
1208 audioCapturerChangeInfo->capturerInfo.sceneType) ?
1209 EFFECT_CHAIN_TYPE_MAP.at(audioCapturerChangeInfo->capturerInfo.sceneType) :
1210 EFFECT_CHAIN_TYPE_MAP.at("UNKNOWN");
1211
1212 std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
1213 Media::MediaMonitor::AUDIO, Media::MediaMonitor::STREAM_CHANGE,
1214 Media::MediaMonitor::BEHAVIOR_EVENT);
1215 bean->Add("ISOUTPUT", 1);
1216 bean->Add("STREAMID", audioCapturerChangeInfo->sessionId);
1217 bean->Add("UID", audioCapturerChangeInfo->clientUID);
1218 bean->Add("PID", audioCapturerChangeInfo->clientPid);
1219 bean->Add("TRANSACTIONID", transactionId);
1220 bean->Add("STREAMTYPE", streamType);
1221 bean->Add("STATE", audioCapturerChangeInfo->capturerState);
1222 bean->Add("DEVICETYPE", audioCapturerChangeInfo->inputDeviceInfo.deviceType);
1223 bean->Add("BT_TYPE", audioCapturerChangeInfo->inputDeviceInfo.deviceCategory);
1224 bean->Add("PIPE_TYPE", audioCapturerChangeInfo->capturerInfo.pipeType);
1225 bean->Add("STREAM_TYPE", audioCapturerChangeInfo->capturerInfo.sourceType);
1226 bean->Add("SAMPLE_RATE", audioCapturerChangeInfo->capturerInfo.samplingRate);
1227 bean->Add("MUTED", audioCapturerChangeInfo->muted);
1228 bean->Add("NETWORKID", ConvertNetworkId(audioCapturerChangeInfo->inputDeviceInfo.networkId));
1229 bean->Add("ENCODING_TYPE", audioCapturerChangeInfo->capturerInfo.encodingType);
1230 bean->Add("CHANNEL_LAYOUT", audioCapturerChangeInfo->capturerInfo.channelLayout);
1231 bean->Add("EFFECT_CHAIN", effectChainType);
1232 Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
1233 }
1234
IsCallStreamUsage(StreamUsage usage)1235 bool AudioStreamCollector::IsCallStreamUsage(StreamUsage usage)
1236 {
1237 if (usage == STREAM_USAGE_VOICE_COMMUNICATION || usage == STREAM_USAGE_VIDEO_COMMUNICATION ||
1238 usage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
1239 return true;
1240 }
1241 return false;
1242 }
1243
GetRunningStreamUsageNoUltrasonic()1244 StreamUsage AudioStreamCollector::GetRunningStreamUsageNoUltrasonic()
1245 {
1246 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1247 for (const auto &changeInfo : audioRendererChangeInfos_) {
1248 if (changeInfo->rendererState == RENDERER_RUNNING &&
1249 changeInfo->rendererInfo.streamUsage != STREAM_USAGE_ULTRASONIC) {
1250 return changeInfo->rendererInfo.streamUsage;
1251 }
1252 }
1253 return STREAM_USAGE_INVALID;
1254 }
1255
GetRunningSourceTypeNoUltrasonic()1256 SourceType AudioStreamCollector::GetRunningSourceTypeNoUltrasonic()
1257 {
1258 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1259 for (const auto &changeInfo : audioCapturerChangeInfos_) {
1260 if (changeInfo->capturerState == CAPTURER_RUNNING &&
1261 changeInfo->capturerInfo.sourceType != SOURCE_TYPE_ULTRASONIC) {
1262 return changeInfo->capturerInfo.sourceType;
1263 }
1264 }
1265 return SOURCE_TYPE_INVALID;
1266 }
1267
GetLastestRunningCallStreamUsage()1268 StreamUsage AudioStreamCollector::GetLastestRunningCallStreamUsage()
1269 {
1270 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1271 for (const auto &changeInfo : audioRendererChangeInfos_) {
1272 StreamUsage usage = changeInfo->rendererInfo.streamUsage;
1273 RendererState state = changeInfo->rendererState;
1274 if ((IsCallStreamUsage(usage) && state == RENDERER_RUNNING) ||
1275 (usage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION && state == RENDERER_PREPARED)) {
1276 return usage;
1277 }
1278 }
1279 return STREAM_USAGE_UNKNOWN;
1280 }
1281
GetAllRendererSessionIDForUID(int32_t uid)1282 std::vector<uint32_t> AudioStreamCollector::GetAllRendererSessionIDForUID(int32_t uid)
1283 {
1284 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1285 std::vector<uint32_t> sessionIDSet;
1286 for (const auto &changeInfo : audioRendererChangeInfos_) {
1287 if (changeInfo->clientUID == uid) {
1288 sessionIDSet.push_back(changeInfo->sessionId);
1289 }
1290 }
1291 return sessionIDSet;
1292 }
1293
ChangeVoipCapturerStreamToNormal()1294 bool AudioStreamCollector::ChangeVoipCapturerStreamToNormal()
1295 {
1296 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1297 int count = std::count_if(audioCapturerChangeInfos_.begin(), audioCapturerChangeInfos_.end(),
1298 [](const auto &changeInfo) {
1299 const auto &sourceType = changeInfo->capturerInfo.sourceType;
1300 return sourceType == SOURCE_TYPE_VOICE_COMMUNICATION || sourceType == SOURCE_TYPE_MIC ||
1301 sourceType == SOURCE_TYPE_VOICE_MESSAGE || sourceType == SOURCE_TYPE_VOICE_TRANSCRIPTION;
1302 });
1303
1304 AUDIO_INFO_LOG("Has capture stream count: %{public}d", count);
1305 // becasue self has been added
1306 return count > 1;
1307 }
1308
HasVoipRendererStream()1309 bool AudioStreamCollector::HasVoipRendererStream()
1310 {
1311 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1312 // judge stream original flage is AUDIO_FLAG_VOIP_FAST
1313 bool hasVoip = std::any_of(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
1314 [](const auto &changeInfo) {
1315 return changeInfo->rendererInfo.originalFlag == AUDIO_FLAG_VOIP_FAST;
1316 });
1317
1318 AUDIO_INFO_LOG("Has Fast Voip stream : %{public}d", hasVoip);
1319 return hasVoip;
1320 }
1321
HasRunningRendererStream()1322 bool AudioStreamCollector::HasRunningRendererStream()
1323 {
1324 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1325 // judge stream state is running
1326 bool hasRunningRendererStream = std::any_of(audioRendererChangeInfos_.begin(), audioRendererChangeInfos_.end(),
1327 [](const auto &changeInfo) {
1328 return ((changeInfo->rendererState == RENDERER_RUNNING) || (changeInfo->rendererInfo.streamUsage ==
1329 STREAM_USAGE_VOICE_MODEM_COMMUNICATION && changeInfo->rendererState == RENDERER_PREPARED));
1330 });
1331 AUDIO_INFO_LOG("Has Running Renderer stream : %{public}d", hasRunningRendererStream);
1332 return hasRunningRendererStream;
1333 }
1334
HasRunningRecognitionCapturerStream()1335 bool AudioStreamCollector::HasRunningRecognitionCapturerStream()
1336 {
1337 std::lock_guard<std::mutex> lock(streamsInfoMutex_);
1338 // judge stream state is running
1339 bool hasRunningRecognitionCapturerStream = std::any_of(audioCapturerChangeInfos_.begin(),
1340 audioCapturerChangeInfos_.end(),
1341 [](const auto &changeInfo) {
1342 return ((changeInfo->capturerState == CAPTURER_RUNNING) && (changeInfo->capturerInfo.sourceType ==
1343 SOURCE_TYPE_VOICE_RECOGNITION));
1344 });
1345
1346 AUDIO_INFO_LOG("Has Running Recognition stream : %{public}d", hasRunningRecognitionCapturerStream);
1347 return hasRunningRecognitionCapturerStream;
1348 }
1349 } // namespace AudioStandard
1350 } // namespace OHOS
1351