From a0d796713f97b211930bd0da0eb1e293d35f45ab Mon Sep 17 00:00:00 2001 From: FileStream Date: Sat, 20 Apr 2024 18:05:14 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=86=85=E5=A4=96=E5=90=8C=E5=BD=95?= =?UTF-8?q?=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: FileStream --- .../native/audio_data_source_filter.h | 74 +++++ services/media_engine/filters/BUILD.gn | 1 + .../filters/audio_data_source_filter.cpp | 304 ++++++++++++++++++ 3 files changed, 379 insertions(+) create mode 100644 interfaces/inner_api/native/audio_data_source_filter.h create mode 100644 services/media_engine/filters/audio_data_source_filter.cpp diff --git a/interfaces/inner_api/native/audio_data_source_filter.h b/interfaces/inner_api/native/audio_data_source_filter.h new file mode 100644 index 000000000..f55d3f73c --- /dev/null +++ b/interfaces/inner_api/native/audio_data_source_filter.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2024-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FILTERS_AUDIO_DATA_SOURCE_FILTER_H +#define FILTERS_AUDIO_DATA_SOURCE_FILTER_H + +#include "filter/filter.h" +#include "common/status.h" +#include "osal/task/task.h" +#include "audio_capturer.h" +#include "media_data_source.h" + +namespace OHOS { +namespace Media { +namespace Pipeline { + +class AudioDataSourceFilter : public Filter, public std::enable_shared_from_this { +public: + explicit AudioDataSourceFilter(std::string name, FilterType type); + ~AudioDataSourceFilter() override; + void Init(const std::shared_ptr& receiver, + const std::shared_ptr& callback) override; + Status DoPrepare() override; + Status DoStart() override; + Status DoPause() override; + Status DoResume() override; + Status DoStop() override; + Status DoFlush() override; + Status DoRelease() override; + void SetParameter(const std::shared_ptr& meta) override; + void GetParameter(std::shared_ptr& meta) override; + Status LinkNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status UpdateNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status UnLinkNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status SendEos(); + FilterType GetFilterType(); + void SetAudioDataSource(const std::shared_ptr& audioSource); + void OnLinkedResult(const sptr& queue, std::shared_ptr& meta); + Status OnLinked(StreamType inType, const std::shared_ptr& meta, + const std::shared_ptr& callback) override; + Status OnUpdated(StreamType inType, const std::shared_ptr& meta, + const std::shared_ptr& callback) override; + Status OnUnLinked(StreamType inType, const std::shared_ptr& callback) override; + void OnUnlinkedResult(const std::shared_ptr& meta); + void OnUpdatedResult(const std::shared_ptr& meta); +private: + void ReadLoop(); + std::shared_ptr taskPtr_{ nullptr }; + sptr outputBufferQueue_; + std::shared_ptr audioDataSource_{ nullptr }; + + std::shared_ptr receiver_; + std::shared_ptr callback_; + + std::shared_ptr nextFilter_; + std::atomic eos_{ false }; + + Mutex captureMutex_{}; +}; + // namespace Pipeline +} // namespace Media +} // namespace OHOS +#endif // FILTERS_AUDIO_CAPTURE_FILTER_H \ No newline at end of file diff --git a/services/media_engine/filters/BUILD.gn b/services/media_engine/filters/BUILD.gn index 919facfa9..6bc45f2c0 100644 --- a/services/media_engine/filters/BUILD.gn +++ b/services/media_engine/filters/BUILD.gn @@ -56,6 +56,7 @@ ohos_shared_library("av_codec_media_engine_filters") { sources = [ "audio_capture_filter.cpp", + "audio_data_source_filter.cpp", "audio_decoder_filter.cpp", "audio_encoder_filter.cpp", "audio_sink_filter.cpp", diff --git a/services/media_engine/filters/audio_data_source_filter.cpp b/services/media_engine/filters/audio_data_source_filter.cpp new file mode 100644 index 000000000..3b82a37b4 --- /dev/null +++ b/services/media_engine/filters/audio_data_source_filter.cpp @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2024-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "audio_data_source_filter.h" +#include "common/log.h" +#include "filter/filter_factory.h" + +namespace OHOS { +namespace Media { +namespace Pipeline { +constexpr uint32_t TIME_OUT_MS = 0; +static AutoRegisterFilter g_registerAudioDataSourceFilter("builtin.recorder.audiodatasource", + FilterType::AUDIO_DATA_SOURCE, + [](const std::string& name, const FilterType type) { + return std::make_shared(name, FilterType::AUDIO_DATA_SOURCE); + }); + +/// End of Stream Buffer Flag +constexpr uint32_t BUFFER_FLAG_EOS = 0x00000001; +class AudioDataSourceFilterLinkCallback : public FilterLinkCallback { +public: + explicit AudioDataSourceFilterLinkCallback(std::shared_ptr audioDataSourceFilter) + : audioDataSourceFilter_(std::move(audioDataSourceFilter)) + { + } + + void OnLinkedResult(const sptr &queue, std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnLinkedResult(queue, meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + + void OnUnlinkedResult(std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnUnlinkedResult(meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + + void OnUpdatedResult(std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnUpdatedResult(meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + +private: + std::weak_ptr audioDataSourceFilter_; +}; + +AudioDataSourceFilter::AudioDataSourceFilter(std::string name, FilterType type): Filter(name, type) +{ + MEDIA_LOG_I("audio data source filter create"); +} + +AudioDataSourceFilter::~AudioDataSourceFilter() +{ + MEDIA_LOG_I("audio data source filter destroy"); +} + +void AudioDataSourceFilter::Init(const std::shared_ptr &receiver, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter Init"); + receiver_ = receiver; + callback_ = callback; + if (!taskPtr_) { + taskPtr_ = std::make_shared("DataReader"); + taskPtr_->RegisterJob([this] { ReadLoop(); return 0}); + } +} + +Status AudioDataSourceFilter::DoPrepare() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoPrepare"); + if (callback_ == nullptr) { + MEDIA_LOG_E("callback is nullptr"); + return Status::ERROR_NULL_POINTER; + } + callback_->OnCallback(shared_from_this(), FilterCallBackCommand::NEXT_FILTER_NEEDED, + StreamType::STREAMTYPE_RAW_AUDIO); + return Status::OK; +} + +Status AudioDataSourceFilter::DoStart() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoStart"); + nextFilter_->Start(); + eos_ = false; + if (taskPtr_) { + taskPtr_->Start(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoPause() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoPause"); + if (taskPtr_) { + taskPtr_->Pause(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoResume() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoResume"); + if (taskPtr_) { + taskPtr_->Start(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoStop() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoStop"); + // stop task firstly + if (taskPtr_) { + taskPtr_->Stop(); + } + if (nextFilter_) { + nextFilter_->Stop(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoFlush() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoFlush"); + return Status::OK; +} + +Status AudioDataSourceFilter::DoRelease() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoRelease"); + if (taskPtr_) { + taskPtr_->Stop(); + } + taskPtr_ = nullptr; + audioDataSource_ = nullptr; + return Status::OK; +} + +void AudioDataSourceFilter::SetParameter(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter SetParameter"); +} + +void AudioDataSourceFilter::GetParameter(std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter GetParameter"); +} + +Status AudioDataSourceFilter::LinkNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter LinkNext"); + auto meta = std::make_shared(); + GetParameter(meta); + nextFilter_ = nextFilter; + nextFiltersMap_[outType].push_back(nextFilter_); + std::shared_ptr filterLinkCallback = + std::make_shared(shared_from_this()); + nextFilter->OnLinked(outType, meta, filterLinkCallback); + return Status::OK; +} + +FilterType AudioDataSourceFilter::GetFilterType() +{ + MEDIA_LOG_I("AudioDataSourceFilter GetFilterType"); + return FilterType::AUDIO_CAPTURE; +} + +void AudioDataSourceFilter::SetAudioDataSource(const std::shared_ptr& audioSource) +{ + audioDataSource_ = audioSource; +} + +Status AudioDataSourceFilter::SendEos() +{ + MEDIA_LOG_I("AudioDataSourceFilter SendEos"); + Status ret = Status::OK; + if (outputBufferQueue_) { + std::shared_ptr buffer; + AVBufferConfig avBufferConfig; + ret = outputBufferQueue_->RequestBuffer(buffer, avBufferConfig, TIME_OUT_MS); + if (ret != Status::OK) { + MEDIA_LOG_I("RequestBuffer fail, ret" PUBLIC_LOG_D32, ret); + return ret; + } + buffer->flag_ |= BUFFER_FLAG_EOS; + outputBufferQueue_->PushBuffer(buffer, false); + } + eos_ = true; + return ret; +} + +void AudioDataSourceFilter::ReadLoop() +{ + MEDIA_LOG_D("AudioDataSourceFilter ReadLoop"); + if (eos_.load()) { + return; + } + int64_t bufferSize = 0; + if (audioDataSource_->GetSize(bufferSize) != 0) { + MEDIA_LOG_E("Get audioCaptureModule buffer size fail"); + return; + } + MEDIA_LOG_I("AudioDataSourceFilter GetSize : %{public}zu", bufferSize); + std::shared_ptr buffer; + AVBufferConfig avBufferConfig; + avBufferConfig.size = bufferSize; + avBufferConfig.memoryFlag = MemoryFlag::MEMORY_READ_WRITE; + if (outputBufferQueue_ == nullptr) { + MEDIA_LOG_I("AudioDataSourceFilter outputBufferQueue_ is nullptr"); + } + Status status = outputBufferQueue_->RequestBuffer(buffer, avBufferConfig, TIME_OUT_MS); + if (status != Status::OK) { + MEDIA_LOG_E("RequestBuffer fail"); + return; + } + if (audioDataSource_->ReadAt(buffer, bufferSize) != 0) { + MEDIA_LOG_E("RequestBuffer fail"); + outputBufferQueue_->PushBuffer(buffer, false); + return; + } + buffer->memory_->SetSize(bufferSize); + status = outputBufferQueue_->PushBuffer(buffer, true); + if (status != Status::OK) { + MEDIA_LOG_E("PushBuffer fail"); + } +} + +void AudioDataSourceFilter::OnLinkedResult(const sptr &queue, std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnLinkedResult"); + outputBufferQueue_ = queue; +} + +Status AudioDataSourceFilter::UpdateNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter UpdateNext"); + return Status::OK; +} + +Status AudioDataSourceFilter::UnLinkNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter UnLinkNext"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnLinked(StreamType inType, const std::shared_ptr &meta, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnLinked"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnUpdated(StreamType inType, const std::shared_ptr &meta, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUpdated"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnUnLinked(StreamType inType, const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUnLinked"); + return Status::OK; +} + +void AudioDataSourceFilter::OnUnlinkedResult(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUnlinkedResult"); + (void) meta; +} + +void AudioDataSourceFilter::OnUpdatedResult(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUpdatedResult"); + (void) meta; +} + +} // namespace Pipeline +} // namespace Media +} // namespace OHOS -- Gitee From 62d3a8698a4ff1d6c85e21ccfa8ca54e26eb1d80 Mon Sep 17 00:00:00 2001 From: FileStream Date: Sat, 20 Apr 2024 18:05:14 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=86=85=E5=A4=96=E5=90=8C=E5=BD=95?= =?UTF-8?q?=E9=9C=80=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: FileStream --- .../native/audio_data_source_filter.h | 74 +++++ services/media_engine/filters/BUILD.gn | 1 + .../filters/audio_data_source_filter.cpp | 304 ++++++++++++++++++ 3 files changed, 379 insertions(+) create mode 100644 interfaces/inner_api/native/audio_data_source_filter.h create mode 100644 services/media_engine/filters/audio_data_source_filter.cpp diff --git a/interfaces/inner_api/native/audio_data_source_filter.h b/interfaces/inner_api/native/audio_data_source_filter.h new file mode 100644 index 000000000..f55d3f73c --- /dev/null +++ b/interfaces/inner_api/native/audio_data_source_filter.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2024-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef FILTERS_AUDIO_DATA_SOURCE_FILTER_H +#define FILTERS_AUDIO_DATA_SOURCE_FILTER_H + +#include "filter/filter.h" +#include "common/status.h" +#include "osal/task/task.h" +#include "audio_capturer.h" +#include "media_data_source.h" + +namespace OHOS { +namespace Media { +namespace Pipeline { + +class AudioDataSourceFilter : public Filter, public std::enable_shared_from_this { +public: + explicit AudioDataSourceFilter(std::string name, FilterType type); + ~AudioDataSourceFilter() override; + void Init(const std::shared_ptr& receiver, + const std::shared_ptr& callback) override; + Status DoPrepare() override; + Status DoStart() override; + Status DoPause() override; + Status DoResume() override; + Status DoStop() override; + Status DoFlush() override; + Status DoRelease() override; + void SetParameter(const std::shared_ptr& meta) override; + void GetParameter(std::shared_ptr& meta) override; + Status LinkNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status UpdateNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status UnLinkNext(const std::shared_ptr& nextFilter, StreamType outType) override; + Status SendEos(); + FilterType GetFilterType(); + void SetAudioDataSource(const std::shared_ptr& audioSource); + void OnLinkedResult(const sptr& queue, std::shared_ptr& meta); + Status OnLinked(StreamType inType, const std::shared_ptr& meta, + const std::shared_ptr& callback) override; + Status OnUpdated(StreamType inType, const std::shared_ptr& meta, + const std::shared_ptr& callback) override; + Status OnUnLinked(StreamType inType, const std::shared_ptr& callback) override; + void OnUnlinkedResult(const std::shared_ptr& meta); + void OnUpdatedResult(const std::shared_ptr& meta); +private: + void ReadLoop(); + std::shared_ptr taskPtr_{ nullptr }; + sptr outputBufferQueue_; + std::shared_ptr audioDataSource_{ nullptr }; + + std::shared_ptr receiver_; + std::shared_ptr callback_; + + std::shared_ptr nextFilter_; + std::atomic eos_{ false }; + + Mutex captureMutex_{}; +}; + // namespace Pipeline +} // namespace Media +} // namespace OHOS +#endif // FILTERS_AUDIO_CAPTURE_FILTER_H \ No newline at end of file diff --git a/services/media_engine/filters/BUILD.gn b/services/media_engine/filters/BUILD.gn index 919facfa9..6bc45f2c0 100644 --- a/services/media_engine/filters/BUILD.gn +++ b/services/media_engine/filters/BUILD.gn @@ -56,6 +56,7 @@ ohos_shared_library("av_codec_media_engine_filters") { sources = [ "audio_capture_filter.cpp", + "audio_data_source_filter.cpp", "audio_decoder_filter.cpp", "audio_encoder_filter.cpp", "audio_sink_filter.cpp", diff --git a/services/media_engine/filters/audio_data_source_filter.cpp b/services/media_engine/filters/audio_data_source_filter.cpp new file mode 100644 index 000000000..3b82a37b4 --- /dev/null +++ b/services/media_engine/filters/audio_data_source_filter.cpp @@ -0,0 +1,304 @@ +/* + * Copyright (c) 2024-2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "audio_data_source_filter.h" +#include "common/log.h" +#include "filter/filter_factory.h" + +namespace OHOS { +namespace Media { +namespace Pipeline { +constexpr uint32_t TIME_OUT_MS = 0; +static AutoRegisterFilter g_registerAudioDataSourceFilter("builtin.recorder.audiodatasource", + FilterType::AUDIO_DATA_SOURCE, + [](const std::string& name, const FilterType type) { + return std::make_shared(name, FilterType::AUDIO_DATA_SOURCE); + }); + +/// End of Stream Buffer Flag +constexpr uint32_t BUFFER_FLAG_EOS = 0x00000001; +class AudioDataSourceFilterLinkCallback : public FilterLinkCallback { +public: + explicit AudioDataSourceFilterLinkCallback(std::shared_ptr audioDataSourceFilter) + : audioDataSourceFilter_(std::move(audioDataSourceFilter)) + { + } + + void OnLinkedResult(const sptr &queue, std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnLinkedResult(queue, meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + + void OnUnlinkedResult(std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnUnlinkedResult(meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + + void OnUpdatedResult(std::shared_ptr &meta) override + { + if (auto dataSourceFilter = audioDataSourceFilter_.lock()) { + dataSourceFilter->OnUpdatedResult(meta); + } else { + MEDIA_LOG_I("invalid dataSourceFilter"); + } + } + +private: + std::weak_ptr audioDataSourceFilter_; +}; + +AudioDataSourceFilter::AudioDataSourceFilter(std::string name, FilterType type): Filter(name, type) +{ + MEDIA_LOG_I("audio data source filter create"); +} + +AudioDataSourceFilter::~AudioDataSourceFilter() +{ + MEDIA_LOG_I("audio data source filter destroy"); +} + +void AudioDataSourceFilter::Init(const std::shared_ptr &receiver, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter Init"); + receiver_ = receiver; + callback_ = callback; + if (!taskPtr_) { + taskPtr_ = std::make_shared("DataReader"); + taskPtr_->RegisterJob([this] { ReadLoop(); return 0}); + } +} + +Status AudioDataSourceFilter::DoPrepare() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoPrepare"); + if (callback_ == nullptr) { + MEDIA_LOG_E("callback is nullptr"); + return Status::ERROR_NULL_POINTER; + } + callback_->OnCallback(shared_from_this(), FilterCallBackCommand::NEXT_FILTER_NEEDED, + StreamType::STREAMTYPE_RAW_AUDIO); + return Status::OK; +} + +Status AudioDataSourceFilter::DoStart() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoStart"); + nextFilter_->Start(); + eos_ = false; + if (taskPtr_) { + taskPtr_->Start(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoPause() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoPause"); + if (taskPtr_) { + taskPtr_->Pause(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoResume() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoResume"); + if (taskPtr_) { + taskPtr_->Start(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoStop() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoStop"); + // stop task firstly + if (taskPtr_) { + taskPtr_->Stop(); + } + if (nextFilter_) { + nextFilter_->Stop(); + } + return Status::OK; +} + +Status AudioDataSourceFilter::DoFlush() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoFlush"); + return Status::OK; +} + +Status AudioDataSourceFilter::DoRelease() +{ + MEDIA_LOG_I("AudioDataSourceFilter DoRelease"); + if (taskPtr_) { + taskPtr_->Stop(); + } + taskPtr_ = nullptr; + audioDataSource_ = nullptr; + return Status::OK; +} + +void AudioDataSourceFilter::SetParameter(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter SetParameter"); +} + +void AudioDataSourceFilter::GetParameter(std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter GetParameter"); +} + +Status AudioDataSourceFilter::LinkNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter LinkNext"); + auto meta = std::make_shared(); + GetParameter(meta); + nextFilter_ = nextFilter; + nextFiltersMap_[outType].push_back(nextFilter_); + std::shared_ptr filterLinkCallback = + std::make_shared(shared_from_this()); + nextFilter->OnLinked(outType, meta, filterLinkCallback); + return Status::OK; +} + +FilterType AudioDataSourceFilter::GetFilterType() +{ + MEDIA_LOG_I("AudioDataSourceFilter GetFilterType"); + return FilterType::AUDIO_CAPTURE; +} + +void AudioDataSourceFilter::SetAudioDataSource(const std::shared_ptr& audioSource) +{ + audioDataSource_ = audioSource; +} + +Status AudioDataSourceFilter::SendEos() +{ + MEDIA_LOG_I("AudioDataSourceFilter SendEos"); + Status ret = Status::OK; + if (outputBufferQueue_) { + std::shared_ptr buffer; + AVBufferConfig avBufferConfig; + ret = outputBufferQueue_->RequestBuffer(buffer, avBufferConfig, TIME_OUT_MS); + if (ret != Status::OK) { + MEDIA_LOG_I("RequestBuffer fail, ret" PUBLIC_LOG_D32, ret); + return ret; + } + buffer->flag_ |= BUFFER_FLAG_EOS; + outputBufferQueue_->PushBuffer(buffer, false); + } + eos_ = true; + return ret; +} + +void AudioDataSourceFilter::ReadLoop() +{ + MEDIA_LOG_D("AudioDataSourceFilter ReadLoop"); + if (eos_.load()) { + return; + } + int64_t bufferSize = 0; + if (audioDataSource_->GetSize(bufferSize) != 0) { + MEDIA_LOG_E("Get audioCaptureModule buffer size fail"); + return; + } + MEDIA_LOG_I("AudioDataSourceFilter GetSize : %{public}zu", bufferSize); + std::shared_ptr buffer; + AVBufferConfig avBufferConfig; + avBufferConfig.size = bufferSize; + avBufferConfig.memoryFlag = MemoryFlag::MEMORY_READ_WRITE; + if (outputBufferQueue_ == nullptr) { + MEDIA_LOG_I("AudioDataSourceFilter outputBufferQueue_ is nullptr"); + } + Status status = outputBufferQueue_->RequestBuffer(buffer, avBufferConfig, TIME_OUT_MS); + if (status != Status::OK) { + MEDIA_LOG_E("RequestBuffer fail"); + return; + } + if (audioDataSource_->ReadAt(buffer, bufferSize) != 0) { + MEDIA_LOG_E("RequestBuffer fail"); + outputBufferQueue_->PushBuffer(buffer, false); + return; + } + buffer->memory_->SetSize(bufferSize); + status = outputBufferQueue_->PushBuffer(buffer, true); + if (status != Status::OK) { + MEDIA_LOG_E("PushBuffer fail"); + } +} + +void AudioDataSourceFilter::OnLinkedResult(const sptr &queue, std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnLinkedResult"); + outputBufferQueue_ = queue; +} + +Status AudioDataSourceFilter::UpdateNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter UpdateNext"); + return Status::OK; +} + +Status AudioDataSourceFilter::UnLinkNext(const std::shared_ptr &nextFilter, StreamType outType) +{ + MEDIA_LOG_I("AudioDataSourceFilter UnLinkNext"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnLinked(StreamType inType, const std::shared_ptr &meta, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnLinked"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnUpdated(StreamType inType, const std::shared_ptr &meta, + const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUpdated"); + return Status::OK; +} + +Status AudioDataSourceFilter::OnUnLinked(StreamType inType, const std::shared_ptr &callback) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUnLinked"); + return Status::OK; +} + +void AudioDataSourceFilter::OnUnlinkedResult(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUnlinkedResult"); + (void) meta; +} + +void AudioDataSourceFilter::OnUpdatedResult(const std::shared_ptr &meta) +{ + MEDIA_LOG_I("AudioDataSourceFilter OnUpdatedResult"); + (void) meta; +} + +} // namespace Pipeline +} // namespace Media +} // namespace OHOS -- Gitee