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
16 #include "i_audio_renderer_sink.h"
17 #include "i_audio_renderer_sink_intf.h"
18
19 #include "audio_errors.h"
20 #include "audio_log.h"
21
22 #include "audio_renderer_sink.h"
23 #include "audio_renderer_file_sink.h"
24 #include "bluetooth_renderer_sink.h"
25 #include "remote_audio_renderer_sink.h"
26
27
28 namespace OHOS {
29 namespace AudioStandard {
GetInstance(const char * devceClass,const char * deviceNetworkId)30 IAudioRendererSink *IAudioRendererSink::GetInstance(const char *devceClass, const char *deviceNetworkId)
31 {
32 if (devceClass == nullptr || deviceNetworkId == nullptr) {
33 AUDIO_ERR_LOG("GetInstance null class or networkid");
34 return nullptr;
35 }
36 AUDIO_DEBUG_LOG("%{public}s Sink:GetInstance[%{public}s]", devceClass, deviceNetworkId);
37 const char *deviceClassPrimary = "primary";
38 const char *deviceClassA2DP = "a2dp";
39 const char *deviceClassFile = "file_io";
40 const char *deviceClassRemote = "remote";
41
42 IAudioRendererSink *iAudioRendererSink = nullptr;
43 if (!strcmp(devceClass, deviceClassPrimary)) {
44 iAudioRendererSink = AudioRendererSink::GetInstance();
45 }
46 if (!strcmp(devceClass, deviceClassA2DP)) {
47 iAudioRendererSink = BluetoothRendererSink::GetInstance();
48 }
49 if (!strcmp(devceClass, deviceClassFile)) {
50 iAudioRendererSink = AudioRendererFileSink::GetInstance();
51 }
52 if (!strcmp(devceClass, deviceClassRemote)) {
53 iAudioRendererSink = RemoteAudioRendererSink::GetInstance(deviceNetworkId);
54 }
55
56 if (iAudioRendererSink == nullptr) {
57 AUDIO_ERR_LOG("GetInstance failed with device[%{public}s]:[%{private}s]", devceClass,
58 deviceNetworkId);
59 }
60 return iAudioRendererSink;
61 }
62 } // namespace AudioStandard
63 } // namespace OHOS
64
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68
69 using namespace OHOS::AudioStandard;
70
FillinSinkWapper(const char * device,const char * deviceNetworkId,struct RendererSinkAdapter * adapter)71 int32_t FillinSinkWapper(const char *device, const char *deviceNetworkId, struct RendererSinkAdapter *adapter)
72 {
73 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
74 IAudioRendererSink *instance = IAudioRendererSink::GetInstance(device, deviceNetworkId);
75 if (instance != nullptr) {
76 adapter->wapper = static_cast<void *>(instance);
77 } else {
78 adapter->wapper = nullptr;
79 return ERROR;
80 }
81
82 return SUCCESS;
83 }
84
IAudioRendererSinkInit(struct RendererSinkAdapter * adapter,const SinkAttr * attr)85 int32_t IAudioRendererSinkInit(struct RendererSinkAdapter *adapter, const SinkAttr *attr)
86 {
87 if (adapter == nullptr || adapter->wapper == NULL || attr == NULL) {
88 AUDIO_ERR_LOG("%{public}s: Invalid parameter", __func__);
89 return ERROR;
90 }
91 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
92 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
93 if (audioRendererSink->IsInited()) {
94 return SUCCESS;
95 }
96 IAudioSinkAttr iAttr = {};
97 iAttr.adapterName = attr->adapterName;
98 iAttr.openMicSpeaker = attr->openMicSpeaker;
99 iAttr.format = static_cast<AudioSampleFormat>(attr->format);
100 iAttr.sampleFmt = attr->sampleFmt;
101 iAttr.sampleRate = attr->sampleRate;
102 iAttr.channel = attr->channel;
103 iAttr.volume = attr->volume;
104 iAttr.filePath = attr->filePath;
105 iAttr.deviceNetworkId = attr->deviceNetworkId;
106 iAttr.deviceType = attr->deviceType;
107
108 return audioRendererSink->Init(iAttr);
109 }
110
IAudioRendererSinkDeInit(struct RendererSinkAdapter * adapter)111 void IAudioRendererSinkDeInit(struct RendererSinkAdapter *adapter)
112 {
113 CHECK_AND_RETURN_LOG(adapter != nullptr, "null RendererSinkAdapter");
114 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
115 CHECK_AND_RETURN_LOG(audioRendererSink != nullptr, "null audioRendererSink");
116 // remove the sink in allsinks.
117 if (audioRendererSink->IsInited()) {
118 audioRendererSink->DeInit();
119 }
120 }
121
IAudioRendererSinkStop(struct RendererSinkAdapter * adapter)122 int32_t IAudioRendererSinkStop(struct RendererSinkAdapter *adapter)
123 {
124 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
125 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
126 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
127 if (!audioRendererSink->IsInited()) {
128 return SUCCESS;
129 }
130
131 return audioRendererSink->Stop();
132 }
133
IAudioRendererSinkStart(struct RendererSinkAdapter * adapter)134 int32_t IAudioRendererSinkStart(struct RendererSinkAdapter *adapter)
135 {
136 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
137 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
138 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
139 if (!audioRendererSink->IsInited()) {
140 AUDIO_ERR_LOG("audioRenderer Not Inited! Init the renderer first\n");
141 return ERR_NOT_STARTED;
142 }
143
144 return audioRendererSink->Start();
145 }
146
IAudioRendererSinkPause(struct RendererSinkAdapter * adapter)147 int32_t IAudioRendererSinkPause(struct RendererSinkAdapter *adapter)
148 {
149 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
150 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
151 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
152 if (!audioRendererSink->IsInited()) {
153 AUDIO_ERR_LOG("Renderer pause failed");
154 return ERR_NOT_STARTED;
155 }
156
157 return audioRendererSink->Pause();
158 }
159
IAudioRendererSinkResume(struct RendererSinkAdapter * adapter)160 int32_t IAudioRendererSinkResume(struct RendererSinkAdapter *adapter)
161 {
162 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
163 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
164 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
165 if (!audioRendererSink->IsInited()) {
166 AUDIO_ERR_LOG("Renderer resume failed");
167 return ERR_NOT_STARTED;
168 }
169
170 return audioRendererSink->Resume();
171 }
172
IAudioRendererSinkRenderFrame(struct RendererSinkAdapter * adapter,char * data,uint64_t len,uint64_t * writeLen)173 int32_t IAudioRendererSinkRenderFrame(struct RendererSinkAdapter *adapter, char *data, uint64_t len, uint64_t *writeLen)
174 {
175 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
176
177 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
178 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
179 if (!audioRendererSink->IsInited()) {
180 AUDIO_ERR_LOG("audioRenderer Not Inited! Init the renderer first\n");
181 return ERR_NOT_STARTED;
182 }
183
184 int32_t ret = audioRendererSink->RenderFrame(*data, len, *writeLen);
185 return ret;
186 }
187
IAudioRendererSinkSetVolume(struct RendererSinkAdapter * adapter,float left,float right)188 int32_t IAudioRendererSinkSetVolume(struct RendererSinkAdapter *adapter, float left, float right)
189 {
190 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
191
192 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
193 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
194 if (!audioRendererSink->IsInited()) {
195 AUDIO_ERR_LOG("audioRenderer Not Inited! Init the renderer first\n");
196 return ERR_NOT_STARTED;
197 }
198
199 int32_t ret = audioRendererSink->SetVolume(left, right);
200 return ret;
201 }
202
IAudioRendererSinkGetLatency(struct RendererSinkAdapter * adapter,uint32_t * latency)203 int32_t IAudioRendererSinkGetLatency(struct RendererSinkAdapter *adapter, uint32_t *latency)
204 {
205 CHECK_AND_RETURN_RET_LOG(adapter != nullptr, ERR_INVALID_HANDLE, "null RendererSinkAdapter");
206
207 IAudioRendererSink *audioRendererSink = static_cast<IAudioRendererSink *>(adapter->wapper);
208 CHECK_AND_RETURN_RET_LOG(audioRendererSink != nullptr, ERR_INVALID_HANDLE, "null audioRendererSink");
209 if (!audioRendererSink->IsInited()) {
210 AUDIO_ERR_LOG("audioRenderer Not Inited! Init the renderer first\n");
211 return ERR_NOT_STARTED;
212 }
213
214 if (!latency) {
215 AUDIO_ERR_LOG("IAudioRendererSinkGetLatency failed latency null");
216 return ERR_INVALID_PARAM;
217 }
218
219 int32_t ret = audioRendererSink->GetLatency(latency);
220 return ret;
221 }
222 #ifdef __cplusplus
223 }
224 #endif