|
|
|
#include "artsflow.idl"
|
|
|
|
#include "kmedia2.idl"
|
|
|
|
#include "core.idl"
|
|
|
|
|
|
|
|
module Arts {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* One entry of the sample storage - initially, you'll need to fill the entry.
|
|
|
|
*
|
|
|
|
* To do so, call write repeatedly to fill it with data, and finish() when
|
|
|
|
* you are done. After that you can use the filename attribute to get the
|
|
|
|
* name of the file on the server that has stored the data. You can use
|
|
|
|
* this filename for other things (i.e. SimpleSoundServer::play).
|
|
|
|
*/
|
|
|
|
interface SampleStorageEntry {
|
|
|
|
readonly attribute string name;
|
|
|
|
readonly attribute string filename;
|
|
|
|
readonly attribute boolean completed;
|
|
|
|
|
|
|
|
void write(sequence<byte> data);
|
|
|
|
void finish();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Interface for storing files on the sound server
|
|
|
|
*/
|
|
|
|
interface SampleStorage {
|
|
|
|
void constructor(string directory, boolean clearOnInit);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* creates a new entry which you can use to store a sample - if you just
|
|
|
|
* create an entry, it will be private to you, i.e. you can use it, and
|
|
|
|
* as soon as you don't need it any longer, it will be freed
|
|
|
|
*
|
|
|
|
* if you want that the entry stays in the storage, you need to add it,
|
|
|
|
* and it will stay then until you remove it
|
|
|
|
*/
|
|
|
|
SampleStorageEntry createEntry(string name);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* add an entry (which will make it accessible via findEntry) - remember
|
|
|
|
* to eventually call removeEntry, or the entry will stay there forever
|
|
|
|
*/
|
|
|
|
void addEntry(SampleStorageEntry entry);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* removes an entry, that is, the entry will only stay there until
|
|
|
|
* nobody needs it any more and then get freed
|
|
|
|
*/
|
|
|
|
void removeEntry(SampleStorageEntry entry);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* finds an entry by name
|
|
|
|
*/
|
|
|
|
SampleStorageEntry findEntry(string name);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Producer of byte sound
|
|
|
|
*
|
|
|
|
* This is used inside the sound server interface
|
|
|
|
*/
|
|
|
|
interface ByteSoundProducer : SynthModule
|
|
|
|
{
|
|
|
|
readonly attribute long samplingRate;
|
|
|
|
readonly attribute long channels;
|
|
|
|
readonly attribute long bits;
|
|
|
|
|
|
|
|
async out byte stream outdata;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* V2 version of the ByteSoundProducer interface that implements the title
|
|
|
|
* attribute
|
|
|
|
*/
|
|
|
|
interface ByteSoundProducerV2 : ByteSoundProducer
|
|
|
|
{
|
|
|
|
readonly attribute string title;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Receiver of byte sound
|
|
|
|
*/
|
|
|
|
interface ByteSoundReceiver : SynthModule
|
|
|
|
{
|
|
|
|
readonly attribute long samplingRate;
|
|
|
|
readonly attribute long channels;
|
|
|
|
readonly attribute long bits;
|
|
|
|
readonly attribute string title;
|
|
|
|
|
|
|
|
async in byte stream indata;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is a very simple sound server interface
|
|
|
|
*
|
|
|
|
* WARNING: This currently inherits a KMedia2 PlayObjectFactory for test
|
|
|
|
* purposes, but don't rely on that
|
|
|
|
*/
|
|
|
|
|
|
|
|
interface SimpleSoundServer : PlayObjectFactory
|
|
|
|
{
|
|
|
|
readonly attribute StereoEffectStack outstack;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* tries to play the sound in "filename"
|
|
|
|
*
|
|
|
|
* returns an ID when success 0 when it fails
|
|
|
|
*/
|
|
|
|
long play(string filename);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* returns true if the sound in ID is still playing
|
|
|
|
*/
|
|
|
|
//boolean isPlaying(long ID);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* stops a playing sound by ID
|
|
|
|
*/
|
|
|
|
//void stop(long ID);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* specifies the minimum amount of milliseconds that have to be buffered
|
|
|
|
* to allow safe streaming (without interruptions) from/to external apps
|
|
|
|
*
|
|
|
|
* this depends on the realtime parameters the sound server itself uses
|
|
|
|
* to talk to the hardware
|
|
|
|
*/
|
|
|
|
readonly attribute float minStreamBufferTime;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* specifies the amount of milliseconds the server itself spends with
|
|
|
|
* the hardware (buffering latency) - so if you stream into the server,
|
|
|
|
* you should have a yourStreamBufferTime >= minStreamBufferTime, and
|
|
|
|
* the total latency is
|
|
|
|
*
|
|
|
|
* totalLatency = yourStreamBufferTime + serverBufferTime
|
|
|
|
*/
|
|
|
|
readonly attribute float serverBufferTime;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* attaches a byte sound producer (read: a client which produces/mixes
|
|
|
|
* an audio stream itself and just wants playback via the soundserver)
|
|
|
|
*/
|
|
|
|
void attach(ByteSoundProducer producer);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* detaches a previous attached byte sound producer
|
|
|
|
*/
|
|
|
|
void detach(ByteSoundProducer producer);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* attaches a byte sound receiver (a client that records an
|
|
|
|
* audio stream from the soundserver)
|
|
|
|
*/
|
|
|
|
void attachRecorder(ByteSoundReceiver receiver);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* detaches a previous attached byte sound receiver
|
|
|
|
*/
|
|
|
|
void detachRecorder(ByteSoundReceiver receiver);
|
|
|
|
|
|
|
|
object createObject(string name);
|
|
|
|
};
|
|
|
|
|
|
|
|
enum RealtimeStatus { rtRealtime, rtNoSupport, rtNoWrapper, rtNoRealtime };
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is an enhanced sound server interface which can be used to
|
|
|
|
* query status information or suspend the soundserver right away
|
|
|
|
*/
|
|
|
|
interface SoundServer : SimpleSoundServer
|
|
|
|
{
|
|
|
|
readonly attribute RealtimeStatus realtimeStatus;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns how many seconds you have to wait _now_ for the soundserver
|
|
|
|
* to suspend. A value of -1 signals that the sound server is busy and
|
|
|
|
* will not suspend automatically at the moment.
|
|
|
|
*/
|
|
|
|
readonly attribute long secondsUntilSuspend;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Makes the soundserver suspend now _if_ it is not busy playing, that
|
|
|
|
* is, if it is "suspendable". Returns true if successful.
|
|
|
|
*/
|
|
|
|
boolean suspend();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asks the soundserver if it is suspended. Returns true if so.
|
|
|
|
*/
|
|
|
|
boolean suspended();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Permanently terminates the sound server - this is not intended to be
|
|
|
|
* widely used. However, it provides a way to "kill" the sound server,
|
|
|
|
* even if you don't reside on the same host with it, and even if you
|
|
|
|
* don't know the process id, and so on. In the future it also offers
|
|
|
|
* the possibility for interested apps to be informed before the server
|
|
|
|
* goes away, and for important apps to block termination.
|
|
|
|
*
|
|
|
|
* Returns true if successful.
|
|
|
|
*/
|
|
|
|
boolean terminate();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is an even more enhanced sound server interface that supports changing
|
|
|
|
* the autosuspend time, and returning more information about the server
|
|
|
|
* settings.
|
|
|
|
*/
|
|
|
|
interface SoundServerV2 : SoundServer, PlayObjectFactoryV2
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* Time in seconds after which server will suspend if idle.
|
|
|
|
*/
|
|
|
|
attribute long autoSuspendSeconds;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Multiplier for size of network buffers. Default is 1,
|
|
|
|
* which is fragment size * fragment count. (expressed
|
|
|
|
* as milliseconds).
|
|
|
|
*/
|
|
|
|
attribute long bufferSizeMultiplier;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Current CPU usage in percent
|
|
|
|
*/
|
|
|
|
readonly attribute float cpuUsage;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* AudioSubSystem parameters
|
|
|
|
*/
|
|
|
|
readonly attribute string audioMethod;
|
|
|
|
readonly attribute long samplingRate;
|
|
|
|
readonly attribute long channels;
|
|
|
|
readonly attribute long bits;
|
|
|
|
readonly attribute boolean fullDuplex;
|
|
|
|
readonly attribute string audioDevice;
|
|
|
|
readonly attribute long fragments;
|
|
|
|
readonly attribute long fragmentSize;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* version
|
|
|
|
*/
|
|
|
|
readonly attribute string version;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* global output volume for the sound server
|
|
|
|
*/
|
|
|
|
readonly attribute StereoVolumeControl outVolume;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* for storing samples on the sound server
|
|
|
|
*/
|
|
|
|
readonly attribute SampleStorage sampleStorage;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* this method checks for new object implementations (you can call this
|
|
|
|
* if you have implemented and installed new components in C++ or with
|
|
|
|
* artsbuilder, to make the soundserver use them without restart)
|
|
|
|
*/
|
|
|
|
void checkNewObjects();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A KMedia2 Wave PlayObject
|
|
|
|
*/
|
|
|
|
interface WavPlayObject : PlayObject, SynthModule
|
|
|
|
{
|
|
|
|
out audio stream left,right;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* An advanced KMedia2 PlayObject based on GSL datahandles
|
|
|
|
*/
|
|
|
|
interface GSLPlayObject : PlayObject, PitchablePlayObject, SynthModule
|
|
|
|
{
|
|
|
|
attribute boolean done;
|
|
|
|
|
|
|
|
out audio stream left,right;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper interface to ensure that artsd gets initialized properly when
|
|
|
|
* multiple artsd processes are started at the same time.
|
|
|
|
*/
|
|
|
|
interface SoundServerStartup
|
|
|
|
{
|
|
|
|
void lock();
|
|
|
|
void unlock();
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|