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

namespace media::audio {

std::optional<fuchsia::media::AudioRenderUsage> FidlRenderUsageFromRenderUsage(RenderUsage u) {
  auto underlying = static_cast<std::underlying_type_t<RenderUsage>>(u);
  if (underlying < fuchsia::media::RENDER_USAGE_COUNT) {
    return {static_cast<fuchsia::media::AudioRenderUsage>(underlying)};
  }
  return {};
}

std::optional<fuchsia::media::AudioCaptureUsage> FidlCaptureUsageFromCaptureUsage(CaptureUsage u) {
  auto underlying = static_cast<std::underlying_type_t<CaptureUsage>>(u);
  if (underlying < fuchsia::media::CAPTURE_USAGE_COUNT) {
    return {static_cast<fuchsia::media::AudioCaptureUsage>(underlying)};
  }
  return {};
}

StreamUsage StreamUsageFromFidlUsage(const fuchsia::media::Usage& usage) {
  if (usage.is_render_usage()) {
    return StreamUsage::WithRenderUsage(usage.render_usage());
  } else if (usage.is_capture_usage()) {
    return StreamUsage::WithCaptureUsage(usage.capture_usage());
  } else {
    return StreamUsage();
  }
}

const char* RenderUsageToString(const RenderUsage& usage) {
  switch (usage) {
#define EXPAND_RENDER_USAGE(U) \
  case RenderUsage::U:         \
    return "RenderUsage::" #U;
    EXPAND_EACH_RENDER_USAGE
#undef EXPAND_RENDER_USAGE
  }
}

const char* CaptureUsageToString(const CaptureUsage& usage) {
  switch (usage) {
#define EXPAND_CAPTURE_USAGE(U) \
  case CaptureUsage::U:         \
    return "CaptureUsage::" #U;
    EXPAND_EACH_CAPTURE_USAGE
#undef EXPAND_CAPTURE_USAGE
  }
}

const char* StreamUsage::ToString() const {
  if (is_render_usage()) {
    return RenderUsageToString(render_usage());
  } else if (is_capture_usage()) {
    return CaptureUsageToString(capture_usage());
  } else {
    return "(empty usage)";
  }
}

}  // namespace media::audio
