// media/mojo/mojom/channel_layout.mojom-shared.cc is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/mojo/mojom/channel_layout.mojom-shared.h"
#include <ostream>
#include <utility>
#include "base/strings/stringprintf.h"
#include "mojo/public/cpp/bindings/lib/validate_params.h"
#include "mojo/public/cpp/bindings/lib/validation_errors.h"
#include "mojo/public/cpp/bindings/lib/validation_util.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value.h"

#include "media/mojo/mojom/channel_layout.mojom-params-data.h"
namespace media {
namespace mojom {

NOINLINE static const char* ChannelLayoutToStringHelper(ChannelLayout value) {
  // Defined in a helper function to ensure that Clang generates a lookup table.
  switch(value) {
    case ChannelLayout::kNone:
      return "kNone";
    case ChannelLayout::kUnsupported:
      return "kUnsupported";
    case ChannelLayout::kMono:
      return "kMono";
    case ChannelLayout::kStereo:
      return "kStereo";
    case ChannelLayout::k2_1:
      return "k2_1";
    case ChannelLayout::kSurround:
      return "kSurround";
    case ChannelLayout::k4_0:
      return "k4_0";
    case ChannelLayout::k2_2:
      return "k2_2";
    case ChannelLayout::kQuad:
      return "kQuad";
    case ChannelLayout::k5_0:
      return "k5_0";
    case ChannelLayout::k5_1:
      return "k5_1";
    case ChannelLayout::k5_0Back:
      return "k5_0Back";
    case ChannelLayout::k5_1Back:
      return "k5_1Back";
    case ChannelLayout::k7_0:
      return "k7_0";
    case ChannelLayout::k7_1:
      return "k7_1";
    case ChannelLayout::k7_1Wide:
      return "k7_1Wide";
    case ChannelLayout::kStereoDownmix:
      return "kStereoDownmix";
    case ChannelLayout::k2Point1:
      return "k2Point1";
    case ChannelLayout::k3_1:
      return "k3_1";
    case ChannelLayout::k4_1:
      return "k4_1";
    case ChannelLayout::k6_0:
      return "k6_0";
    case ChannelLayout::k6_0Front:
      return "k6_0Front";
    case ChannelLayout::kHexagonal:
      return "kHexagonal";
    case ChannelLayout::k6_1:
      return "k6_1";
    case ChannelLayout::k6_1Back:
      return "k6_1Back";
    case ChannelLayout::k6_1Front:
      return "k6_1Front";
    case ChannelLayout::k7_0Front:
      return "k7_0Front";
    case ChannelLayout::k7_1WideBack:
      return "k7_1WideBack";
    case ChannelLayout::kOctagonal:
      return "kOctagonal";
    case ChannelLayout::kDiscrete:
      return "kDiscrete";
    case ChannelLayout::kStereoAndKeyboardMic:
      return "kStereoAndKeyboardMic";
    case ChannelLayout::k4_1QuadSide:
      return "k4_1QuadSide";
    case ChannelLayout::kBitstream:
      return "kBitstream";
    case ChannelLayout::k5_1_4Downmix:
      return "k5_1_4Downmix";
    case ChannelLayout::k1_1:
      return "k1_1";
    case ChannelLayout::k3_1Back:
      return "k3_1Back";
    case ChannelLayout::k5_1_4:
      return "k5_1_4";
    case ChannelLayout::k7_1_4:
      return "k7_1_4";
    default:
      return nullptr;
  }
}

std::string ChannelLayoutToString(ChannelLayout value) {
  const char *str = ChannelLayoutToStringHelper(value);
  if (!str) {
    return base::StringPrintf("Unknown ChannelLayout value: %i", static_cast<int32_t>(value));
  }
  return str;
}

std::ostream& operator<<(std::ostream& os, ChannelLayout value) {
  return os << ChannelLayoutToString(value);
}

namespace internal {
// static
bool ChannelLayoutConfig_Data::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context,
    bool inlined) {
  if (!data) {
    DCHECK(!inlined);
    return true;
  }

  // If it is inlined, the alignment is already enforced by its enclosing
  // object. We don't have to validate that.
  DCHECK(!inlined || mojo::internal::IsAligned(data));

  if (!inlined &&
      !mojo::internal::ValidateNonInlinedUnionHeaderAndClaimMemory(
          data, validation_context)) {
    return false;
  }

  const ChannelLayoutConfig_Data* object = static_cast<const ChannelLayoutConfig_Data*>(data);

  if (inlined && object->is_null())
    return true;

  switch (object->tag) {

    case ChannelLayoutConfig_Tag::kPredefinedLayout: {


      if (!::media::mojom::internal::ChannelLayout_Data
            ::Validate(object->data.f_predefined_layout, validation_context))
        return false;
      return true;
    }
    case ChannelLayoutConfig_Tag::kDiscreteChannels: {

      return true;
    }
    default: {

      ReportValidationError(
          validation_context,
          mojo::internal::VALIDATION_ERROR_UNKNOWN_UNION_TAG,
          "unknown tag in ChannelLayoutConfig");
      return false;
    }
  }
}

}  // namespace internal
}  // namespace mojom
}  // namespace media

namespace perfetto {

// static
void TraceFormatTraits<::media::mojom::ChannelLayout>::WriteIntoTrace(
   perfetto::TracedValue context, ::media::mojom::ChannelLayout value) {
  return std::move(context).WriteString(::media::mojom::ChannelLayoutToString(value));
}

} // namespace perfetto