// 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.

#ifndef SRC_MEDIA_AUDIO_AUDIO_CORE_ULTRASOUND_RENDERER_H_
#define SRC_MEDIA_AUDIO_AUDIO_CORE_ULTRASOUND_RENDERER_H_

#include <fuchsia/ultrasound/cpp/fidl.h>

#include "src/media/audio/audio_core/base_renderer.h"
#include "src/media/audio/audio_core/stream_usage.h"
#include "src/media/audio/audio_core/stream_volume_manager.h"

namespace media::audio {

class UltrasoundRenderer : public BaseRenderer {
 public:
  static std::shared_ptr<UltrasoundRenderer> Create(
      fidl::InterfaceRequest<fuchsia::media::AudioRenderer> request, Context* context,
      fuchsia::ultrasound::Factory::CreateRendererCallback callback) {
    return std::make_shared<UltrasoundRenderer>(std::move(request), context, std::move(callback));
  }

  // Callers should use the |Create| method instead, this is only public to enable std::make_shared.
  UltrasoundRenderer(fidl::InterfaceRequest<fuchsia::media::AudioRenderer> request,
                     Context* context,
                     fuchsia::ultrasound::Factory::CreateRendererCallback callback);
  ~UltrasoundRenderer() override = default;

 private:
  // |media::audio::AudioObject|
  std::optional<Format> format() const final { return format_; }
  std::optional<StreamUsage> usage() const override {
    return {StreamUsage::WithRenderUsage(RenderUsage::ULTRASOUND)};
  }
  fit::result<std::shared_ptr<ReadableStream>, zx_status_t> InitializeDestLink(
      const AudioObject& dest) override;
  void CleanupDestLink(const AudioObject& dest) override;

  // |fuchsia::media::AudioRenderer|
  void SetPcmStreamType(fuchsia::media::AudioStreamType format) final;
  void SetUsage(fuchsia::media::AudioRenderUsage usage) final;
  void BindGainControl(fidl::InterfaceRequest<fuchsia::media::audio::GainControl> request) final;
  void SetReferenceClock(zx::clock ref_clock) final;

  std::optional<Format> format_;
  fuchsia::ultrasound::Factory::CreateRendererCallback create_callback_;
};

}  // namespace media::audio

#endif  // SRC_MEDIA_AUDIO_AUDIO_CORE_ULTRASOUND_RENDERER_H_
