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