diff options
Diffstat (limited to 'flow/artsflow.idl')
-rw-r--r-- | flow/artsflow.idl | 566 |
1 files changed, 566 insertions, 0 deletions
diff --git a/flow/artsflow.idl b/flow/artsflow.idl new file mode 100644 index 0000000..44424e0 --- /dev/null +++ b/flow/artsflow.idl @@ -0,0 +1,566 @@ + /* + + Copyright (C) 2000 Stefan Westerfeld + stefan@space.twc.de + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + */ + +/* + * arts.idl - MCOP port. What's missing currently in MCOP? + * + * - namespaces (module) + */ + +module Arts { // analog real time synthesizer + +enum AutoSuspendState { asNoSuspend, asSuspend, asSuspendStop, asSuspendMask = 0x3, + asProducer = 0x10, asConsumer = 0x20, asDirectionMask = 0x30 }; + +/** + * The SynthModule interface is the base for all modules containing streams. + * + * There are two goals achieved by this interface. On one side, there is + * functionality which users of stream carrying modules want to use (which + * is: start streaming, stop streaming). + * + * On the other hand, there is functionality which the flow system will use + * to achieve these goals. + */ +interface SynthModule { + // interface for users of this module + + /** + * This function starts the streaming (e.g. the module will start + * producing samples) - if you write a module, do not reimplement this, + * instead reimplement streamInit/streamStart + */ + void start(); + + /** + * This function stops the streaming - if you write a plugin, do not + * reimplement this, instead reimplement streamEnd + */ + void stop(); + + // interface for people implementing modules + + /** + * this is supposed to be the initialization every module passes after + * all attributes have been set up (e.g. you can see which file to open, + * how to initialize your filter coefficients or whatever) + */ + void streamInit(); + + /** + * starts the I/O of the module + */ + void streamStart(); + + /** + * stop the thing again, and free data possibly allocated in streamInit + */ + void streamEnd(); + + /** + * If you run a mixer desk (without anything connected), no calculations + * need to be done - since the output is silent anyway. For this reason, + * there exists this autosuspend attribute. It allows the flow system + * to detect the idle condition, and start suspending the calculations, + * until something "important" happens again. + * + * There are three possible values: + * + * @li asNoSuspend - this one is appropriate when you have a module that + * is active by itself + * @li asSuspend - this one is appropriate for modules that "do nothing" + * by themselves + * @li asSuspendStop - this one is for modules that should be stopped, when + * the system gets suspended, and restarted when the + * system will start again - an example for this is + * soundcard output + * + * A module should choose asSuspend (or asSuspendStop) only if the + * following conditions are true: + * + * @li given constant inputs (like 3.0 on all ports), the module will + * give constant output after some time + * @li given only 0.0 inputs, the module will give only 0.0 outputs + * after some time + * @li the module does not synchronize itself through signal flow (i.e. + * a midi sequence which "knows" when a second has passed through + * the signal flow breaks when suspension happens) + * @li the module can't be brought to do something with a method + * invocation (i.e. a module which starts generating noise for + * a second whenever the noise() method is called is not suspendable) + * @li the module has no internal state that changes over time when only + * constant inputs are given + * + * Typical examples for suspendable modules are arithmetic operations, + * filters, delay/hall/reverb. + * + * Typical examples for non-suspendable modules are sequences, midi stuff, + * oscillators, sample players,... + * + * To deal with modules which either input data from some external source + * (i.e. soundcard input) or output data to some external destination, + * (i.e. soundcard output) the following flags are available: + * + * @li asProducer - set this flag for modules which fulfill the conditions + * for a suspendable module, but produce non-zero output + * even when left alone + * @li asConsumer - set this flag for modules which write the data to + * some external destination - that is - definitely + * require constant input to be suspended + * + * The suspension algorithm will first divide the graph of modules into + * subgraphs of interconnected modules. A subgraph is suspendable if + * all of its modules are suspendable and the subgraph does not contain + * producer(s) and consumer(s) at the same time. + * + * Finally, our module graph is suspendable if all its subgraphs are. + */ + readonly attribute AutoSuspendState autoSuspend; +}; + +/** + * Plays a stream of audio data to the soundcard + */ +interface Synth_PLAY : SynthModule { + // attribute string channels; + default in audio stream invalue_left,invalue_right; +}; + +/** + * Records a stream of audio data from the soundcard + */ +interface Synth_RECORD : SynthModule { + // attribute string channels; + default out audio stream left,right; +}; + +/** + * A frequency generator + * + * This kind of object is used to create frequencies. Oscillators are connected + * at the output of this object + */ +interface Synth_FREQUENCY : SynthModule { + in audio stream frequency; + out audio stream pos; +}; + +/** + * A sine wave + */ +interface Synth_WAVE_SIN : SynthModule { + in audio stream pos; + out audio stream outvalue; +}; + +/** + * A module which mixes an arbitary number of audio streams + */ +interface Synth_MULTI_ADD : SynthModule { + in multi audio stream invalue; + out audio stream outvalue; +}; + +/** + * A module which adds two audio streams + */ +interface Synth_ADD : SynthModule { + default in audio stream invalue1,invalue2; + out audio stream outvalue; +}; + +/** + * Multiplies two audio streams + */ +interface Synth_MUL : SynthModule { + in audio stream invalue1,invalue2; + out audio stream outvalue; + default invalue1, invalue2; +}; + +/** + * This plays a wave file + */ +interface Synth_PLAY_WAV : SynthModule { + /** + * How fast should it be played? 1.0 = normal speed + */ + attribute float speed; + /** + * Which file should be played + */ + attribute string filename; + /** + * Is true as soon as the file is finished + */ + readonly attribute boolean finished; + + out audio stream left, right; + default left, right; +}; + +/** + * sends data to a bus - busses are dynamic N:M connections - all signals + * from all uplinks are mixed together, and sent to all downlinks + */ +interface Synth_BUS_UPLINK : SynthModule { + /** + * the name of the bus to use + */ + attribute string busname; + + default in audio stream left,right; +}; + +/** + * receives data from a bus - busses are dynamic N:M connections - all signals + * from all uplinks are mixed together, and sent to all downlinks + */ +interface Synth_BUS_DOWNLINK : SynthModule { + /** + * the name of the bus to use + */ + attribute string busname; + + default out audio stream left,right; +}; + + +/** + * Byte stream to audio conversion object + * + * Converts an asynchronous byte stream to a synchronous audio stream + */ +interface ByteStreamToAudio : SynthModule { + attribute long samplingRate; + attribute long channels; + attribute long bits; + + /** + * is conversion currently running, or is it stalled due to the fact + * that there is not enough input input? + */ + readonly attribute boolean running; + + async in byte stream indata; + + out audio stream left,right; + default left; + default right; +}; + +/** + * Audio to Byte stream conversion object + * + * Converts a synchronous audio stream to an asynchronous byte stream + */ +interface AudioToByteStream : SynthModule { + attribute long samplingRate; + attribute long channels; + attribute long bits; + + async out byte stream outdata; + + in audio stream left,right; + default left; + default right; +}; + +/** + * Base interface for all stereo effects + */ +interface StereoEffect : SynthModule { + default in audio stream inleft, inright; + default out audio stream outleft, outright; +}; + +/** + * this is a simple clipping stereo volume control + */ +interface StereoVolumeControl : StereoEffect { + attribute float scaleFactor; + readonly attribute float currentVolumeLeft; + readonly attribute float currentVolumeRight; +}; + +/** + * A funny FFT scope + */ +interface StereoFFTScope : StereoEffect { + readonly attribute sequence<float> scope; +}; + +/** + * A stack of stereo effects + */ +interface StereoEffectStack : StereoEffect { + /** + * inserts an effect at the top side (= directly after the input) + * + * @returns an ID which can be used to remove the effect again + */ + long insertTop(StereoEffect effect, string name); + + /** + * inserts an effect at the bottom (= close to the output) side + * + * @returns an ID which can be used to remove the effect again + */ + long insertBottom(StereoEffect effect, string name); + + /** + * removes an effect again + */ + void remove(long ID); +}; + +/* + * Audio Manager stuff + */ + +enum AudioManagerDirection { amPlay, amRecord }; + +/** + * Information structure for audio manager clients + */ +struct AudioManagerInfo { + long ID; + string destination; + + AudioManagerDirection direction; + string title, autoRestoreID; +}; + +/** + * an audio manager client + */ +interface AudioManagerClient { + readonly attribute long ID; + attribute AudioManagerDirection direction; + attribute string title, autoRestoreID; + + void constructor(AudioManagerDirection direction, string title, + string autoRestoreID); +}; + +/** + * The audio manager interface + */ +interface AudioManager { + /** + * a list of destinations, where you can play/record data to/from + */ + readonly attribute sequence<string> destinations; + + /** + * a list of clients + */ + readonly attribute sequence<AudioManagerInfo> clients; + + /** + * this is incremented each time a change is made (i.e. new client attached) + * TODO: SHOULD GO AWAY WITH ATTRIBUTE WATCHING + */ + readonly attribute long changes; + + /** + * this is used to route a client to another destination + */ + void setDestination(long ID, string destination); +}; +/** + * This is a virtual output port, which you use to play data. Where exactly + * this data gets played is managed by the audiomanager. + * + * Creation: there are two ways to initialize a Synth_AMAN_PLAY - one is + * to set title and autoRestoreID to sensible (non empty) values. The other + * is to pass an already initialized AudioManagerClient on the constructor. + */ +interface Synth_AMAN_PLAY : SynthModule { + attribute string title, autoRestoreID; + void constructor(AudioManagerClient client); + + default in audio stream left, right; +}; + +/** + * This is a virtual input port, which you use to record data. Where this + * data comes from is in turn managed by the audiomanager. + * + * Creation: there are two ways to initialize a Synth_AMAN_RECORD - one is + * to set title and autoRestoreID to sensible (non empty) values. The other + * is to pass an already initialized AudioManagerClient on the constructor. + */ +interface Synth_AMAN_RECORD : SynthModule { + attribute string title, autoRestoreID; + void constructor(AudioManagerClient client); + + default out audio stream left, right; +}; + +/* --------------------------------------------------------------------- */ + +/** + * Wraps a datahandle. That is an abstraction for a float value array + * which can be directly loaded data from a file or have some + * processing stages in between (caching, reversing, cropping...) + * which are hidden to this interface. + * In contrast to the underlying C++ API, this datahandle is already + * open()ed after creation, so you can access its information (like + * channelCount) without further action. + * A datahandle normally has one more important function: read() which + * is not wrapped in MCOP because of the overhead of the data + * transfer. (If there is need for sth. like that in the future, + * one could maybe find a solution.) + */ +interface DataHandle { + readonly attribute long bitDepth; + readonly attribute long channelCount; + readonly attribute long valueCount; + /** + * error code open() returned + */ + readonly attribute long errorNo; +}; + +/** + * Represents a datahandle which delivers the data from the underlying + * sourceDatahandle in reverse order. + */ +interface ReversedDataHandle : DataHandle { + void init(DataHandle sourceHandle); +}; + +/** + * Represents a datahandle which delivers an "inner" part of the data + * from the underlying sourceDatahandle. You can cut away parts at the + * start and/or the end with this. + */ +interface CroppedDataHandle : DataHandle { + void init(DataHandle sourceHandle, + long headCutValueCount, + long tailCutValueCount); +}; + +/** + * Represents a datahandle which delivers the data from the underlying + * sourceDatahandle without the "inner" part containing the values + * [cutOffset..cutOffset+cutValueCount-1], which will be cut away. + */ +interface CutDataHandle : DataHandle { + void init(DataHandle sourceHandle, + long cutOffset, + long cutValueCount); +}; + +/** + * DataHandlePlay uses a gsl_wave_osc to play back data from a + * DataHandle using sophisticated anti-aliasing filtering and caching + * techniques. (Though not implemented at the time of writing this, it + * will be optimized for cases where the anti-aliasing is not needed + * because the mixerFrequency equals the current soundserver's.) + */ +interface DataHandlePlay : SynthModule { + /** + * Which data should be played? + */ + attribute DataHandle handle; + /** + * What is the normal mixer frequency the data from the handle + * should be played back at? (default: current mixing frequency + * of the soundserver, e.g. 44100) + */ + attribute float mixerFrequency; + /** + * Which channel of the datahandle should by played? + * (defaults to 0 = the first channel) + */ + attribute long channelIndex; + /** + * How fast should the data be played? + * (defaults to 1.0 = normal speed, see mixerFrequency) + */ + attribute float speed; + /** + * Current position while playing, in fact it's the index in the + * datahandle, so 0 <= pos < handle.valueCount + */ + attribute long pos; + /** + * Is true as soon as the file is finished + */ + readonly attribute boolean finished; + /** + * Can be used to pause and/or continue playing + */ + attribute boolean paused; + + default out audio stream outvalue; + + DataHandlePlay clone(); +}; + +/** + * DataHandle which represents sample data loaded from a file. Note + * that the samples from all channels are interleaved, that is, the + * samples of the first channel in a stereo file are found at offsets + * 0,2,4,6,.. etc. + */ +interface WaveDataHandle : DataHandle { + /** + * Properties of the loaded sample data. Note that those + * properties are only available from a WaveDataHandle, but may be + * available from a DataHandle in the future. + */ + readonly attribute float mixerFrequency; + readonly attribute float oscillatorFrequency; + + /** + * Load the first wavechunk from a file and return true on + * success. A more specific error code is not available at the + * moment. + */ + boolean load(string filename); + + /** + * Load a specific wavechunk from a file and return true on + * success. A more specific error code is not available at the + * moment. + */ + boolean load(string filename, + long waveIndex, long chunkIndex); + + /** + * Return true if and only if a wavechunk was successfully loaded + * from a file. + */ + readonly attribute boolean isLoaded; + + /** + * Creates a DataHandlePlay object with the important attributes + * handle, mixerFrequency and channelCount already set to play + * this WaveDataHandle. + */ + DataHandlePlay createPlayer(); +}; + +}; |