1 /*
2 * Copyright (c) 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 "AudioStreamTracker"
17 #endif
18
19 #include "audio_stream_tracker.h"
20 #include "audio_policy_manager.h"
21
22 namespace OHOS {
23 namespace AudioStandard {
AudioStreamTracker(AudioMode mode,int32_t clientUid)24 AudioStreamTracker::AudioStreamTracker(AudioMode mode, int32_t clientUid)
25 {
26 AUDIO_DEBUG_LOG("AudioStreamtracker:CTOR");
27 eMode_ = mode;
28 clientUid_ = clientUid;
29 state_ = INVALID;
30 }
31
~AudioStreamTracker()32 AudioStreamTracker::~AudioStreamTracker() {}
33
RegisterTracker(const AudioRegisterTrackerInfo & registerTrackerInfo,const std::shared_ptr<AudioClientTracker> & clientTrackerObj)34 void AudioStreamTracker::RegisterTracker(const AudioRegisterTrackerInfo ®isterTrackerInfo,
35 const std::shared_ptr<AudioClientTracker> &clientTrackerObj)
36 {
37 AUDIO_DEBUG_LOG("Register tracker entered");
38 AudioStreamChangeInfo streamChangeInfo;
39
40 state_ = registerTrackerInfo.state;
41
42 if (eMode_ == AUDIO_MODE_PLAYBACK) {
43 streamChangeInfo.audioRendererChangeInfo.clientUID = clientUid_;
44 streamChangeInfo.audioRendererChangeInfo.sessionId = registerTrackerInfo.sessionId;
45 streamChangeInfo.audioRendererChangeInfo.clientPid = registerTrackerInfo.clientPid;
46 streamChangeInfo.audioRendererChangeInfo.rendererState = static_cast<RendererState>(registerTrackerInfo.state);
47 streamChangeInfo.audioRendererChangeInfo.rendererInfo = registerTrackerInfo.rendererInfo;
48 streamChangeInfo.audioRendererChangeInfo.outputDeviceInfo.deviceRole = OUTPUT_DEVICE;
49 streamChangeInfo.audioRendererChangeInfo.channelCount = registerTrackerInfo.channelCount;
50 } else {
51 streamChangeInfo.audioCapturerChangeInfo.clientUID = clientUid_;
52 streamChangeInfo.audioCapturerChangeInfo.sessionId = registerTrackerInfo.sessionId;
53 streamChangeInfo.audioCapturerChangeInfo.clientPid = registerTrackerInfo.clientPid;
54 streamChangeInfo.audioCapturerChangeInfo.capturerState = static_cast<CapturerState>(registerTrackerInfo.state);
55 streamChangeInfo.audioCapturerChangeInfo.capturerInfo = registerTrackerInfo.capturerInfo;
56 streamChangeInfo.audioCapturerChangeInfo.inputDeviceInfo.deviceRole = INPUT_DEVICE;
57 streamChangeInfo.audioCapturerChangeInfo.appTokenId = registerTrackerInfo.appTokenId;
58 }
59 AudioPolicyManager::GetInstance().RegisterTracker(eMode_, streamChangeInfo, clientTrackerObj);
60 }
61
UpdateTracker(const int32_t sessionId,const State state,const int32_t clientPid,const AudioRendererInfo & rendererInfo,const AudioCapturerInfo & capturerInfo)62 void AudioStreamTracker::UpdateTracker(const int32_t sessionId, const State state, const int32_t clientPid,
63 const AudioRendererInfo &rendererInfo, const AudioCapturerInfo &capturerInfo)
64 {
65 AUDIO_DEBUG_LOG("Update tracker entered");
66 AudioStreamChangeInfo streamChangeInfo;
67
68 if (state_ == INVALID || (state_ == state &&
69 isOffloadAllowed == rendererInfo.isOffloadAllowed && pipeType == rendererInfo.pipeType)) {
70 AUDIO_DEBUG_LOG("Update tracker is called in wrong state/same state");
71 return;
72 }
73
74 state_ = state;
75 isOffloadAllowed = rendererInfo.isOffloadAllowed;
76 pipeType = rendererInfo.pipeType;
77 if (eMode_ == AUDIO_MODE_PLAYBACK) {
78 streamChangeInfo.audioRendererChangeInfo.clientUID = clientUid_;
79 streamChangeInfo.audioRendererChangeInfo.sessionId = sessionId;
80 streamChangeInfo.audioRendererChangeInfo.clientPid = clientPid;
81 streamChangeInfo.audioRendererChangeInfo.rendererState = static_cast<RendererState>(state);
82 streamChangeInfo.audioRendererChangeInfo.rendererInfo = rendererInfo;
83 } else {
84 streamChangeInfo.audioCapturerChangeInfo.clientUID = clientUid_;
85 streamChangeInfo.audioCapturerChangeInfo.sessionId = sessionId;
86 streamChangeInfo.audioCapturerChangeInfo.clientPid = clientPid;
87 streamChangeInfo.audioCapturerChangeInfo.capturerState = static_cast<CapturerState>(state);
88 streamChangeInfo.audioCapturerChangeInfo.capturerInfo = capturerInfo;
89 }
90 std::lock_guard<std::mutex> lock(trackStateLock_);
91 AudioPolicyManager::GetInstance().UpdateTracker(eMode_, streamChangeInfo);
92 }
93
FetchOutputDeviceForTrack(const int32_t sessionId,const State state,const int32_t clientPid,const AudioRendererInfo & rendererInfo,const AudioStreamDeviceChangeReasonExt reason)94 void AudioStreamTracker::FetchOutputDeviceForTrack(const int32_t sessionId, const State state, const int32_t clientPid,
95 const AudioRendererInfo &rendererInfo, const AudioStreamDeviceChangeReasonExt reason)
96 {
97 AUDIO_DEBUG_LOG("entered");
98 if (eMode_ == AUDIO_MODE_PLAYBACK) {
99 AudioStreamChangeInfo streamChangeInfo;
100 streamChangeInfo.audioRendererChangeInfo.clientUID = clientUid_;
101 streamChangeInfo.audioRendererChangeInfo.sessionId = sessionId;
102 streamChangeInfo.audioRendererChangeInfo.clientPid = clientPid;
103 streamChangeInfo.audioRendererChangeInfo.rendererState = static_cast<RendererState>(state);
104 streamChangeInfo.audioRendererChangeInfo.rendererInfo = rendererInfo;
105 AudioPolicyManager::GetInstance().FetchOutputDeviceForTrack(streamChangeInfo, reason);
106 }
107 }
108
FetchInputDeviceForTrack(const int32_t sessionId,const State state,const int32_t clientPid,const AudioCapturerInfo & capturerInfo)109 void AudioStreamTracker::FetchInputDeviceForTrack(const int32_t sessionId, const State state, const int32_t clientPid,
110 const AudioCapturerInfo &capturerInfo)
111 {
112 AUDIO_DEBUG_LOG("entered");
113 if (eMode_ == AUDIO_MODE_RECORD) {
114 AudioStreamChangeInfo streamChangeInfo;
115 streamChangeInfo.audioCapturerChangeInfo.clientUID = clientUid_;
116 streamChangeInfo.audioCapturerChangeInfo.sessionId = sessionId;
117 streamChangeInfo.audioCapturerChangeInfo.clientPid = clientPid;
118 streamChangeInfo.audioCapturerChangeInfo.capturerState = static_cast<CapturerState>(state);
119 streamChangeInfo.audioCapturerChangeInfo.capturerInfo = capturerInfo;
120 AudioPolicyManager::GetInstance().FetchInputDeviceForTrack(streamChangeInfo);
121 }
122 }
123 } // namespace AudioStandard
124 } // namespace OHOS
125