// 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.
type AudioRenderUsage = strict enum {
    /// 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 RENDER_USAGE_COUNT uint8 = 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.
type AudioCaptureUsage = strict enum {
    /// 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 CAPTURE_USAGE_COUNT uint8 = 4;

/// The behaviors applied to streams when multiple are active.
type Behavior = strict enum {
    /// 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;
};

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

@discoverable
protocol AudioCore {
    /// Creates an AudioRenderer which outputs audio to the default device.
    CreateAudioRenderer(resource struct {
        audio_out_request server_end:AudioRenderer;
    });

    /// Creates an AudioCapturer 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(fxbug.dev/45240): Implement
    @transitional
    CreateAudioCapturerWithConfiguration(resource struct {
        stream_type AudioStreamType;
        configuration AudioCapturerConfiguration;
        audio_capturer_request server_end:AudioCapturer;
    });

    /// Creates 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(fxbug.dev/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(resource struct {
        loopback bool;
        audio_in_request server_end:AudioCapturer;
    });

    // TODO(fxbug.dev/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(struct {
        gain_db float32;
    });

    /// 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(struct {
        muted bool;
    });

    /// 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(struct {
        gain_db float32;
        muted bool;
    });

    // 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(fxbug.dev/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.
    @transitional
    @deprecated
    EnableDeviceSettings(struct {
        enabled bool;
    });

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

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

    /// Binds to a volume control protocol for the given usage.
    BindUsageVolumeControl(resource struct {
        usage Usage;
        volume_control server_end:fuchsia.media.audio.VolumeControl;
    });

    /// Queries the volume percentage [0, 1] that maps to a `gain_db` value for a particular
    /// `usage`. This is the same mapping as used by the VolumeControl from
    /// `BindUsageVolumeControl`.
    @transitional
    GetVolumeFromDb(struct {
        usage Usage;
        gain_db float32;
    }) -> (struct {
        volume float32;
    });

    /// Queries the decibel value that maps to a volume percentage [0, 1] for a particular `usage`.
    /// This is the same mapping as used by the VolumeControl from `BindUsageVolumeControl`.
    @transitional
    GetDbFromVolume(struct {
        usage Usage;
        volume float32;
    }) -> (struct {
        gain_db float32;
    });

    /// Sets 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(struct {
        active Usage;
        affected Usage;
        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(fxbug.dev/34922): Replace, when routing is handled by a central policy manager.
type AudioOutputRoutingPolicy = strict enum {
    // 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;
};
