From b37445398e94540bcde3eb95d5ad516268e833b3 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Wed, 8 May 2024 21:48:41 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E9=9F=B3=E9=A2=91=E6=92=AD=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../media/src/main/cpp/include/Player.hpp | 20 ++++- .../src/main/cpp/media/AudioCapturer.cpp | 6 +- .../media/src/main/cpp/media/AudioPlayer.cpp | 86 ++++++++++++++++++- 3 files changed, 104 insertions(+), 8 deletions(-) diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Player.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Player.hpp index 60dd8d0..5f63474 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Player.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Player.hpp @@ -12,6 +12,11 @@ #ifndef TAOYAO_PALYER_HPP #define TAOYAO_PALYER_HPP +#include "./Signal.hpp" + +#include +#include + namespace acgist { /** @@ -19,6 +24,9 @@ namespace acgist { */ class Player { +protected: + bool running = false; + public: Player(); virtual ~Player(); @@ -27,7 +35,7 @@ public: // 开始播放 virtual bool start() = 0; // 结束播放 - virtual bool stop() = 0; + virtual bool stop() = 0; }; @@ -36,13 +44,19 @@ public: */ class AudioPlayer: public Player { +public: + // 音频构造器 + OH_AudioStreamBuilder* builder = nullptr; + // 音频播放器 + OH_AudioRenderer* audioRenderer = nullptr;; + public: AudioPlayer(); virtual ~AudioPlayer(); public: virtual bool start() override; - virtual bool stop() override; + virtual bool stop() override; }; @@ -59,7 +73,7 @@ public: public: virtual bool start() override; - virtual bool stop() override; + virtual bool stop() override; }; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioCapturer.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioCapturer.cpp index dc88f5e..64dbea8 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioCapturer.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioCapturer.cpp @@ -13,12 +13,12 @@ static int32_t OnInterruptEvent(OH_AudioCapturer* capturer, void* userData, OH_A acgist::AudioCapturer::AudioCapturer() { OH_AudioStream_Result ret = OH_AudioStreamBuilder_Create(&this->builder, AUDIOSTREAM_TYPE_RENDERER); OH_LOG_INFO(LOG_APP, "构造音频构造器:%o", ret); - // 配置音频参数 + // 配置音频录制参数 OH_AudioStreamBuilder_SetSamplingRate(this->builder, acgist::samplingRate); OH_AudioStreamBuilder_SetChannelCount(this->builder, acgist::channelCount); OH_AudioStreamBuilder_SetLatencyMode(this->builder, OH_AudioStream_LatencyMode::AUDIOSTREAM_LATENCY_MODE_NORMAL); OH_AudioStreamBuilder_SetSampleFormat(this->builder, OH_AudioStream_SampleFormat::AUDIOSTREAM_SAMPLE_S16LE); - OH_LOG_DEBUG(LOG_APP, "配置音频参数:%d %d", acgist::samplingRate, acgist::channelCount); + OH_LOG_DEBUG(LOG_APP, "配置音频录制参数:%d %d", acgist::samplingRate, acgist::channelCount); // 设置回调函数 OH_AudioCapturer_Callbacks callbacks; callbacks.OH_AudioCapturer_OnError = OnError; @@ -26,7 +26,7 @@ acgist::AudioCapturer::AudioCapturer() { callbacks.OH_AudioCapturer_OnStreamEvent = OnStreamEvent; callbacks.OH_AudioCapturer_OnInterruptEvent = OnInterruptEvent; ret = OH_AudioStreamBuilder_SetCapturerCallback(this->builder, callbacks, this); - OH_LOG_DEBUG(LOG_APP, "设置回调函数:%o", ret); + OH_LOG_DEBUG(LOG_APP, "设置录制回调函数:%o", ret); } acgist::AudioCapturer::~AudioCapturer() { diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioPlayer.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioPlayer.cpp index daf5ec6..aa877d5 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioPlayer.cpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/media/AudioPlayer.cpp @@ -1,11 +1,93 @@ #include "../include/Player.hpp" +#include +#include + +#include + +// 播放回调 +static int32_t OnError(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Result error); +static int32_t OnWriteData(OH_AudioRenderer* renderer, void* userData, void* buffer, int32_t length); +static int32_t OnStreamEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Event event); +static int32_t OnInterruptEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioInterrupt_ForceType type, OH_AudioInterrupt_Hint hint); + acgist::AudioPlayer::AudioPlayer() { + OH_AudioStream_Result ret = OH_AudioStreamBuilder_Create(&this->builder, AUDIOSTREAM_TYPE_RENDERER); + OH_LOG_INFO(LOG_APP, "构造音频构造器:%o", ret); + // 配置音频播放参数 + OH_AudioStreamBuilder_SetSamplingRate(this->builder, acgist::samplingRate); + OH_AudioStreamBuilder_SetChannelCount(this->builder, acgist::channelCount); + OH_AudioStreamBuilder_SetSampleFormat(this->builder, OH_AudioStream_SampleFormat::AUDIOSTREAM_SAMPLE_S16LE); + OH_AudioStreamBuilder_SetEncodingType(this->builder, OH_AudioStream_EncodingType::AUDIOSTREAM_ENCODING_TYPE_RAW); + OH_AudioStreamBuilder_SetRendererInfo(this->builder, OH_AudioStream_Usage::AUDIOSTREAM_USAGE_MUSIC); + OH_LOG_DEBUG(LOG_APP, "配置音频播放参数:%d %d", acgist::samplingRate, acgist::channelCount); + // 配置回调函数 + OH_AudioRenderer_Callbacks callbacks; + callbacks.OH_AudioRenderer_OnError = OnError; + callbacks.OH_AudioRenderer_OnWriteData = OnWriteData; + callbacks.OH_AudioRenderer_OnStreamEvent = OnStreamEvent; + callbacks.OH_AudioRenderer_OnInterruptEvent = OnInterruptEvent; + ret = OH_AudioStreamBuilder_SetRendererCallback(this->builder, callbacks, this); + OH_LOG_DEBUG(LOG_APP, "设置播放回调函数:%o", ret); } acgist::AudioPlayer::~AudioPlayer() { + this->stop(); + if(this->builder != nullptr) { + OH_AudioStream_Result ret = OH_AudioStreamBuilder_Destroy(this->builder); + this->builder = nullptr; + OH_LOG_INFO(LOG_APP, "释放音频播放:%o", ret); + } } -bool acgist::AudioPlayer::start() { return true; } +bool acgist::AudioPlayer::start() { + if (this->running) { + return true; + } + this->running = true; + // 构造音频播放器 + OH_AudioStream_Result ret = OH_AudioStreamBuilder_GenerateRenderer(this->builder, &this->audioRenderer); + OH_LOG_DEBUG(LOG_APP, "构造音频播放器:%o", ret); + // 开始音频播放 + ret = OH_AudioRenderer_Start(this->audioRenderer); + OH_LOG_DEBUG(LOG_APP, "开始音频播放:%o", ret); + return ret == OH_AudioStream_Result::AUDIOSTREAM_SUCCESS; +} -bool acgist::AudioPlayer::stop() { return true; } +bool acgist::AudioPlayer::stop() { + if (!this->running) { + return true; + } + this->running = false; + if (this->audioRenderer == nullptr) { + return true; + } + // 停止音频播放 + OH_AudioStream_Result ret = OH_AudioRenderer_Stop(this->audioRenderer); + OH_LOG_DEBUG(LOG_APP, "停止音频播放:%o", ret); + // 释放音频播放器 + ret = OH_AudioRenderer_Release(this->audioRenderer); + this->audioRenderer = nullptr; + OH_LOG_DEBUG(LOG_APP, "释放音频播放器:%o", ret); + return ret == OH_AudioStream_Result::AUDIOSTREAM_SUCCESS; +} + +static int32_t OnError(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Result error) { + OH_LOG_ERROR(LOG_APP, "音频播放异常:%o", error); + return 0; +} + +static int32_t OnWriteData(OH_AudioRenderer* renderer, void* userData, void* buffer, int32_t length) { + // TODO: 混音写入buffer + return 0; +} + +static int32_t OnStreamEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioStream_Event event) { + OH_LOG_DEBUG(LOG_APP, "音频播放事件:%o", event); + return 0; +} + +static int32_t OnInterruptEvent(OH_AudioRenderer* renderer, void* userData, OH_AudioInterrupt_ForceType type, OH_AudioInterrupt_Hint hint) { + OH_LOG_DEBUG(LOG_APP, "音频播放打断:%o %o", type, hint); + return 0; +}