1 /*
2 * Copyright (C) 2021 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 "audio_sink_sv_impl.h"
17 #include <vector>
18 #include "media_log.h"
19 #include "media_errors.h"
20 #include "media_dfx.h"
21 #include "param_wrapper.h"
22 #include "player_xcollie.h"
23 #include "scope_guard.h"
24
25 namespace {
26 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = {LOG_CORE, LOG_DOMAIN, "AudioSinkSvImpl"};
27 const std::string DEFAULT_CAPS = "audio/x-raw, format = (string) S16LE, layout = (string) interleaved";
28 }
29
30 namespace OHOS {
31 namespace Media {
AudioRendererMediaCallback(GstBaseSink * audioSink)32 AudioRendererMediaCallback::AudioRendererMediaCallback(GstBaseSink *audioSink)
33 : audioSink_(audioSink), taskQue_("AudioCallback")
34 {
35 (void)taskQue_.Start();
36 }
37
~AudioRendererMediaCallback()38 AudioRendererMediaCallback::~AudioRendererMediaCallback()
39 {
40 (void)taskQue_.Stop();
41 }
42
SaveInterruptCallback(InterruptCbFunc interruptCb)43 void AudioRendererMediaCallback::SaveInterruptCallback(InterruptCbFunc interruptCb)
44 {
45 interruptCb_ = interruptCb;
46 }
47
SaveStateCallback(StateCbFunc stateCb)48 void AudioRendererMediaCallback::SaveStateCallback(StateCbFunc stateCb)
49 {
50 stateCb_ = stateCb;
51 }
52
OnInterrupt(const AudioStandard::InterruptEvent & interruptEvent)53 void AudioRendererMediaCallback::OnInterrupt(const AudioStandard::InterruptEvent &interruptEvent)
54 {
55 auto task = std::make_shared<TaskHandler<void>>([this, interruptEvent] {
56 if (interruptCb_ != nullptr) {
57 interruptCb_(audioSink_, interruptEvent.eventType, interruptEvent.forceType, interruptEvent.hintType);
58 }
59 });
60 (void)taskQue_.EnqueueTask(task);
61 }
62
OnStateChange(const AudioStandard::RendererState state,const AudioStandard::StateChangeCmdType cmdType)63 void AudioRendererMediaCallback::OnStateChange(const AudioStandard::RendererState state,
64 const AudioStandard::StateChangeCmdType cmdType)
65 {
66 MEDIA_LOGD("RenderState is %{public}d, type is %{public}d",
67 static_cast<int32_t>(state), static_cast<int32_t>(cmdType));
68 if (cmdType == AudioStandard::StateChangeCmdType::CMD_FROM_SYSTEM) {
69 auto task = std::make_shared<TaskHandler<void>>([this, state] {
70 if (stateCb_ != nullptr) {
71 stateCb_(audioSink_, static_cast<guint>(state));
72 }
73 });
74 (void)taskQue_.EnqueueTask(task);
75 }
76 }
77
AudioSinkSvImpl(GstBaseSink * sink)78 AudioSinkSvImpl::AudioSinkSvImpl(GstBaseSink *sink)
79 : audioSink_(sink)
80 {
81 audioRendererMediaCallback_ = std::make_shared<AudioRendererMediaCallback>(sink);
82 }
83
~AudioSinkSvImpl()84 AudioSinkSvImpl::~AudioSinkSvImpl()
85 {
86 if (audioRenderer_ != nullptr) {
87 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Release");
88 (void)audioRenderer_->Release();
89 PlayerXCollie::GetInstance().CancelTimer(id);
90 id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::~AudioRenderer");
91 audioRenderer_ = nullptr;
92 PlayerXCollie::GetInstance().CancelTimer(id);
93 }
94 }
95
GetCaps()96 GstCaps *AudioSinkSvImpl::GetCaps()
97 {
98 GstCaps *caps = gst_caps_from_string(DEFAULT_CAPS.c_str());
99 CHECK_AND_RETURN_RET_LOG(caps != nullptr, nullptr, "caps is null");
100 InitChannelRange(caps);
101 InitRateRange(caps);
102 return caps;
103 }
104
InitChannelRange(GstCaps * caps) const105 void AudioSinkSvImpl::InitChannelRange(GstCaps *caps) const
106 {
107 CHECK_AND_RETURN_LOG(caps != nullptr, "caps is null");
108 std::vector<AudioStandard::AudioChannel> supportedChannelsList = AudioStandard::
109 AudioRenderer::GetSupportedChannels();
110 GValue list = G_VALUE_INIT;
111 (void)g_value_init(&list, GST_TYPE_LIST);
112 for (auto channel : supportedChannelsList) {
113 GValue value = G_VALUE_INIT;
114 (void)g_value_init(&value, G_TYPE_INT);
115 g_value_set_int(&value, channel);
116 gst_value_list_append_value(&list, &value);
117 g_value_unset(&value);
118 }
119 gst_caps_set_value(caps, "channels", &list);
120 g_value_unset(&list);
121 }
122
InitRateRange(GstCaps * caps) const123 void AudioSinkSvImpl::InitRateRange(GstCaps *caps) const
124 {
125 CHECK_AND_RETURN_LOG(caps != nullptr, "caps is null");
126 std::vector<AudioStandard::AudioSamplingRate> supportedSampleList = AudioStandard::
127 AudioRenderer::GetSupportedSamplingRates();
128 GValue list = G_VALUE_INIT;
129 (void)g_value_init(&list, GST_TYPE_LIST);
130 for (auto rate : supportedSampleList) {
131 GValue value = G_VALUE_INIT;
132 (void)g_value_init(&value, G_TYPE_INT);
133 g_value_set_int(&value, rate);
134 gst_value_list_append_value(&list, &value);
135 g_value_unset(&value);
136 }
137 gst_caps_set_value(caps, "rate", &list);
138 g_value_unset(&list);
139 }
140
SetMuteVolumeBySysParam()141 void AudioSinkSvImpl::SetMuteVolumeBySysParam()
142 {
143 std::string onMute;
144 int32_t res = OHOS::system::GetStringParameter("sys.media.set.mute", onMute, "");
145 if (res == 0 && !onMute.empty()) {
146 if (onMute == "TRUE") {
147 isMute_ = true;
148 (void)SetVolume(0.0);
149 MEDIA_LOGD("SetVolume as 0");
150 } else if (onMute == "FALSE") {
151 isMute_ = false;
152 (void)SetVolume(1.0);
153 MEDIA_LOGD("SetVolume as 1");
154 }
155 }
156 }
157
SetVolume(float volume)158 int32_t AudioSinkSvImpl::SetVolume(float volume)
159 {
160 MediaTrace trace("AudioSink::SetVolume");
161 MEDIA_LOGD("audioRenderer SetVolume(%{public}lf) In", volume);
162 CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED, "audioRenderer_ is nullptr");
163 volume = (isMute_ == false) ? volume : 0.0;
164 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::SetVolume");
165 int32_t ret = audioRenderer_->SetVolume(volume);
166 CHECK_AND_RETURN_RET_LOG(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED, "audio server setvolume failed!");
167 PlayerXCollie::GetInstance().CancelTimer(id);
168 MEDIA_LOGD("audioRenderer SetVolume(%{public}lf) Out", volume);
169 return MSERR_OK;
170 }
171
SetRendererInfo(int32_t desc,int32_t rendererFlags)172 int32_t AudioSinkSvImpl::SetRendererInfo(int32_t desc, int32_t rendererFlags)
173 {
174 int32_t contentType = (static_cast<uint32_t>(desc) & 0x0000FFFF);
175 int32_t streamUsage = static_cast<uint32_t>(desc) >> AudioStandard::RENDERER_STREAM_USAGE_SHIFT;
176 rendererOptions_.rendererInfo.contentType = static_cast<AudioStandard::ContentType>(contentType);
177 rendererOptions_.rendererInfo.streamUsage = static_cast<AudioStandard::StreamUsage>(streamUsage);
178 rendererOptions_.rendererInfo.rendererFlags = rendererFlags;
179 return MSERR_OK;
180 }
181
GetVolume(float & volume)182 int32_t AudioSinkSvImpl::GetVolume(float &volume)
183 {
184 MEDIA_LOGD("GetVolume");
185 CHECK_AND_RETURN_RET_LOG(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED, "audioRenderer_ is nullptr");
186 volume = audioRenderer_->GetVolume();
187 return MSERR_OK;
188 }
189
GetMaxVolume(float & volume)190 int32_t AudioSinkSvImpl::GetMaxVolume(float &volume)
191 {
192 MEDIA_LOGD("GetMaxVolume");
193 volume = 1.0; // audioRenderer maxVolume
194 return MSERR_OK;
195 }
196
GetMinVolume(float & volume)197 int32_t AudioSinkSvImpl::GetMinVolume(float &volume)
198 {
199 MEDIA_LOGD("GetMinVolume");
200 volume = 0.0; // audioRenderer minVolume
201 return MSERR_OK;
202 }
203
Prepare(int32_t appUid,int32_t appPid)204 int32_t AudioSinkSvImpl::Prepare(int32_t appUid, int32_t appPid)
205 {
206 MediaTrace trace("AudioSink::Prepare");
207 MEDIA_LOGD("audioRenderer Prepare In");
208 AudioStandard::AppInfo appInfo = {};
209 appInfo.appUid = appUid;
210 appInfo.appPid = appPid;
211 rendererOptions_.streamInfo.samplingRate = AudioStandard::SAMPLE_RATE_8000;
212 rendererOptions_.streamInfo.encoding = AudioStandard::ENCODING_PCM;
213 rendererOptions_.streamInfo.format = AudioStandard::SAMPLE_S16LE;
214 rendererOptions_.streamInfo.channels = AudioStandard::MONO;
215 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Create");
216 audioRenderer_ = AudioStandard::AudioRenderer::Create(rendererOptions_, appInfo);
217 PlayerXCollie::GetInstance().CancelTimer(id);
218 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
219 SetMuteVolumeBySysParam();
220 MEDIA_LOGD("audioRenderer Prepare Out");
221 return MSERR_OK;
222 }
223
Start()224 int32_t AudioSinkSvImpl::Start()
225 {
226 MediaTrace trace("AudioSink::Start");
227 MEDIA_LOGD("audioRenderer Start In");
228 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
229 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Start");
230 (void)audioRenderer_->Start();
231 PlayerXCollie::GetInstance().CancelTimer(id);
232 MEDIA_LOGD("audioRenderer Start Out");
233 return MSERR_OK;
234 }
235
Stop()236 int32_t AudioSinkSvImpl::Stop()
237 {
238 MediaTrace trace("AudioSink::Stop");
239 MEDIA_LOGD("audioRenderer Stop In");
240 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
241 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Stop");
242 (void)audioRenderer_->Stop();
243 PlayerXCollie::GetInstance().CancelTimer(id);
244 MEDIA_LOGD("audioRenderer Stop Out");
245 return MSERR_OK;
246 }
247
Pause()248 int32_t AudioSinkSvImpl::Pause()
249 {
250 MediaTrace trace("AudioSink::Pause");
251 MEDIA_LOGD("audioRenderer Pause In");
252 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
253 if (audioRenderer_->GetStatus() == OHOS::AudioStandard::RENDERER_RUNNING) {
254 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Pause");
255 bool ret = audioRenderer_->Pause();
256 if (!ret) {
257 MEDIA_LOGE("audio Renderer Pause failed!");
258 }
259 PlayerXCollie::GetInstance().CancelTimer(id);
260 CHECK_AND_RETURN_RET(ret == true, MSERR_AUD_RENDER_FAILED);
261 }
262 MEDIA_LOGD("audioRenderer Pause Out");
263 return MSERR_OK;
264 }
265
Drain()266 int32_t AudioSinkSvImpl::Drain()
267 {
268 MediaTrace trace("AudioSink::Drain");
269 MEDIA_LOGD("Drain");
270 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
271 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Drain");
272 auto ret = audioRenderer_->Drain();
273 PlayerXCollie::GetInstance().CancelTimer(id);
274 CHECK_AND_RETURN_RET(ret == true, MSERR_AUD_RENDER_FAILED);
275 return MSERR_OK;
276 }
277
Flush()278 int32_t AudioSinkSvImpl::Flush()
279 {
280 MediaTrace trace("AudioSink::Flush");
281 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
282 if (audioRenderer_->GetStatus() == OHOS::AudioStandard::RENDERER_RUNNING) {
283 MEDIA_LOGD("Flush");
284 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Flush");
285 auto ret = audioRenderer_->Flush();
286 PlayerXCollie::GetInstance().CancelTimer(id);
287 CHECK_AND_RETURN_RET(ret == true, MSERR_AUD_RENDER_FAILED);
288 }
289
290 return MSERR_OK;
291 }
292
Release()293 int32_t AudioSinkSvImpl::Release()
294 {
295 MediaTrace trace("AudioSink::Release");
296 MEDIA_LOGD("audioRenderer Release In");
297 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
298 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Release");
299 (void)audioRenderer_->Release();
300 PlayerXCollie::GetInstance().CancelTimer(id);
301 id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::~AudioRenderer");
302 audioRenderer_ = nullptr;
303 PlayerXCollie::GetInstance().CancelTimer(id);
304 MEDIA_LOGD("audioRenderer Release Out");
305 return MSERR_OK;
306 }
307
SetParameters(uint32_t bitsPerSample,uint32_t channels,uint32_t sampleRate)308 int32_t AudioSinkSvImpl::SetParameters(uint32_t bitsPerSample, uint32_t channels, uint32_t sampleRate)
309 {
310 MediaTrace trace("AudioSink::SetParameters");
311 (void)bitsPerSample;
312 MEDIA_LOGD("SetParameters in, channels:%{public}d, sampleRate:%{public}d", channels, sampleRate);
313 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
314
315 AudioStandard::AudioRendererParams params;
316 std::vector<AudioStandard::AudioSamplingRate> supportedSampleList = AudioStandard::
317 AudioRenderer::GetSupportedSamplingRates();
318 CHECK_AND_RETURN_RET(supportedSampleList.size() > 0, MSERR_AUD_RENDER_FAILED);
319 bool isValidSampleRate = false;
320 for (auto iter = supportedSampleList.cbegin(); iter != supportedSampleList.end(); ++iter) {
321 CHECK_AND_RETURN_RET(static_cast<int32_t>(*iter) > 0, MSERR_AUD_RENDER_FAILED);
322 uint32_t supportedSampleRate = static_cast<uint32_t>(*iter);
323 if (sampleRate <= supportedSampleRate) {
324 params.sampleRate = *iter;
325 isValidSampleRate = true;
326 break;
327 }
328 }
329 CHECK_AND_RETURN_RET(isValidSampleRate == true, MSERR_UNSUPPORT_AUD_SAMPLE_RATE);
330
331 std::vector<AudioStandard::AudioChannel> supportedChannelsList = AudioStandard::
332 AudioRenderer::GetSupportedChannels();
333 CHECK_AND_RETURN_RET(supportedChannelsList.size() > 0, MSERR_AUD_RENDER_FAILED);
334 bool isValidChannels = false;
335 for (auto iter = supportedChannelsList.cbegin(); iter != supportedChannelsList.end(); ++iter) {
336 CHECK_AND_RETURN_RET(static_cast<int32_t>(*iter) > 0, MSERR_AUD_RENDER_FAILED);
337 uint32_t supportedChannels = static_cast<uint32_t>(*iter);
338 if (channels == supportedChannels) {
339 params.channelCount = *iter;
340 isValidChannels = true;
341 break;
342 }
343 }
344 CHECK_AND_RETURN_RET(isValidChannels == true, MSERR_UNSUPPORT_AUD_CHANNEL_NUM);
345
346 params.sampleFormat = AudioStandard::SAMPLE_S16LE;
347 params.encodingType = AudioStandard::ENCODING_PCM;
348 MEDIA_LOGD("SetParameters out, channels:%{public}d, sampleRate:%{public}d", params.channelCount, params.sampleRate);
349 MEDIA_LOGD("audioRenderer SetParams In");
350 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::SetParams");
351 auto ret = audioRenderer_->SetParams(params);
352 PlayerXCollie::GetInstance().CancelTimer(id);
353 CHECK_AND_RETURN_RET(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED);
354 MEDIA_LOGD("audioRenderer SetParams Out");
355 return MSERR_OK;
356 }
357
GetParameters(uint32_t & bitsPerSample,uint32_t & channels,uint32_t & sampleRate)358 int32_t AudioSinkSvImpl::GetParameters(uint32_t &bitsPerSample, uint32_t &channels, uint32_t &sampleRate)
359 {
360 (void)bitsPerSample;
361 MEDIA_LOGD("GetParameters");
362 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
363 AudioStandard::AudioRendererParams params;
364 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetParams");
365 auto ret = audioRenderer_->GetParams(params);
366 PlayerXCollie::GetInstance().CancelTimer(id);
367 CHECK_AND_RETURN_RET(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED);
368 channels = params.channelCount;
369 sampleRate = params.sampleRate;
370 return MSERR_OK;
371 }
372
GetMinimumBufferSize(uint32_t & bufferSize)373 int32_t AudioSinkSvImpl::GetMinimumBufferSize(uint32_t &bufferSize)
374 {
375 MEDIA_LOGD("GetMinimumBufferSize");
376 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
377 size_t size = 0;
378 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetBufferSize");
379 auto ret = audioRenderer_->GetBufferSize(size);
380 PlayerXCollie::GetInstance().CancelTimer(id);
381 CHECK_AND_RETURN_RET(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED);
382 CHECK_AND_RETURN_RET(size > 0, MSERR_AUD_RENDER_FAILED);
383 bufferSize = static_cast<uint32_t>(size);
384 return MSERR_OK;
385 }
386
GetMinimumFrameCount(uint32_t & frameCount)387 int32_t AudioSinkSvImpl::GetMinimumFrameCount(uint32_t &frameCount)
388 {
389 MEDIA_LOGD("GetMinimumFrameCount");
390 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
391 uint32_t count = 0;
392 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetFrameCount");
393 auto ret = audioRenderer_->GetFrameCount(count);
394 PlayerXCollie::GetInstance().CancelTimer(id);
395 CHECK_AND_RETURN_RET(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED);
396 CHECK_AND_RETURN_RET(count > 0, MSERR_AUD_RENDER_FAILED);
397 frameCount = count;
398 return MSERR_OK;
399 }
400
Writeable() const401 bool AudioSinkSvImpl::Writeable() const
402 {
403 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, false);
404 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetStatus");
405 auto ret = audioRenderer_->GetStatus();
406 PlayerXCollie::GetInstance().CancelTimer(id);
407 return ret == AudioStandard::RENDERER_RUNNING;
408 }
409
OnError(std::string errMsg)410 void AudioSinkSvImpl::OnError(std::string errMsg)
411 {
412 if (errorCb_ != nullptr) {
413 errorCb_(audioSink_, errMsg);
414 }
415 }
416
Write(uint8_t * buffer,size_t size)417 int32_t AudioSinkSvImpl::Write(uint8_t *buffer, size_t size)
418 {
419 MediaTrace trace("AudioSink::Write");
420 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
421 CHECK_AND_RETURN_RET(buffer != nullptr, MSERR_AUD_RENDER_FAILED);
422 CHECK_AND_RETURN_RET(size > 0, MSERR_AUD_RENDER_FAILED);
423
424 size_t bytesWritten = 0;
425 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::Write");
426 ON_SCOPE_EXIT(0) {
427 PlayerXCollie::GetInstance().CancelTimer(id);
428 };
429 while (bytesWritten < size) {
430 int32_t bytesSingle = audioRenderer_->Write(buffer + bytesWritten, size - bytesWritten);
431 if (bytesSingle <= 0) {
432 MEDIA_LOGE("[AudioSinkSvImpl] audioRenderer write failed, drop an audio packet!");
433 return MSERR_OK;
434 }
435 bytesWritten += static_cast<size_t>(bytesSingle);
436 CHECK_AND_RETURN_RET(bytesWritten >= static_cast<size_t>(bytesSingle), MSERR_AUD_RENDER_FAILED);
437 }
438 return MSERR_OK;
439 }
440
GetAudioTime(uint64_t & time)441 int32_t AudioSinkSvImpl::GetAudioTime(uint64_t &time)
442 {
443 MediaTrace trace("AudioSink::GetAudioTime");
444 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
445 AudioStandard::Timestamp timeStamp;
446 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetAudioTime");
447 bool ret = audioRenderer_->GetAudioTime(timeStamp, AudioStandard::Timestamp::Timestampbase::MONOTONIC);
448 PlayerXCollie::GetInstance().CancelTimer(id);
449 CHECK_AND_RETURN_RET(ret == true, MSERR_AUD_RENDER_FAILED);
450 time = static_cast<uint64_t>(timeStamp.time.tv_nsec);
451 return MSERR_OK;
452 }
453
GetLatency(uint64_t & latency) const454 int32_t AudioSinkSvImpl::GetLatency(uint64_t &latency) const
455 {
456 MediaTrace trace("AudioSink::GetLatency");
457 CHECK_AND_RETURN_RET(audioRenderer_ != nullptr, MSERR_AUD_RENDER_FAILED);
458 int32_t id = PlayerXCollie::GetInstance().SetTimerByLog("AudioRenderer::GetLatency");
459 auto ret = audioRenderer_->GetLatency(latency);
460 PlayerXCollie::GetInstance().CancelTimer(id);
461 CHECK_AND_RETURN_RET(ret == AudioStandard::SUCCESS, MSERR_AUD_RENDER_FAILED);
462 return MSERR_OK;
463 }
464
SetAudioSinkCb(void (* interruptCb)(GstBaseSink *,guint,guint,guint),void (* stateCb)(GstBaseSink *,guint),void (* errorCb)(GstBaseSink *,const std::string &))465 void AudioSinkSvImpl::SetAudioSinkCb(void (*interruptCb)(GstBaseSink *, guint, guint, guint),
466 void (*stateCb)(GstBaseSink *, guint),
467 void (*errorCb)(GstBaseSink *, const std::string &))
468 {
469 CHECK_AND_RETURN(audioRendererMediaCallback_ != nullptr);
470 errorCb_ = errorCb;
471 audioRendererMediaCallback_->SaveInterruptCallback(interruptCb);
472 audioRendererMediaCallback_->SaveStateCallback(stateCb);
473 audioRenderer_->SetRendererCallback(audioRendererMediaCallback_);
474 }
475
SetAudioInterruptMode(int32_t interruptMode)476 void AudioSinkSvImpl::SetAudioInterruptMode(int32_t interruptMode)
477 {
478 CHECK_AND_RETURN(audioRendererMediaCallback_ != nullptr);
479 audioRenderer_->SetInterruptMode(static_cast<AudioStandard::InterruptMode>(interruptMode));
480 }
481 } // namespace Media
482 } // namespace OHOS
483