• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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