// 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/testing/fake_stream.h"

#include <lib/syslog/cpp/macros.h>

namespace media::audio::testing {

FakeStream::FakeStream(const Format& format, size_t max_buffer_size, zx::clock clock)
    : ReadableStream(format), audio_clock_(AudioClock::ClientFixed(std::move(clock))) {
  buffer_size_ = max_buffer_size;
  buffer_ = std::make_unique<uint8_t[]>(buffer_size_);
  memset(buffer_.get(), 0, buffer_size_);
}

std::optional<ReadableStream::Buffer> FakeStream::ReadLock(Fixed frame, size_t frame_count) {
  FX_CHECK(frame_count * format().bytes_per_frame() < buffer_size_);
  return std::make_optional<ReadableStream::Buffer>(frame, Fixed(frame_count), buffer_.get(), true,
                                                    usage_mask_, gain_db_);
}

ReadableStream::TimelineFunctionSnapshot FakeStream::ref_time_to_frac_presentation_frame() const {
  auto [timeline_function, generation] = timeline_function_->get();
  return {
      .timeline_function = timeline_function,
      .generation = generation,
  };
}

}  // namespace media::audio::testing
