blob: cf3575d2453271e10a7891e6176df8b9b766f89f [file] [log] [blame]
// Copyright 2016 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 GARNET_BIN_MEDIA_AUDIO_SERVER_AUDIO_PIPE_H_
#define GARNET_BIN_MEDIA_AUDIO_SERVER_AUDIO_PIPE_H_
#include <memory>
#include <fuchsia/media/cpp/fidl.h>
#include "garnet/bin/media/audio_server/audio_packet_ref.h"
#include "garnet/bin/media/audio_server/fwd_decls.h"
#include "lib/media/transport/media_packet_consumer_base.h"
namespace media {
namespace audio {
class AudioRenderer1Impl;
class AudioPipe : public MediaPacketConsumerBase {
public:
class AudioPacketRefV1 : public ::media::audio::AudioPacketRef {
public:
void Cleanup() final;
void* payload() final;
uint32_t flags() final;
private:
friend class AudioPipe;
AudioPacketRefV1(
std::unique_ptr<MediaPacketConsumerBase::SuppliedPacket> packet,
AudioServerImpl* server, uint32_t frac_frame_len, int64_t start_pts);
std::unique_ptr<MediaPacketConsumerBase::SuppliedPacket> supplied_packet_;
};
AudioPipe(AudioRenderer1Impl* owner, AudioServerImpl* server);
~AudioPipe() override;
// Indicates a program range was set.
void ProgramRangeSet(uint64_t program, int64_t min_pts, int64_t max_pts);
// Indicates the priming was requested. The pipe is responsible for calling
// the callback when priming is complete.
void PrimeRequested(
fuchsia::media::MediaTimelineControlPoint::PrimeCallback callback);
protected:
void OnPacketSupplied(
std::unique_ptr<MediaPacketConsumerBase::SuppliedPacket> packet) override;
void OnFlushRequested(bool hold_frame, FlushCallback cbk) override;
private:
static constexpr uint32_t kDemandMinPacketsOutstanding = 4;
void UpdateMinPts(int64_t min_pts);
AudioRenderer1Impl* owner_;
AudioServerImpl* server_;
fuchsia::media::MediaTimelineControlPoint::PrimeCallback prime_callback_;
int64_t min_pts_ = fuchsia::media::kMinTime;
bool min_pts_dirty_ = false;
// State used for timestamp interpolation
bool next_pts_known_ = 0;
int64_t next_pts_;
};
} // namespace audio
} // namespace media
#endif // GARNET_BIN_MEDIA_AUDIO_SERVER_AUDIO_PIPE_H_