package ddf.minim;
/**
* <code>Polyphonic</code> describes an object that can have multiple
* <code>AudioSignal</code>s attached to it. It is implemented by
* {@link AudioOutput}.
*
* @author Damien Di Fede
*
*/
public interface Polyphonic
{
/**
* Enables all signals currently attached to this. If you want to enable only
* a single signal, use {@link #enableSignal(int)}.
*
*/
void sound();
/**
* Disables all signals currently attached to this. If you want to disable
* only a single signal, use {@link #disableSignal(int)}.
*
*/
void noSound();
/**
* Returns true if at least one signal in the chain is enabled.
*
* @return true if at least one signal in the signal chain is enabled
*/
boolean isSounding();
/**
* Returns true if <code>signal</code> is in the chain and is also enabled.
*
* @param signal
* the <code>AudioSignal</code> to check the status of
* @return true if <code>signal</code> is in the chain and is enabled
*/
boolean isEnabled(AudioSignal signal);
/**
* Adds an signal to the signals chain.
*
* @param signal
* the <code>AudioSignal</code> to add
*/
void addSignal(AudioSignal signal);
/**
* Returns the <code>i<sup>th</sup></code> signal in the signal chain.
* This method is not required to do bounds checking and may throw an
* ArrayOutOfBoundsException if <code>i</code> is larger than
* {@link #signalCount()}.
*
* @param i
* which signal to return
*
* @return the requested signal
*/
AudioSignal getSignal(int i);
boolean hasSignal(AudioSignal signal);
/**
* Returns the number of signals in the chain.
*
* @return the number of signals in the chain
*/
int signalCount();
/**
* Enables the <code>i</code><sup>th</sup> signal in the signal chain.
*
* @param i
* the index of the signal to enable
*/
void enableSignal(int i);
/**
* Enables <code>signal</code> if it is in the chain.
*
* @param signal
* the <code>AudioSignal</code> to enable
*/
void enableSignal(AudioSignal signal);
/**
* disables the <code>i</code><sup>th</sup> signal in the signal chain.
*
* @param i
* the index of the signal to disable
*/
void disableSignal(int i);
/**
* Disables <code>signal</code> if it is in the chain.
*
* @param signal
* the <code>AudioSignal</code> to disable
*/
void disableSignal(AudioSignal signal);
/**
* Removes <code>signal</code> from the signals chain.
*
* @param signal
* the AudioSignal to remove
*/
void removeSignal(AudioSignal signal);
/**
* Removes and returns the <code>i<sup>th</sup></code> signal in the
* signal chain.
*
* @param i
* which signal to remove
* @return the removed <code>AudioSignal</code>
*/
AudioSignal removeSignal(int i);
/**
* Removes all signals from the signal chain.
*
*/
void clearSignals();
}