1 /*
2 * Copyright (c) 2022-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
16 #include "i_audio_capturer_source.h"
17
18 #include <cstring>
19 #include <string>
20
21 #include "audio_capturer_file_source.h"
22 #include "audio_capturer_source.h"
23 #include "audio_errors.h"
24 #include "audio_log.h"
25 #include "remote_audio_capturer_source.h"
26
27 using namespace std;
28
29 namespace OHOS {
30 namespace AudioStandard {
GetInstance(const char * deviceClass,const char * deviceNetworkId,const SourceType sourceType,const char * sourceName)31 IAudioCapturerSource *IAudioCapturerSource::GetInstance(const char *deviceClass, const char *deviceNetworkId,
32 const SourceType sourceType, const char *sourceName)
33 {
34 AUDIO_DEBUG_LOG("%{public}s Source:GetInstance deviceNetworkId:[%{public}s] sourceType:[%{public}d]",
35 deviceClass, deviceNetworkId, sourceType);
36 const char *deviceClassPrimary = "primary";
37 const char *deviceClassA2DP = "a2dp";
38 const char *deviceClassFile = "file_io";
39 const char *deviceClassRemote = "remote";
40
41 if (!strcmp(deviceClass, deviceClassPrimary)) {
42 return AudioCapturerSource::GetInstance(sourceType, sourceName);
43 }
44 if (!strcmp(deviceClass, deviceClassA2DP)) {
45 static AudioCapturerFileSource audioCapturer;
46 return &audioCapturer;
47 }
48 if (!strcmp(deviceClass, deviceClassFile)) {
49 static AudioCapturerFileSource audioCapturer;
50 return &audioCapturer;
51 }
52 if (!strcmp(deviceClass, deviceClassRemote)) {
53 std::string networkId = deviceNetworkId;
54 RemoteAudioCapturerSource *rSource = RemoteAudioCapturerSource::GetInstance(networkId);
55 return rSource;
56 }
57 return nullptr;
58 }
59 } // namespace AudioStandard
60 } // namesapce OHOS
61
62 #ifdef __cplusplus
63 extern "C" {
64 #endif
65
66 using namespace OHOS::AudioStandard;
67
FillinSourceWapper(const char * deviceClass,const char * deviceNetworkId,const SourceType sourceType,const char * sourceName,void ** wapper)68 int32_t FillinSourceWapper(const char *deviceClass, const char *deviceNetworkId,
69 const SourceType sourceType, const char *sourceName, void **wapper)
70 {
71 IAudioCapturerSource *iSource = IAudioCapturerSource::GetInstance(deviceClass,
72 deviceNetworkId,
73 sourceType,
74 sourceName);
75
76 if (iSource != nullptr) {
77 *wapper = static_cast<void *>(iSource);
78 return SUCCESS;
79 }
80 return ERROR;
81 }
82
83 IAudioCapturerSource *iAudioCapturerSource = nullptr;
84
IAudioCapturerSourceInit(void * wapper,IAudioSourceAttr * attr)85 int32_t IAudioCapturerSourceInit(void *wapper, IAudioSourceAttr *attr)
86 {
87 int32_t ret;
88
89 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
90 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
91 if (iAudioCapturerSource->IsInited())
92 return SUCCESS;
93
94 ret = iAudioCapturerSource->Init(*attr);
95
96 return ret;
97 }
98
IAudioCapturerSourceDeInit(void * wapper)99 void IAudioCapturerSourceDeInit(void *wapper)
100 {
101 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
102 CHECK_AND_RETURN_LOG(iAudioCapturerSource != nullptr, "null audioCapturerSource");
103 if (iAudioCapturerSource->IsInited())
104 iAudioCapturerSource->DeInit();
105 }
106
IAudioCapturerSourceStop(void * wapper)107 int32_t IAudioCapturerSourceStop(void *wapper)
108 {
109 int32_t ret;
110
111 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
112 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
113 if (!iAudioCapturerSource->IsInited())
114 return SUCCESS;
115
116 ret = iAudioCapturerSource->Stop();
117
118 return ret;
119 }
120
IAudioCapturerSourceStart(void * wapper)121 int32_t IAudioCapturerSourceStart(void *wapper)
122 {
123 int32_t ret;
124
125 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
126 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
127 if (!iAudioCapturerSource->IsInited()) {
128 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
129 return ERR_DEVICE_INIT;
130 }
131
132 ret = iAudioCapturerSource->Start();
133
134 return ret;
135 }
136
IAudioCapturerSourceFrame(void * wapper,char * frame,uint64_t requestBytes,uint64_t * replyBytes)137 int32_t IAudioCapturerSourceFrame(void *wapper, char *frame, uint64_t requestBytes, uint64_t *replyBytes)
138 {
139 int32_t ret;
140 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
141 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
142 if (!iAudioCapturerSource->IsInited()) {
143 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
144 return ERR_DEVICE_INIT;
145 }
146
147 ret = iAudioCapturerSource->CaptureFrame(frame, requestBytes, *replyBytes);
148
149 return ret;
150 }
151
IAudioCapturerSourceSetVolume(void * wapper,float left,float right)152 int32_t IAudioCapturerSourceSetVolume(void *wapper, float left, float right)
153 {
154 int32_t ret;
155
156 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
157 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
158 if (!iAudioCapturerSource->IsInited()) {
159 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
160 return ERR_DEVICE_INIT;
161 }
162
163 ret = iAudioCapturerSource->SetVolume(left, right);
164
165 return ret;
166 }
167
IAudioCapturerSourceGetVolume(void * wapper,float * left,float * right)168 int32_t IAudioCapturerSourceGetVolume(void *wapper, float *left, float *right)
169 {
170 int32_t ret;
171
172 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
173 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
174 if (!iAudioCapturerSource->IsInited()) {
175 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
176 return ERR_DEVICE_INIT;
177 }
178 ret = iAudioCapturerSource->GetVolume(*left, *right);
179
180 return ret;
181 }
182
IAudioCapturerSourceIsMuteRequired(void * wapper)183 bool IAudioCapturerSourceIsMuteRequired(void *wapper)
184 {
185 bool muteStat = false;
186 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
187 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, muteStat, "null audioCapturerSource");
188 if (!iAudioCapturerSource->IsInited()) {
189 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
190 return muteStat;
191 }
192 iAudioCapturerSource->GetMute(muteStat);
193 return muteStat;
194 }
195
IAudioCapturerSourceSetMute(void * wapper,bool isMute)196 int32_t IAudioCapturerSourceSetMute(void *wapper, bool isMute)
197 {
198 int32_t ret;
199 IAudioCapturerSource *iAudioCapturerSource = static_cast<IAudioCapturerSource *>(wapper);
200 CHECK_AND_RETURN_RET_LOG(iAudioCapturerSource != nullptr, ERR_INVALID_HANDLE, "null audioCapturerSource");
201 if (!iAudioCapturerSource->IsInited()) {
202 AUDIO_ERR_LOG("audioCapturer Not Inited! Init the capturer first\n");
203 return ERR_DEVICE_INIT;
204 }
205
206 ret = iAudioCapturerSource->SetMute(isMute);
207
208 return ret;
209 }
210 #ifdef __cplusplus
211 }
212 #endif
213