// Copyright 2021 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.audio;

using fuchsia.media2;
using fuchsia.mediastreams;
using zx;

/// The maximum number of VMO handles allowed per buffer collection.
const int64 MAX_PAYLOAD_RANGES = 16;

/// Represents an audio decoder.
protocol Decoder {
    /// Connects an input stream in the form of a `StreamSink` through which the decoder consumes
    /// packets. `format` may be supplied to provide additional format details not established when
    /// the decoder was created. Likewise, `compression` may be supplied to provide additional
    /// compression details. This method responds when the connection is ready or the connect
    /// attempt fails.
    ConnectInputStream(
        zx.handle:EVENTPAIR buffer_collection_token,
        fuchsia.mediastreams.AudioFormat? format,
        fuchsia.mediastreams.Compression? compression,
        request<fuchsia.media2.StreamSink> stream_sink_request)
        -> () error fuchsia.media2.ConnectionError;

    /// Indicates that the current input stream has been disconnected unexpectedly.
    -> OnInputStreamDisconnected(zx.status status);

    /// Indicates that a new output stream is available with the
    /// specified format. The client is expected to call
    /// `AddOutputStream` immediately after this event is
    /// signalled.
    -> OnNewOutputStreamAvailable(
           fuchsia.mediastreams.AudioFormat format);

    /// Creates a new output stream in response to a `OnNewOutputStreamAvailable` event. This
    /// method responds when the connection is ready or the connect attempt fails.
    ConnectOutputStream(
        zx.handle:EVENTPAIR buffer_collection_token,
        fuchsia.media2.StreamSink stream_sink)
        -> () error fuchsia.media2.ConnectionError;

    /// Disconnects the output stream.
    DisconnectOutputStream();

    /// Indicates that the current output stream has been disconnected unexpectedly.
    -> OnOutputStreamDisconnected(zx.status status);
};
