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

[Discoverable]
protocol Audio {
    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 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.
    CreateAudioCapturer(request<AudioCapturer> audio_capturer_request,
                        bool loopback);

    // TODO(fxbug.dev/38104): Remove these methods.
    [Transitional, Deprecated]
    SetSystemMute(bool muted);
    [Transitional, Deprecated]
    SetSystemGain(float32 gain_db);
    [Transitional, Deprecated]
    -> SystemGainMuteChanged(float32 gain_db, bool muted);
};

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