1 /*
2  * Copyright (c) 2023 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 "PlaybackCapturerManager"
17 #endif
18 
19 #include "playback_capturer_manager.h"
20 
21 #include <cstdlib>
22 #include <cstdio>
23 #include <cstring>
24 #include <cstdint>
25 #include <vector>
26 #include <unordered_set>
27 
28 #include "audio_info.h"
29 #include "audio_common_log.h"
30 #include "audio_errors.h"
31 #include "playback_capturer_adapter.h"
32 
33 using namespace OHOS::AudioStandard;
34 
IsStreamSupportInnerCapturer(int32_t streamUsage)35 bool IsStreamSupportInnerCapturer(int32_t streamUsage)
36 {
37     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
38     CHECK_AND_RETURN_RET_LOG(playbackCapturerMgr != nullptr, false,
39         "IsStreamSupportInnerCapturer return false for null manager.");
40 
41     return playbackCapturerMgr->IsStreamSupportInnerCapturer(streamUsage);
42 }
43 
IsPrivacySupportInnerCapturer(int32_t privacyType)44 bool IsPrivacySupportInnerCapturer(int32_t privacyType)
45 {
46     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
47     CHECK_AND_RETURN_RET_LOG(playbackCapturerMgr != nullptr, false,
48         "IsPrivacySupportInnerCapturer return false for null manager.");
49 
50     return playbackCapturerMgr->IsPrivacySupportInnerCapturer(privacyType);
51 }
52 
IsCaptureSilently()53 bool IsCaptureSilently()
54 {
55     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
56     CHECK_AND_RETURN_RET_LOG(playbackCapturerMgr != nullptr, false,
57         "IsCaptureSilently return false for null manager.");
58 
59     return playbackCapturerMgr->IsCaptureSilently();
60 }
61 
GetInnerCapturerState()62 extern "C" __attribute__((visibility("default"))) bool GetInnerCapturerState()
63 {
64     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
65     CHECK_AND_RETURN_RET_LOG(playbackCapturerMgr != nullptr, false,
66         "IsCaptureSilently return false for null manager.");
67 
68     return playbackCapturerMgr->GetInnerCapturerState();
69 }
70 
SetInnerCapturerState(bool state)71 extern "C" __attribute__((visibility("default"))) void SetInnerCapturerState(bool state)
72 {
73     PlaybackCapturerManager *playbackCapturerMgr = PlaybackCapturerManager::GetInstance();
74     CHECK_AND_RETURN_LOG(playbackCapturerMgr != nullptr, "IsCaptureSilently return false for null manager.");
75 
76     playbackCapturerMgr->SetInnerCapturerState(state);
77 }
78 
79 namespace OHOS {
80 namespace AudioStandard {
81 
PlaybackCapturerManager()82 PlaybackCapturerManager::PlaybackCapturerManager() {}
83 
~PlaybackCapturerManager()84 PlaybackCapturerManager::~PlaybackCapturerManager() {}
85 
GetInstance()86 PlaybackCapturerManager* PlaybackCapturerManager::GetInstance()
87 {
88     static PlaybackCapturerManager playbackCapturerMgr;
89     return &playbackCapturerMgr;
90 }
91 
SetSupportStreamUsage(std::vector<int32_t> usage)92 void PlaybackCapturerManager::SetSupportStreamUsage(std::vector<int32_t> usage)
93 {
94     std::lock_guard<std::mutex> lock(setMutex_);
95     supportStreamUsageSet_.clear();
96     if (usage.empty()) {
97         AUDIO_INFO_LOG("Clear support streamUsage");
98         return;
99     }
100     for (size_t i = 0; i < usage.size(); i++) {
101         supportStreamUsageSet_.emplace(usage[i]);
102     }
103 }
104 
IsStreamSupportInnerCapturer(int32_t streamUsage)105 bool PlaybackCapturerManager::IsStreamSupportInnerCapturer(int32_t streamUsage)
106 {
107     std::lock_guard<std::mutex> lock(setMutex_);
108     if (supportStreamUsageSet_.empty()) {
109         return streamUsage == STREAM_USAGE_MEDIA || streamUsage == STREAM_USAGE_MUSIC ||
110             streamUsage == STREAM_USAGE_MOVIE || streamUsage == STREAM_USAGE_GAME ||
111             streamUsage == STREAM_USAGE_AUDIOBOOK;
112     }
113     return supportStreamUsageSet_.find(streamUsage) != supportStreamUsageSet_.end();
114 }
115 
IsPrivacySupportInnerCapturer(int32_t privacyType)116 bool PlaybackCapturerManager::IsPrivacySupportInnerCapturer(int32_t privacyType)
117 {
118     return privacyType == PRIVACY_TYPE_PUBLIC;
119 }
120 
SetCaptureSilentState(bool state)121 void PlaybackCapturerManager::SetCaptureSilentState(bool state)
122 {
123     isCaptureSilently_ = state;
124 }
125 
IsCaptureSilently()126 bool PlaybackCapturerManager::IsCaptureSilently()
127 {
128     return isCaptureSilently_;
129 }
130 
SetInnerCapturerState(bool state)131 void PlaybackCapturerManager::SetInnerCapturerState(bool state)
132 {
133     isInnerCapturerRunning_ = state;
134 }
135 
GetInnerCapturerState()136 bool PlaybackCapturerManager::GetInnerCapturerState()
137 {
138     return isInnerCapturerRunning_;
139 }
140 
GetDefaultUsages()141 std::vector<StreamUsage> PlaybackCapturerManager::GetDefaultUsages()
142 {
143     return defaultUsages_;
144 }
145 
RegisterCapturerFilterListener(ICapturerFilterListener * listener)146 bool PlaybackCapturerManager::RegisterCapturerFilterListener(ICapturerFilterListener *listener)
147 {
148     if (listener == nullptr || listener_ != nullptr) {
149         AUDIO_ERR_LOG("Register fail: listener is %{public}s", (listener == nullptr ? "null." : "already set."));
150         return false;
151     }
152     AUDIO_INFO_LOG("Register success");
153     listener_ = listener;
154     return true;
155 }
156 
SetPlaybackCapturerFilterInfo(uint32_t sessionId,const AudioPlaybackCaptureConfig & config)157 int32_t PlaybackCapturerManager::SetPlaybackCapturerFilterInfo(uint32_t sessionId,
158     const AudioPlaybackCaptureConfig &config)
159 {
160     CHECK_AND_RETURN_RET_LOG(listener_ != nullptr, ERR_ILLEGAL_STATE, "listener is null!");
161 
162     return listener_->OnCapturerFilterChange(sessionId, config);
163 }
164 
RemovePlaybackCapturerFilterInfo(uint32_t sessionId)165 int32_t PlaybackCapturerManager::RemovePlaybackCapturerFilterInfo(uint32_t sessionId)
166 {
167     CHECK_AND_RETURN_RET_LOG(listener_ != nullptr, ERR_ILLEGAL_STATE, "listener is null!");
168 
169     return listener_->OnCapturerFilterRemove(sessionId);
170 }
171 } // namespace OHOS
172 } // namespace AudioStandard