// Copyright 2018 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/audio_packet_ref.h"

#include "src/lib/fxl/logging.h"
#include "src/media/audio/audio_core/audio_core_impl.h"

namespace media::audio {

AudioPacketRef::AudioPacketRef(
    fbl::RefPtr<RefCountedVmoMapper> vmo_ref,
    fuchsia::media::AudioRenderer::SendPacketCallback callback,
    fuchsia::media::StreamPacket packet, AudioCoreImpl* service,
    uint32_t frac_frame_len, int64_t start_pts)
    : vmo_ref_(std::move(vmo_ref)),
      callback_(std::move(callback)),
      packet_(packet),
      service_(service),
      frac_frame_len_(frac_frame_len),
      start_pts_(start_pts),
      end_pts_(start_pts + frac_frame_len) {
  FXL_DCHECK(service_);
  FXL_DCHECK(vmo_ref_ != nullptr);
}

void AudioPacketRef::fbl_recycle() {
  // If the packet is dying for the first time, and we successfully queue it for
  // cleanup, allow it to live on until the cleanup actually runs.  Otherwise
  // the object is at its end of life.
  if (!was_recycled_) {
    was_recycled_ = true;
    if (NeedsCleanup()) {
      FXL_DCHECK(service_);
      service_->SchedulePacketCleanup(std::unique_ptr<AudioPacketRef>(this));
      return;
    }
  }

  delete this;
}

}  // namespace media::audio
