// 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.
library fuchsia.media.tuning;

using zx;

/// Usage annotating the purpose of the stream that may be processed in tuning.
type StreamType = strict enum {
    /// Stream is intended to be used for ambient or background renderer audio.
    RENDER_BACKGROUND = 0;
    /// Stream is intended to be used for normal renderer functionality.
    RENDER_MEDIA = 1;
    /// Renderer stream is intended to interrupt any ongoing function of the device.
    RENDER_INTERRUPTION = 2;
    /// Stream is for interaction with a system agent renderer.
    RENDER_SYSTEM_AGENT = 3;
    /// Stream is intended to be used for some form of real time user to user
    /// communication render.
    RENDER_COMMUNICATION = 4;
    /// Stream is intended to be used for ultrasound-specific renderer streams.
    /// A standard renderer is not able to assign this usage; rather, an ultrasound
    /// renderer is explicitly created with fuchsia.ultrasound.Factory.
    RENDER_ULTRASOUND = 5;
};

/// Specification of an audio stream effect name and compiled library module.
///
/// A valid `AudioEffectType` includes a specific module and audio effect name,
/// such as module 'google_audio_effects.so' with name 'equalizer'.
type AudioEffectType = table {
    /// Library module associated with the effect, such as 'my_audio_effects.so'.
    1: module_name string:64;
    /// Name of the effect type within the module.
    2: effect_name string:255;
};

/// Details of an audio effect and its configuration to be applied to an audio stream(s).
///
/// An audio effect type can be instantiated multiple times, differentiable by its unique
/// name. For example, an 'equalizer' effect type can be instantiated twice as
/// 'equalizer1' and 'equalizer2'.
type AudioEffectConfig = table {
    /// Unique identifier of the audio effect instance.
    1: instance_name string:64;
    /// Detailed specification of the audio effect type.
    2: type AudioEffectType;
    /// JSON string of the audio effect configuration to be applied to an audio stream(s).
    3: configuration string:4096;
    /// Rechannelization defined by the effect and applied to the audio stream output; this 
    /// is in addition to channelization provided by the AudioMixGroup.
    4: output_channels uint16;
};

/// Association of a volume level with its decibel value.
type Volume = struct {
    /// Specific volume level identifier in the range [0.0, 1.0].
    level float32;
    /// Decibel value of the associated volume level in the range [-120.0, 0.0].
    decibel float32;
};

/// Audio effects configuration details applied to audio streams within
/// a device's media pipeline.
type AudioMixGroup = struct {
    /// Identifier of the audio effects mix detailed in this object.
    name string:32;
    /// True if the device profile is eligible for loopback capture.
    loopback bool;
    /// Audio effect configurations applied to the specified `streams`.
    effects vector<AudioEffectConfig>:16;
    /// Set of audio effect mixes, each of which consist of various effects configurations.
    inputs vector<box<AudioMixGroup>>:16;
    /// Names of the audio streams to which the `effects` are applied.
    streams vector<StreamType>:8;
    /// Framerate of the mix stage output, which can accommodate upsampling and downsampling.
    /// A different rate may be chosen if the specified rate cannot be accommodated by hardware.
    output_rate uint32;
    /// Channelization of the mix stream output before any effects are applied; effects can apply
    /// additional rechannelization.
    output_channels uint16;
};

/// Specification of the audio effects mixes and volume curve for a device.
type AudioDeviceTuningProfile = table {
    /// Details of the media pipeline effects configuration.
    1: pipeline AudioMixGroup;
    /// Set of associations between volume level and decibel value.
    2: volume_curve vector<Volume>:16;
};

@discoverable
protocol AudioTuner {
    /// Provides names of audio effects classes available for tuning.
    GetAvailableAudioEffects() -> (struct {
        effects vector<AudioEffectType>:16;
    });

    /// Provides the current, tunable audio effects configuration and
    /// volume settings for the given device.
    GetAudioDeviceProfile(struct {
        device_id string:32;
    }) -> (struct {
        profile AudioDeviceTuningProfile;
    });

    /// Provides the device's current default audio effects configuration and
    /// volume settings, which are read-only and unaffected by the audio tuner.
    GetDefaultAudioDeviceProfile(struct {
        device_id string:32;
    }) -> (struct {
        profile AudioDeviceTuningProfile;
    });

    /// Updates the audio effects configuration and volume settings of the given
    /// device with the provided profile.
    SetAudioDeviceProfile(struct {
        device_id string:32;
        profile AudioDeviceTuningProfile;
    }) -> (struct {
        status zx.status;
    });

    /// Deletes the current, tunable audio effects configuration and volume settings
    /// for the given device.
    DeleteAudioDeviceProfile(struct {
        device_id string:32;
    }) -> (struct {
        status zx.status;
    });

    /// Applies the provided `AudioEffectConfig` to the specified device's tuning profile in the media
    /// pipeline.
    ///
    /// A single audio effect class can be instantiated multiple times, with each instance
    /// able to be applied to the same media pipeline.  The `AudioEffectConfig.instance_name` is scoped
    /// to the specified device.
    ///
    /// For example, two 'equalizer' effect instances named 'equalizer1' and 'equalizer2'
    /// can be applied to the same media pipeline.
    SetAudioEffectConfig(struct {
        device_id string:32;
        effect AudioEffectConfig;
    }) -> (struct {
        status zx.status;
    });
};
