blob: 732fadf6e6921638996cac39bfadb4306e9d3a1b [file] [log] [blame]
// 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.
#ifndef SRC_MEDIA_AUDIO_AUDIO_CORE_TESTING_FAKE_AUDIO_RENDERER_H_
#define SRC_MEDIA_AUDIO_AUDIO_CORE_TESTING_FAKE_AUDIO_RENDERER_H_
#include <fuchsia/media/cpp/fidl.h>
#include <lib/zx/clock.h>
#include <lib/zx/time.h>
#include <unordered_map>
#include <fbl/ref_ptr.h>
#include "src/media/audio/audio_core/audio_clock.h"
#include "src/media/audio/audio_core/audio_object.h"
#include "src/media/audio/audio_core/link_matrix.h"
#include "src/media/audio/audio_core/packet_queue.h"
#include "src/media/audio/audio_core/testing/packet_factory.h"
#include "src/media/audio/audio_core/usage_settings.h"
#include "src/media/audio/audio_core/utils.h"
namespace media::audio::testing {
class FakeAudioRenderer : public AudioObject, public fuchsia::media::AudioRenderer {
public:
static std::shared_ptr<FakeAudioRenderer> Create(async_dispatcher_t* dispatcher,
std::optional<Format> format,
fuchsia::media::AudioRenderUsage usage,
LinkMatrix* link_matrix) {
return std::make_shared<FakeAudioRenderer>(dispatcher, std::move(format), usage, link_matrix);
}
static std::shared_ptr<FakeAudioRenderer> CreateWithDefaultFormatInfo(
async_dispatcher_t* dispatcher, LinkMatrix* link_matrix);
FakeAudioRenderer(async_dispatcher_t* dispatcher, std::optional<Format> format,
fuchsia::media::AudioRenderUsage usage, LinkMatrix* link_matrix);
// Enqueues a packet that has all samples initialized to |sample| and lasts for |duration|.
void EnqueueAudioPacket(float sample, zx::duration duration = zx::msec(1),
fit::closure callback = nullptr);
// |media::audio::AudioObject|
std::optional<Format> format() const override { return format_; }
fit::result<std::shared_ptr<ReadableStream>, zx_status_t> InitializeDestLink(
const AudioObject& dest) override;
void CleanupDestLink(const AudioObject& dest) override;
std::optional<StreamUsage> usage() const override {
return {StreamUsage::WithRenderUsage(usage_)};
}
// |fuchsia::media::AudioRenderer|
void AddPayloadBuffer(uint32_t id, ::zx::vmo payload_buffer) override {}
void RemovePayloadBuffer(uint32_t id) override {}
void SendPacket(fuchsia::media::StreamPacket packet, SendPacketCallback callback) override {}
void SendPacketNoReply(fuchsia::media::StreamPacket packet) override {}
void EndOfStream() override {}
void DiscardAllPackets(DiscardAllPacketsCallback callback) override {}
void DiscardAllPacketsNoReply() override {}
void SetPcmStreamType(fuchsia::media::AudioStreamType type) override {}
void SetPtsUnits(uint32_t tick_per_second_numerator,
uint32_t tick_per_second_denominator) override {}
void SetPtsContinuityThreshold(float threshold_seconds) override {}
void GetReferenceClock(GetReferenceClockCallback callback) override {}
void SetReferenceClock(::zx::clock reference_clock) override {}
void Play(int64_t reference_time, int64_t media_time, PlayCallback callback) override {}
void PlayNoReply(int64_t reference_time, int64_t media_time) override {}
void Pause(PauseCallback callback) override {}
void PauseNoReply() override {}
void EnableMinLeadTimeEvents(bool enabled) override {}
void GetMinLeadTime(GetMinLeadTimeCallback callback) override {}
void BindGainControl(::fidl::InterfaceRequest<::fuchsia::media::audio::GainControl>
gain_control_request) override {}
void SetUsage(fuchsia::media::AudioRenderUsage usage) override {}
private:
zx::duration FindMinLeadTime();
async_dispatcher_t* dispatcher_;
std::optional<Format> format_;
fuchsia::media::AudioRenderUsage usage_;
PacketFactory packet_factory_;
std::unordered_map<const AudioObject*, std::shared_ptr<PacketQueue>> packet_queues_;
fbl::RefPtr<VersionedTimelineFunction> timeline_function_ =
fbl::MakeRefCounted<VersionedTimelineFunction>();
LinkMatrix& link_matrix_;
};
} // namespace media::audio::testing
#endif // SRC_MEDIA_AUDIO_AUDIO_CORE_TESTING_FAKE_AUDIO_RENDERER_H_