// Copyright 2022 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.hardware.audio.signalprocessing;

/// For an overview of the signal processing protocols see
/// [Audio Signal Processing](//docs/concepts/drivers/driver_architectures/audio_drivers/audio_signal_processing.md)
closed protocol Connector {
    /// Connect to a `SignalProcessing` protocol.
    /// Multiple connections may be supported, if a new connection request is not supported, i.e.
    /// the maximum number of connections have already been created, for instance one, then the
    /// `protocol` channel (not the channel upon which `SignalProcessingConnect` is being called)
    /// will be closed with a `ZX_ERR_ALREADY_BOUND` epitaph.
    /// If signal processing is not supported at all, then the `protocol` channel (again, not the
    /// channel upon which `SignalProcessingConnect` is being called) will be closed with a
    /// `ZX_ERR_NOT_SUPPORTED` epitaph.
    /// This method is named `SignalProcessingConnect` instead of `Connect` because this protocol
    /// is intended to be composed, and hence the more verbose name allows differentiation and
    /// improved clarity.
    strict SignalProcessingConnect(resource struct {
        protocol server_end:SignalProcessing;
    });
};

service ConnectorService {
    connector client_end:Connector;
};
