// Copyright 2019 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.

library fuchsia.media;

using fuchsia.media.audio;

/// Usage annotating the purpose of the stream being used to render audio.
/// An AudioRenderer's usage cannot be changed after creation.  The
/// AudioRenderUsage is used by audio policy to dictate how audio streams
/// interact with each other.
enum AudioRenderUsage {
    /// Stream is intended to be used for ambient or background sound. Streams
    /// that can be interrupted without consequence should use this.
    BACKGROUND = 0;

    /// Stream is intended to be used for normal functionality. Streams that
    /// are part of normal functionality should use this.
    MEDIA = 1;

    /// Stream is intended to interrupt any ongoing function of the device.
    /// Streams that are used for interruptions like notifications should use
    /// this.
    INTERRUPTION = 2;

    /// Stream is for interaction with a system agent.  This should be used
    /// in response to a user initiated trigger.
    SYSTEM_AGENT = 3;

    /// Stream is intended to be used for some form of real time user to user
    /// communication. Voice/Video chat should use this.
    COMMUNICATION = 4;
};
const uint8 RENDER_USAGE_COUNT = 5;

/// Usages annotating the purpose of the stream being used to capture audio. The
/// AudioCaptureUsage is used by audio policy to dictate how audio streams
/// interact with each other.
enum AudioCaptureUsage {
    /// Stream is used to capture audio while in the background.  These streams
    /// may be active at any the time and are considered privileged.
    /// Example: Listening for Hotwords
    BACKGROUND = 0;

    /// Stream is intended to be used for normal capture functionality. Streams
    /// that are used for audio capture while the stream creator is in the
    /// foreground should use this.
    /// Example: Voice Recorder
    FOREGROUND = 1;

    /// Stream is for interaction with a system agent.  This should only be used
    /// once a user has signalled their intent to have the interaction with an
    /// interested party.
    /// Examples: Assistant, Siri, Alexa
    SYSTEM_AGENT = 2;

    /// Stream is intended to be used for some form of real time user to user
    /// communication. Voice/Video chat should use this.
    COMMUNICATION = 3;
};
const uint8 CAPTURE_USAGE_COUNT = 4;

/// The behaviors applied to streams when multiple are active.
enum Behavior {
    /// Mix the streams.
    NONE = 0;

    /// Apply a gain to duck the volume of one of the streams. (-14.0db)
    DUCK = 1;

    /// Apply a gain to mute one of the streams. (-160.0db)
    MUTE = 2;
};

union Usage {
    1: AudioRenderUsage render_usage;
    2: AudioCaptureUsage capture_usage;
};

[Discoverable]
protocol AudioCore {
    /// Create an AudioRenderer which outputs audio to the default device.
    CreateAudioRenderer(request<AudioRenderer> audio_out_request);

    /// Create a new Audio Capturer according to the given requirements.
    ///
    /// `pcm_stream_type` sets the stream type of the stream to be delivered.
    /// It causes the source material to be reformatted/resampled if needed
    /// in order to produce the requested stream type.
    ///
    /// `usage` is used by Fuchsia to make decisions about user experience.
    /// See `AudioCaptureUsage` for more details.
    ///
    /// `configuration` must be initialized to a variant, or no capturer
    /// can be created.
    ///
    /// TODO(45240): Implement
    [Transitional]
    CreateAudioCapturerWithConfiguration(
        AudioStreamType stream_type,
        AudioCapturerConfiguration configuration,
        request<AudioCapturer> audio_capturer_request);

    /// Create an AudioCapturer which either captures from the current default
    /// audio input device, or loops-back from the current default audio output
    /// device based on value passed for the loopback flag.
    //
    // TODO(34915): Get rid of the loopback flag ASAP. Routing decisions (and
    // security surrounding routing decisions) should be more sophisticated.
    // This is a placeholder until we have a design in place. Eventually, this
    // should move up to an audio policy layer, where application clients obtain
    // and control AudioCapturers.
    CreateAudioCapturer(bool loopback, request<AudioCapturer> audio_in_request);

    // TODO(34948): remove these systemwide settings, once device-centric
    // settings are plumbed into the system UI. Also, device-centric and
    // systemwide settings should be moved out of this accessible-to-all public
    // audio interface and relocated to a more restrictive interface that is
    // only accessible by clients with the appropriate privileges (such as
    // system configuration API, or the governor of audio policy).

    /// System Gain and Mute
    ///
    /// Fuchsia clients control the volume of individual audio streams via the
    /// fuchsia.media.audio.GainControl protocol. System Gain and Mute affect
    /// all audio output, and are controlled with methods that use the same
    /// concepts as GainControl, namely: independent gain and mute, with change
    /// notifications. Setting System Mute to true leads to the same outcome as
    /// setting System Gain to MUTED_GAIN_DB: all audio output across the system
    /// is silenced.
    ///
    /// Sets the systemwide gain in decibels. `gain_db` values are clamped to
    /// the range -160 db to 0 db, inclusive. This setting is applied to all
    /// audio output devices. Audio input devices are unaffected.
    /// Does not affect System Mute.
    [Transitional, Deprecated]
    SetSystemGain(float32 gain_db);

    /// Sets/clears the systemwide 'Mute' state for audio output devices.
    /// Audio input devices are unaffected. Changes to the System Mute state do
    /// not affect the value of System Gain.
    [Transitional, Deprecated]
    SetSystemMute(bool muted);

    /// Provides current values for systemwide Gain and Mute. When a client
    /// connects to AudioCore, the system immediately sends that client a
    /// SystemGainMuteChanged event with the current system Gain|Mute settings.
    /// Subsequent events will be sent when these Gain|Mute values change.
    [Transitional, Deprecated]
    -> SystemGainMuteChanged(float32 gain_db, bool muted);

    // By default, reading and writing device settings files is enabled. This
    // method (which has impact across the entire audio subsystem) allows a test
    // client to temporarily disable, then later enable, that reading/writing.
    // TODO(13578): Move this to the hub, instead of FIDL API. Alternately,
    // simply remove; going forward, HermeticTestEnvironment accepts a
    // parameter that disables device settings writeback during testing.
    EnableDeviceSettings(bool enabled);

    /// Set the Usage gain applied to Renderers. By default, the gain for all
    /// render usages is set to Unity (0 db).
    SetRenderUsageGain(AudioRenderUsage usage, float32 gain_db);

    /// Set the Usage gain applied to Capturers. By default, the gain for all
    /// capture usages is set to Unity (0 db).
    SetCaptureUsageGain(AudioCaptureUsage usage, float32 gain_db);

    /// Binds to a volume control protocol for the given usage.
    BindUsageVolumeControl(Usage usage, request<fuchsia.media.audio.VolumeControl> volume_control);

    /// SetInteraction allows changing how audio_core handles interactions of multiple active
    /// streams simultaneously.  If streams of Usage `active` are processing audio, and streams of
    /// Usage `affected` are as well, the Behavior specified will be applied to the streams of Usage
    /// `affected`.
    SetInteraction(Usage active, Usage affected, Behavior behavior);

    /// Re-initializes the set of rules that are currently governing the interaction of streams in
    /// audio_core.  The default behavior is 'NONE'.
    ResetInteractions();

    /// Re-loads the platform policy configuration.  Falls back to a default config if the platform
    /// does not provide a config.
    LoadDefaults();
};

// Placeholder for routing policies.
// TODO(34922): Replace, when routing is handled by a central policy manager.
enum AudioOutputRoutingPolicy {
    // AudioRenderers are always connected to all audio outputs which currently
    // in the plugged state (eg; have a connector attached to them)
    ALL_PLUGGED_OUTPUTS = 0;

    // AudioRenderers are only connected to the output stream which most
    // recently entered the plugged state. AudioRenderers move around from
    // output to output as streams are published/unpublished and become
    // plugged/unplugged.
    //
    // This is the default initial setting for audio output routing.
    LAST_PLUGGED_OUTPUT = 1;
};
