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 &registerTrackerInfo,
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