// Copyright 2015 The Chromium 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 SERVICES_MEDIA_AUDIO_PLATFORM_LINUX_ALSA_OUTPUT_H_
#define SERVICES_MEDIA_AUDIO_PLATFORM_LINUX_ALSA_OUTPUT_H_

#include <memory>

#include "mojo/services/media/common/cpp/linear_transform.h"
#include "mojo/services/media/common/interfaces/media_types.mojom.h"
#include "services/media/audio/audio_output.h"
#include "services/media/audio/platform/generic/standard_output_base.h"

namespace mojo {
namespace media {
namespace audio {

class AlsaOutput : public StandardOutputBase {
 public:
  static AudioOutputPtr New(AudioOutputManager* manager);
  ~AlsaOutput() override;

  MediaResult Configure(LpcmMediaTypeDetailsPtr config);

 protected:
  explicit AlsaOutput(AudioOutputManager* manager);

  // AudioOutput implementation
  MediaResult Init() override;
  void Cleanup() override;

  // StandardOutputBase implementation
  bool StartMixJob(MixJob* job, const LocalTime& process_start) override;
  bool FinishMixJob(const MixJob& job) override;

 private:
  static constexpr LocalDuration kChunkDuration  = local_time::from_msec(5);
  static constexpr uint32_t kLowBufThreshChunks  = 6;
  static constexpr uint32_t kTargetLatencyChunks = kLowBufThreshChunks + 1;
  static constexpr LocalDuration kLowBufThresh   = kChunkDuration
                                                 * kLowBufThreshChunks;
  static constexpr LocalDuration kTargetLatency  = kChunkDuration
                                                 * kTargetLatencyChunks;

  void HandleAlsaError(int code);
  void HandleAsError(int code);
  void HandleAsUnderflow();

  // libtinyalsa vs. libasound abstraction.  Methods are implemented either in
  // alsa_output_tinyalsa.cc or alsa_output_desktop.cc depending on the target
  // we are building for.
  MediaResult AlsaOpen();
  void AlsaClose();
  MediaResult AlsaSelectFormat(const LpcmMediaTypeDetailsPtr& config);
  int AlsaWrite(const void* data, uint32_t frames);
  int AlsaGetAvailDelay(uint32_t* avail, uint32_t* delay = nullptr);
  int AlsaRecover(int err_code);

  void* alsa_device_ = nullptr;
  int32_t alsa_format_ = -1;

  LinearTransform::Ratio frames_per_tick_;

  std::unique_ptr<uint8_t> mix_buf_;
  uint32_t mix_buf_frames_ = 0;

  bool primed_ = false;
  bool local_to_output_known_ = false;
  LinearTransform local_to_output_;
  uint32_t local_to_output_gen_ = MixJob::INVALID_GENERATION + 1;
  int64_t frames_sent_;
};

}  // namespace audio
}  // namespace media
}  // namespace mojo

#endif  // SERVICES_MEDIA_AUDIO_PLATFORM_LINUX_ALSA_OUTPUT_H_

