blob: cc526ea394bdc2a6b17d6c3566e4ad1faf802aee [file] [log] [blame] [edit]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/media/audio/lib/effects_loader/effect.h"
#include <lib/syslog/cpp/macros.h>
#include <lib/trace/event.h>
namespace media::audio {
Effect::~Effect() {
if (is_valid()) {
Delete();
}
}
// Allow move.
Effect::Effect(Effect&& o) noexcept
: effects_handle_(o.effects_handle_),
module_(std::move(o.module_)),
instance_name_(std::move(o.instance_name_)) {
o.effects_handle_ = FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE;
}
Effect& Effect::operator=(Effect&& o) noexcept {
effects_handle_ = o.effects_handle_;
module_ = std::move(o.module_);
instance_name_ = std::move(o.instance_name_);
o.effects_handle_ = FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE;
return *this;
}
zx_status_t Effect::Delete() {
TRACE_DURATION("audio", "Effect::Delete");
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
auto result = module_->delete_effect(effects_handle_) ? ZX_OK : ZX_ERR_NOT_SUPPORTED;
module_ = nullptr;
effects_handle_ = FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE;
return result;
}
zx_status_t Effect::UpdateConfiguration(std::string_view config) const {
TRACE_DURATION("audio", "Effect::UpdateConfiguration");
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
return module_->update_effect_configuration(effects_handle_, config.data(), config.size())
? ZX_OK
: ZX_ERR_NOT_SUPPORTED;
}
zx_status_t Effect::ProcessInPlace(int64_t num_frames, float* audio_buff_in_out) const {
TRACE_DURATION("audio", "Effect::ProcessInPlace", "num_frames", num_frames);
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
return module_->process_inplace(effects_handle_, static_cast<uint32_t>(num_frames),
audio_buff_in_out)
? ZX_OK
: ZX_ERR_NOT_SUPPORTED;
}
zx_status_t Effect::Process(int64_t num_frames, const float* audio_buff_in,
float** audio_buff_out) const {
TRACE_DURATION("audio", "Effect::Process", "num_frames", num_frames);
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
return module_->process(effects_handle_, static_cast<uint32_t>(num_frames), audio_buff_in,
audio_buff_out)
? ZX_OK
: ZX_ERR_NOT_SUPPORTED;
}
zx_status_t Effect::Flush() const {
TRACE_DURATION("audio", "Effect::Flush");
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
return module_->flush(effects_handle_) ? ZX_OK : ZX_ERR_NOT_SUPPORTED;
}
zx_status_t Effect::GetParameters(fuchsia_audio_effects_parameters* params) const {
TRACE_DURATION("audio", "Effect::GetParameters");
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
return module_->get_parameters(effects_handle_, params) ? ZX_OK : ZX_ERR_NOT_SUPPORTED;
}
void Effect::SetStreamInfo(const fuchsia_audio_effects_stream_info& stream_info) const {
TRACE_DURATION("audio", "Effect::SetStreamInfo");
FX_DCHECK(module_);
FX_DCHECK(effects_handle_ != FUCHSIA_AUDIO_EFFECTS_INVALID_HANDLE);
// If a module does not implement this we just don't notify them.
if (module_->set_stream_info) {
module_->set_stream_info(effects_handle_, &stream_info);
}
}
} // namespace media::audio