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