From 158ccfc7796bd7379dcdd03a1b7abe785eec0dab Mon Sep 17 00:00:00 2001 From: zhanhang Date: Wed, 19 Jul 2023 21:25:15 +0800 Subject: [PATCH] add callback implement Signed-off-by: zhanhang Change-Id: Ia354e3aac51a5f7214bc5a92e4f2e7401449646c --- frameworks/native/ohaudio/OHAudioCapturer.cpp | 20 ++++++- frameworks/native/ohaudio/OHAudioCapturer.h | 26 +++++++-- frameworks/native/ohaudio/OHAudioRenderer.cpp | 54 ++++++++++++++++++- frameworks/native/ohaudio/OHAudioRenderer.h | 53 ++++++++++++++++-- .../native/ohaudio/OHAudioStreamBuilder.cpp | 4 +- 5 files changed, 145 insertions(+), 12 deletions(-) diff --git a/frameworks/native/ohaudio/OHAudioCapturer.cpp b/frameworks/native/ohaudio/OHAudioCapturer.cpp index 1cc2dc7b8a..1cbdcc0c46 100644 --- a/frameworks/native/ohaudio/OHAudioCapturer.cpp +++ b/frameworks/native/ohaudio/OHAudioCapturer.cpp @@ -288,7 +288,7 @@ AudioSampleFormat OHAudioCapturer::GetSampleFormat() return params.audioSampleFormat; } -void OHAudioCapturer::SetCapturerReadCallback(OH_AudioCapturer_Callbacks callbacks, void* userData) +void OHAudioCapturer::SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void* userData) { CHECK_AND_RETURN_LOG(audioCapturer_ != nullptr, "capturer client is nullptr"); audioCapturer_->SetCaptureMode(CAPTURE_MODE_CALLBACK); @@ -299,6 +299,14 @@ void OHAudioCapturer::SetCapturerReadCallback(OH_AudioCapturer_Callbacks callbac } else { AUDIO_ERR_LOG("read callback is nullptr"); } + + if (callbacks.OH_AudioCapturer_OnInterrptEvent != nullptr) { + std::shared_ptr callback = std::make_shared(callbacks, + (OH_AudioCapturer*)this, userData); + audioCapturer_->SetCapturerCallback(callback); + } else { + AUDIO_ERR_LOG("capturer interrupt event callback is nullptr"); + } } int64_t OHAudioCapturer::GetFramesRead() @@ -348,5 +356,15 @@ void OHAudioCapturerModeCallback::OnReadData(size_t length) bufDesc.bufLength); audioCapturer->Enqueue(bufDesc); } + +void OHAudioCapturerCallback::OnInterrupt(const InterruptEvent &interruptEvent) +{ + CHECK_AND_RETURN_LOG(ohAudioCapturer_ != nullptr, "capturer client is nullptr"); + CHECK_AND_RETURN_LOG(callbacks_.OH_AudioCapturer_OnInterrptEvent != nullptr, "pointer to the fuction is nullptr"); + + OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType); + OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType); + callbacks_.OH_AudioCapturer_OnInterrptEvent(ohAudioCapturer_, userData_, type, hint); +} } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/ohaudio/OHAudioCapturer.h b/frameworks/native/ohaudio/OHAudioCapturer.h index d5fe2c6e8a..41b901b8a9 100644 --- a/frameworks/native/ohaudio/OHAudioCapturer.h +++ b/frameworks/native/ohaudio/OHAudioCapturer.h @@ -25,10 +25,8 @@ namespace AudioStandard { class OHAudioCapturerModeCallback : public AudioCapturerReadCallback { public: OHAudioCapturerModeCallback(OH_AudioCapturer_Callbacks callbacks, OH_AudioCapturer* audioCapturer, void* userData) + : callbacks_(callbacks), ohAudioCapturer_(audioCapturer), userData_(userData) { - callbacks_ = callbacks; - ohAudioCapturer_ = audioCapturer; - userData_ = userData; } void OnReadData(size_t length) override; @@ -38,6 +36,26 @@ private: void* userData_; }; +class OHAudioCapturerCallback : public AudioCapturerCallback { +public: + OHAudioCapturerCallback(OH_AudioCapturer_Callbacks callbacks, OH_AudioCapturer* audioCapturer, void* userData) + : callbacks_(callbacks), ohAudioCapturer_(audioCapturer), userData_(userData) + { + } + + void OnInterrupt(const InterruptEvent &interruptEvent) override; + + void OnStateChange(const CapturerState state) override + { + AUDIO_DEBUG_LOG("OHAudioCapturerCallback:: OnStateChange"); + } + +private: + OH_AudioCapturer_Callbacks callbacks_; + OH_AudioCapturer* ohAudioCapturer_; + void* userData_; +}; + class OHAudioCapturer { public: OHAudioCapturer(); @@ -62,7 +80,7 @@ class OHAudioCapturer { int32_t GetBufferDesc(BufferDesc &bufDesc) const; int32_t Enqueue(const BufferDesc &bufDesc) const; - void SetCapturerReadCallback(OH_AudioCapturer_Callbacks callbacks, void* userData); + void SetCapturerCallback(OH_AudioCapturer_Callbacks callbacks, void* userData); private: std::unique_ptr audioCapturer_; diff --git a/frameworks/native/ohaudio/OHAudioRenderer.cpp b/frameworks/native/ohaudio/OHAudioRenderer.cpp index 58a5e96790..a6a03b59c6 100644 --- a/frameworks/native/ohaudio/OHAudioRenderer.cpp +++ b/frameworks/native/ohaudio/OHAudioRenderer.cpp @@ -318,7 +318,7 @@ int32_t OHAudioRenderer::Enqueue(const BufferDesc &bufDesc) const return audioRenderer_->Enqueue(bufDesc); } -void OHAudioRenderer::SetRendererWriteCallback(OH_AudioRenderer_Callbacks callbacks, void* userData) +void OHAudioRenderer::SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void* userData) { CHECK_AND_RETURN_LOG(audioRenderer_ != nullptr, "renderer client is nullptr"); audioRenderer_->SetRenderMode(RENDER_MODE_CALLBACK); @@ -330,6 +330,32 @@ void OHAudioRenderer::SetRendererWriteCallback(OH_AudioRenderer_Callbacks callba } else { AUDIO_ERR_LOG("write callback is nullptr"); } + + if (callbacks.OH_AudioRenderer_OnStreamEvent != nullptr) { + std::shared_ptr callback = + std::make_shared(callbacks, (OH_AudioRenderer*)this, userData); + int32_t clientPid = getpid(); + audioRenderer_->RegisterAudioRendererEventListener(clientPid, callback); + } else { + AUDIO_ERR_LOG("stream event callback is nullptr"); + } + + if (callbacks.OH_AudioRenderer_OnInterrptEvent != nullptr) { + std::shared_ptr callback = + std::make_shared(callbacks, (OH_AudioRenderer*)this, userData); + audioRenderer_->SetRendererCallback(callback); + } else { + AUDIO_ERR_LOG("audio renderer callback is nullptr"); + } + + if (callbacks.OH_AudioRenderer_OnError != nullptr) { + std::shared_ptr callback = + std::make_shared(callbacks, (OH_AudioRenderer*)this, userData); + int32_t clientPid = getpid(); + audioRenderer_->RegisterAudioPolicyServerDiedCb(clientPid, callback); + } else { + AUDIO_ERR_LOG("audio error callback is nullptr"); + } } void OHAudioRendererModeCallback::OnWriteData(size_t length) @@ -345,5 +371,31 @@ void OHAudioRendererModeCallback::OnWriteData(size_t length) bufDesc.bufLength); audioRenderer->Enqueue(bufDesc); } + +void OHAudioRendererDeviceChangeCallback::OnStateChange(const DeviceInfo &deviceInfo) +{ + CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr"); + CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnStreamEvent != nullptr, "pointer to the fuction is nullptr"); + + OH_AudioStream_Event event = AUDIOSTREAM_EVENT_ROUTING_CHANGED; + callbacks_.OH_AudioRenderer_OnStreamEvent(ohAudioRenderer_, userData_, event); +} + +void OHAudioRendererCallback::OnInterrupt(const InterruptEvent &interruptEvent) +{ + CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr"); + CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnInterrptEvent != nullptr, "pointer to the fuction is nullptr"); + OH_AudioInterrupt_ForceType type = (OH_AudioInterrupt_ForceType)(interruptEvent.forceType); + OH_AudioInterrupt_Hint hint = OH_AudioInterrupt_Hint(interruptEvent.hintType); + callbacks_.OH_AudioRenderer_OnInterrptEvent(ohAudioRenderer_, userData_, type, hint); +} + +void OHServiceDiedCallback::OnAudioPolicyServiceDied() +{ + CHECK_AND_RETURN_LOG(ohAudioRenderer_ != nullptr, "renderer client is nullptr"); + CHECK_AND_RETURN_LOG(callbacks_.OH_AudioRenderer_OnError != nullptr, "pointer to the fuction is nullptr"); + OH_AudioStream_Result error = AUDIOSTREAM_ERROR_SYSTEM; + callbacks_.OH_AudioRenderer_OnError(ohAudioRenderer_, userData_, error); +} } // namespace AudioStandard } // namespace OHOS diff --git a/frameworks/native/ohaudio/OHAudioRenderer.h b/frameworks/native/ohaudio/OHAudioRenderer.h index 25d9c44150..e64877b3d3 100644 --- a/frameworks/native/ohaudio/OHAudioRenderer.h +++ b/frameworks/native/ohaudio/OHAudioRenderer.h @@ -25,10 +25,8 @@ namespace AudioStandard { class OHAudioRendererModeCallback : public AudioRendererWriteCallback { public: OHAudioRendererModeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, void* userData) + : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) { - callbacks_ = callbacks; - ohAudioRenderer_ = audioRenderer; - userData_ = userData; } void OnWriteData(size_t length) override; @@ -39,6 +37,53 @@ private: void* userData_; }; +class OHAudioRendererDeviceChangeCallback : public AudioRendererDeviceChangeCallback { +public: + OHAudioRendererDeviceChangeCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, void* userData) + : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) + { + } + + void OnStateChange(const DeviceInfo &deviceInfo) override; + void RemoveAllCallbacks() override {}; +private: + OH_AudioRenderer_Callbacks callbacks_; + OH_AudioRenderer* ohAudioRenderer_; + void* userData_; +}; + +class OHAudioRendererCallback : public AudioRendererCallback { +public: + OHAudioRendererCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, + void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) + { + } + void OnInterrupt(const InterruptEvent &interruptEvent) override; + void OnStateChange(const RendererState state, const StateChangeCmdType __attribute__((unused)) cmdType) override + { + AUDIO_DEBUG_LOG("OHAudioRendererCallback:: OnStateChange"); + } + +private: + OH_AudioRenderer_Callbacks callbacks_; + OH_AudioRenderer* ohAudioRenderer_; + void* userData_; +}; + +class OHServiceDiedCallback : public AudioRendererPolicyServiceDiedCallback { +public: + OHServiceDiedCallback(OH_AudioRenderer_Callbacks callbacks, OH_AudioRenderer* audioRenderer, + void* userData) : callbacks_(callbacks), ohAudioRenderer_(audioRenderer), userData_(userData) + { + } + + void OnAudioPolicyServiceDied() override; + +private: + OH_AudioRenderer_Callbacks callbacks_; + OH_AudioRenderer* ohAudioRenderer_; + void* userData_; +}; class OHAudioRenderer { public: OHAudioRenderer(); @@ -62,7 +107,7 @@ class OHAudioRenderer { int32_t GetBufferDesc(BufferDesc &bufDesc) const; int32_t Enqueue(const BufferDesc &bufDesc) const; - void SetRendererWriteCallback(OH_AudioRenderer_Callbacks callbacks, void* userData); + void SetRendererCallback(OH_AudioRenderer_Callbacks callbacks, void* userData); private: std::unique_ptr audioRenderer_; diff --git a/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp b/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp index f8e56f145f..6fd40b45f1 100644 --- a/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp +++ b/frameworks/native/ohaudio/OHAudioStreamBuilder.cpp @@ -281,7 +281,7 @@ OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioRenderer** renderer OHAudioRenderer *audioRenderer = new OHAudioRenderer(); if (audioRenderer->Initialize(options)) { - audioRenderer->SetRendererWriteCallback(rendererCallbacks_, userData_); + audioRenderer->SetRendererCallback(rendererCallbacks_, userData_); *renderer = (OH_AudioRenderer*)audioRenderer; return AUDIOSTREAM_SUCCESS; } @@ -317,7 +317,7 @@ OH_AudioStream_Result OHAudioStreamBuilder::Generate(OH_AudioCapturer** capturer OHAudioCapturer *audioCapturer = new OHAudioCapturer(); if (audioCapturer->Initialize(options)) { - audioCapturer->SetCapturerReadCallback(capturerCallbacks_, userData_); + audioCapturer->SetCapturerCallback(capturerCallbacks_, userData_); *capturer = (OH_AudioCapturer*)audioCapturer; return AUDIOSTREAM_SUCCESS; } -- Gitee