// Copyright 2016 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;

// Ordinal range: 0x0700-0x7ff
[Discoverable]
interface Audio {
    0x0701: CreateAudioRenderer(request<AudioRenderer> audio_renderer_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 the loopback flag.
    //
    // TODO(mpuryear): Get rid of the loopback flag ASAP. Routing decisions (and
    // security surrounding routing decisions) should be much more sophisticated
    // than this. This is just a placeholder until we have a design in place.
    // Eventually, I suspect that all of this will move up into the audio policy
    // manager and application clients will obtain AudioCapturers from and control
    // through the policy manager.
    0x0702: CreateAudioCapturer(request<AudioCapturer> audio_capturer_request,
                                bool loopback);

    // System Gain and Mute
    // TODO(mpuryear): remove this systemwide setting once device-centric settings
    // are plumbed into the system UI. Also, device-centric (and certainly
    // systemwide settings) should be moved out of the 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).
    //
    // Mirroring device-centric gain and mute stages, Fuchsia's systemwide Gain
    // and Mute settings are fully independent. Changing the value of one does not
    // change the value of the other. Both have the ability to silence a system
    // (or a device, in the case of device Gain/Mute). If Mute is true, or if Gain
    // is kMutedGain, the system is silenced regardless of the other. Similarly,
    // one's value does not restrict the other's possible values in any way.
    //
    // Sets the system-wide gain in decibels. |db| values are clamped to the range
    // -160db to 0db, inclusive. This setting is applied to all audio output
    // devices. Audio input devices are unaffected. System Gain changes do not
    // affect the System Mute state.
    0x0703: 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.
    0x0704: SetSystemMute(bool muted);

    // Provides current values for the systemwide Gain and Mute.
    // When a client connects to Audio, the system enqueues an action (to be
    // executed once the system regains control) to send this newly-connected
    // client a callback with the current systemwide Gain|Mute settings. Further,
    // upon any change to the systemwide Gain|Mute values, the system will trigger
    // all registered callbacks, notifying clients of the new values.
    //
    // Calls to SetSystemMute or SetSystemGain that do NOT result in a change to
    // these values (e.g. calling SetSystemMute(false) when Mute is already false)
    // will not cause the callbacks to be triggered.
    //
    // During and immediately following connecting to Audio, it is essential that
    // clients keep in mind the fundamental single-threaded nature of FIDL.
    // Specifically, if a newly-connected client registers a SystemGainMuteChanged
    // callback before returning, that client will (once the system has subsequent
    // opportunity) be notified via callback of the Gain|Mute settings at the time
    // the connection was established. If however a newly-connected client returns
    // from a FIDL message dispatch (returning control to the FIDL dispatcher),
    // then that client subsequently registers this callback, the client has no
    // way to learn the current Gain|Mute settings until they actually change.
    0x0705: -> SystemGainMuteChanged(float32 gain_db, bool muted);

    0x0706: SetRoutingPolicy(AudioOutputRoutingPolicy policy);
};

// A placeholder for various types of simple routing policies. This should be
// replaced when routing policy moves to a more centralized 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 initial setting for audio output routing.
    LAST_PLUGGED_OUTPUT = 1;
};

// Permitted ranges for AudioRenderer and AudioCapturer
const uint32 MIN_PCM_CHANNEL_COUNT = 1;
const uint32 MAX_PCM_CHANNEL_COUNT = 8;
const uint32 MIN_PCM_FRAMES_PER_SECOND = 1000;
const uint32 MAX_PCM_FRAMES_PER_SECOND = 192000;