blob: 4a91f757689e10f7dde56eca19a0fa75b13de78e [file] [log] [blame]
// Copyright 2020 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/audio_core/ultrasound_renderer.h"
#include "src/media/audio/lib/clock/utils.h"
namespace media::audio {
UltrasoundRenderer::UltrasoundRenderer(
fidl::InterfaceRequest<fuchsia::media::AudioRenderer> request, Context* context,
fuchsia::ultrasound::Factory::CreateRendererCallback callback)
: BaseRenderer(std::move(request), context), create_callback_(std::move(callback)) {
FX_DCHECK(create_callback_);
reporter().SetUsage(RenderUsage::ULTRASOUND);
}
fit::result<std::shared_ptr<ReadableStream>, zx_status_t> UltrasoundRenderer::InitializeDestLink(
const AudioObject& dest) {
if (!create_callback_) {
return fit::error(ZX_ERR_BAD_STATE);
}
auto format = dest.format();
if (!format) {
return fit::error(ZX_ERR_BAD_STATE);
}
auto result = audio::clock::DuplicateClock(raw_clock());
if (!result.is_ok()) {
return fit::error(result.error());
}
zx::clock reference_clock_out = result.take_value();
// Ultrasound renderers require FLOAT samples.
auto stream_type = format->stream_type();
stream_type.sample_format = fuchsia::media::AudioSampleFormat::FLOAT;
auto create_result = Format::Create(stream_type);
FX_DCHECK(create_result.is_ok());
format_ = {create_result.take_value()};
reporter().SetFormat(*format_);
create_callback_(std::move(reference_clock_out), format_->stream_type());
create_callback_ = nullptr;
return BaseRenderer::InitializeDestLink(dest);
}
void UltrasoundRenderer::CleanupDestLink(const AudioObject& dest) {
// Ultrasound renderers do not support being re-linked. If we become unlinked then we will just
// close the client channel.
binding().Close(ZX_OK);
BaseRenderer::CleanupDestLink(dest);
}
// Some unsupported methods on ultrasound renderers.
void UltrasoundRenderer::SetPcmStreamType(fuchsia::media::AudioStreamType format) {
FX_LOGS(ERROR) << "Unsupported method SetPcmStreamType on ultrasound renderer";
binding().Close(ZX_ERR_NOT_SUPPORTED);
}
void UltrasoundRenderer::SetUsage(fuchsia::media::AudioRenderUsage usage) {
FX_LOGS(ERROR) << "Unsupported method SetUsage on ultrasound renderer";
binding().Close(ZX_ERR_NOT_SUPPORTED);
}
void UltrasoundRenderer::BindGainControl(
fidl::InterfaceRequest<fuchsia::media::audio::GainControl> request) {
FX_LOGS(ERROR) << "Unsupported method BindGainControl on ultrasound renderer";
binding().Close(ZX_ERR_NOT_SUPPORTED);
}
void UltrasoundRenderer::SetReferenceClock(zx::clock ref_clock) {
FX_LOGS(ERROR) << "Unsupported method SetReferenceClock on ultrasound renderer";
binding().Close(ZX_ERR_NOT_SUPPORTED);
}
} // namespace media::audio