blob: 1046b273ddfcfc749d7587323478bbe59add8831 [file] [log] [blame]
// 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"
#include <fidl/fuchsia.media/cpp/fidl.h>
#include <fidl/fuchsia.media/cpp/hlcpp_conversion.h>
#include <fidl/fuchsia.media/cpp/type_conversions.h>
#include <fuchsia/media/cpp/fidl.h>
#include <lib/fidl/cpp/hlcpp_conversion.h>
#include <lib/fidl/cpp/wire_natural_conversions.h>
namespace media::audio {
using fuchsia::media::AudioCaptureUsage;
using fuchsia::media::AudioCaptureUsage2;
using fuchsia::media::AudioRenderUsage;
using fuchsia::media::AudioRenderUsage2;
//
// Conversions
// Convenience functions for when the conversion is guaranteed to succeed (e.g. in test setup).
//
// RenderUsage
RenderUsage ToRenderUsage(AudioRenderUsage u) { return RenderUsage(ToIndex(u)); }
RenderUsage ToRenderUsage(fuchsia_media::AudioRenderUsage u) { return RenderUsage(ToIndex(u)); }
RenderUsage ToRenderUsage(AudioRenderUsage2 u) { return RenderUsage(ToIndex(u)); }
RenderUsage ToRenderUsage(fuchsia_media::AudioRenderUsage2 u) { return RenderUsage(ToIndex(u)); }
// CaptureUsage
CaptureUsage ToCaptureUsage(AudioCaptureUsage usage) { return CaptureUsage(ToIndex(usage)); }
CaptureUsage ToCaptureUsage(fuchsia_media::AudioCaptureUsage usage) {
return CaptureUsage(ToIndex(usage));
}
CaptureUsage ToCaptureUsage(AudioCaptureUsage2 usage) { return CaptureUsage(ToIndex(usage)); }
CaptureUsage ToCaptureUsage(fuchsia_media::AudioCaptureUsage2 usage) {
return CaptureUsage(ToIndex(usage));
}
const char* ToString(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* ToString(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 media::audio::ToString(render_usage());
}
if (is_capture_usage()) {
return media::audio::ToString(capture_usage());
}
return "(empty usage)";
}
// StreamUsage
StreamUsage ToStreamUsage(const fuchsia::media::Usage2& usage) {
if (usage.is_render_usage()) {
return StreamUsage::WithRenderUsage(usage.render_usage());
}
if (usage.is_capture_usage()) {
return StreamUsage::WithCaptureUsage(usage.capture_usage());
}
return StreamUsage();
}
// AudioRenderUsage
std::optional<AudioRenderUsage> ToFidlRenderUsageTry(const AudioRenderUsage2& usage2) {
if (auto index = ToIndex(usage2); index < fuchsia::media::RENDER_USAGE_COUNT) {
return AudioRenderUsage(index);
}
return {};
}
// AudioRenderUsage2
AudioRenderUsage2 ToFidlRenderUsage2(const AudioRenderUsage& usage) {
return AudioRenderUsage2(fidl::ToUnderlying(usage));
}
AudioRenderUsage2 ToFidlRenderUsage2(const fuchsia_media::AudioRenderUsage& usage) {
return AudioRenderUsage2(fidl::ToUnderlying(usage));
}
AudioRenderUsage2 ToFidlRenderUsage2(const fuchsia_media::AudioRenderUsage2& usage) {
return AudioRenderUsage2(fidl::ToUnderlying(usage));
}
AudioRenderUsage2 ToFidlRenderUsage2(RenderUsage u) {
auto underlying = static_cast<std::underlying_type_t<RenderUsage>>(u);
return {AudioRenderUsage2(underlying)};
}
// AudioCaptureUsage
std::optional<AudioCaptureUsage> ToFidlCaptureUsageTry(const AudioCaptureUsage2& usage2) {
if (auto index = ToIndex(usage2); index < fuchsia::media::CAPTURE_USAGE_COUNT) {
return AudioCaptureUsage(index);
}
return {};
}
AudioCaptureUsage ToFidlCaptureUsage(const fuchsia_media::AudioCaptureUsage& usage) {
return AudioCaptureUsage(fidl::ToUnderlying(usage));
}
AudioCaptureUsage ToFidlCaptureUsage(CaptureUsage usage) {
auto underlying = static_cast<std::underlying_type_t<CaptureUsage>>(usage);
return AudioCaptureUsage(underlying);
}
// AudioCaptureUsage2
AudioCaptureUsage2 ToFidlCaptureUsage2(const AudioCaptureUsage& usage) {
return AudioCaptureUsage2(fidl::ToUnderlying(usage));
}
AudioCaptureUsage2 ToFidlCaptureUsage2(const fuchsia_media::AudioCaptureUsage& usage) {
return AudioCaptureUsage2(fidl::ToUnderlying(usage));
}
AudioCaptureUsage2 ToFidlCaptureUsage2(const fuchsia_media::AudioCaptureUsage2& usage) {
return AudioCaptureUsage2(fidl::ToUnderlying(usage));
}
AudioCaptureUsage2 ToFidlCaptureUsage2(CaptureUsage usage) {
auto underlying = static_cast<std::underlying_type_t<CaptureUsage>>(usage);
return {AudioCaptureUsage2(underlying)};
}
// Usage
std::optional<fuchsia::media::Usage> ToFidlUsageTry(const fuchsia::media::Usage2& usage2) {
if (usage2.is_capture_usage()) {
auto index = ToIndex(usage2.capture_usage());
if (index < fuchsia::media::CAPTURE_USAGE_COUNT) {
return fuchsia::media::Usage::WithCaptureUsage(AudioCaptureUsage(index));
}
} else if (auto index = ToIndex(usage2.render_usage());
index < fuchsia::media::RENDER_USAGE_COUNT) {
return fuchsia::media::Usage::WithRenderUsage(AudioRenderUsage(index));
}
return {};
}
std::optional<fuchsia::media::Usage> ToFidlUsageTry(
const fuchsia::media::AudioRenderUsage2& usage2) {
if (auto index = ToIndex(usage2); index < fuchsia::media::RENDER_USAGE_COUNT) {
return fuchsia::media::Usage::WithRenderUsage(AudioRenderUsage(index));
}
return {};
}
// Usage2
fuchsia::media::Usage2 ToFidlUsage2(const fuchsia::media::Usage& usage) {
if (usage.is_render_usage()) {
return fuchsia::media::Usage2::WithRenderUsage(ToFidlRenderUsage2(usage.render_usage()));
}
return fuchsia::media::Usage2::WithCaptureUsage(ToFidlCaptureUsage2(usage.capture_usage()));
}
fuchsia::media::Usage2 ToFidlUsage2(const fuchsia_media::Usage& usage) {
if (usage.Which() == fuchsia_media::Usage::Tag::kRenderUsage) {
return fuchsia::media::Usage2::WithRenderUsage(
ToFidlRenderUsage2(usage.render_usage().value()));
}
return fuchsia::media::Usage2::WithCaptureUsage(
ToFidlCaptureUsage2(usage.capture_usage().value()));
}
fuchsia::media::Usage2 ToFidlUsage2(RenderUsage usage) {
auto underlying = static_cast<std::underlying_type_t<RenderUsage>>(usage);
FX_CHECK(underlying < fuchsia::media::RENDER_USAGE2_COUNT);
return fuchsia::media::Usage2::WithRenderUsage(AudioRenderUsage2(underlying));
}
fuchsia::media::Usage2 ToFidlUsage2(CaptureUsage usage) {
auto underlying = static_cast<std::underlying_type_t<CaptureUsage>>(usage);
FX_CHECK(underlying < fuchsia::media::CAPTURE_USAGE_COUNT);
return fuchsia::media::Usage2::WithCaptureUsage(AudioCaptureUsage2(underlying));
}
// Logging for FIDL Usage and UsageState unions.
std::ostream& operator<<(std::ostream& out, const fuchsia::media::Usage& usage) {
out << "Usage: ";
if (usage.is_capture_usage()) {
out << "Capture::";
switch (usage.capture_usage()) {
case AudioCaptureUsage::BACKGROUND:
return (out << "BACKGROUND");
case AudioCaptureUsage::COMMUNICATION:
return (out << "COMMUNICATION");
case AudioCaptureUsage::FOREGROUND:
return (out << "Foreground");
case AudioCaptureUsage::SYSTEM_AGENT:
return (out << "SYSTEM_AGENT");
default:
return (out << "UNKNOWN");
}
}
if (usage.is_render_usage()) {
out << "Render::";
switch (usage.render_usage()) {
case AudioRenderUsage::BACKGROUND:
return (out << "BACKGROUND");
case AudioRenderUsage::COMMUNICATION:
return (out << "COMMUNICATION");
case AudioRenderUsage::INTERRUPTION:
return (out << "INTERRUPTION");
case AudioRenderUsage::MEDIA:
return (out << "MEDIA");
case AudioRenderUsage::SYSTEM_AGENT:
return (out << "SYSTEM_AGENT");
default:
return (out << "UNKNOWN");
}
}
return (out << "Unknown Usage type");
}
std::ostream& operator<<(std::ostream& out, const fuchsia::media::Usage2& usage) {
out << "Usage2: ";
if (usage.is_capture_usage()) {
out << "Capture::";
switch (usage.capture_usage()) {
case AudioCaptureUsage2::BACKGROUND:
return (out << "BACKGROUND");
case AudioCaptureUsage2::COMMUNICATION:
return (out << "COMMUNICATION");
case AudioCaptureUsage2::FOREGROUND:
return (out << "FOREGROUND");
case AudioCaptureUsage2::SYSTEM_AGENT:
return (out << "SYSTEM_AGENT");
default:
return (out << "UNKNOWN");
}
}
if (usage.is_render_usage()) {
out << "Render::";
switch (usage.render_usage()) {
case AudioRenderUsage2::ACCESSIBILITY:
return (out << "ACCESSIBILITY");
case AudioRenderUsage2::BACKGROUND:
return (out << "BACKGROUND");
case AudioRenderUsage2::COMMUNICATION:
return (out << "COMMUNICATION");
case AudioRenderUsage2::INTERRUPTION:
return (out << "INTERRUPTION");
case AudioRenderUsage2::MEDIA:
return (out << "MEDIA");
case AudioRenderUsage2::SYSTEM_AGENT:
return (out << "SYSTEM_AGENT");
default:
return (out << "UNKNOWN");
}
}
return (out << "INVALID TYPE");
}
std::ostream& operator<<(std::ostream& out, const fuchsia::media::UsageState& state) {
if (state.is_unadjusted()) {
return (out << "UNADJUSTED");
}
if (state.is_ducked()) {
return (out << "DUCKED");
}
if (state.is_muted()) {
return (out << "MUTED");
}
return (out << "Unknown Usage state");
}
} // namespace media::audio