Since people seem to see the necessity for some more functionality within plugins, i want to present LACPA (Linux Audio Cluster Plugin Api), which was intended to be the plugin api of the linux audio cluster (which i never finished due to the lack of time).

Its main features:
* usable for midi/audio plugins (one plugin could be a host for other plugins as well) * sampleaccurate timeinfo for sequencers, tempo-synched effects/instruments, video * fixed size audiobuffers (good for use with networks and frequency domain effects)
* extensible while keeping binary downward compatability
* no dependencies between host's and plugin's gui (plugins guis are supposed to run in their own process)


BTW, by adding a control type "message", the realtime message part of LACPA could be easily
added to LADSPA without breaking existing hosts .

Ralf





#ifndef LACPA
#define LACPA

#ifdef __cplusplus
extern "C" {
#endif

/* return value for all functions */

#define LACPA_NOT_PROCESSED 0
#define LACPA_PROCESSED     1

typedef float LACPA_FRAME; /* audio type  -1.0 .. +1.0 */
typedef float LACPA_CONTROL;  /* control type 0.0 .. 1.0 */

/* opaque plugin type */
typedef void * LACPA_PLUGIN;

/* initialise is called by host immediately after loading the library:
   PARAMETERS:
   plug2host:  callback for plug -> host non-realtime messages 
*/

int (*initialise)(int (*plug2host)(LACPA_PLUGIN plug, int msg, void *arg, void 
*ret));

/* create a new plugin instance
   Note: 
     a plugin is initially suspended and has its editor closed
*/
 
LACPA_PLUGIN (*create)(void);

/* delete a plugin instance
   PARAMETERS:
   plug : plugin instance returne by create()
*/

int (*delete)(LACPA_PLUGIN plug);

/* callback to be used by the plugin to send a 
   non-realtime message to the host.
   Must be supplied by the host in initialise().

   PARAMETERS:
   plug: plugin instance returned by create()
   msgtype: non-realtime plug -> host message type
   arg: pointer to message specific arguments
   ret: pointer for returning values

   int (*plug2host)(LACPA_PLUGIN plug, int msgtype, void *arg, void *ret);

   Following plug -> host messages are currently defined:
   LACPA_EDIT_OFF: arg = NULL, ret = NULL: editor window has been closed
   LACPA_IO_CHANGE: arg = NULL, ret = NULL: plugin changed its inputs or outputs
               In response to this the host is supposed to suspend the plugin 
and
               reread the i/o configuration
*/

#define LACPA_EDIT_OFF         1
#define LACPA_IO_CHANGE        2

/* non-realtime host to plugin messages
   PARAMETERS:
   plug: plugin instance returned by create()
   msgtype: non-realtime host -> plugin message type
   arg: message specific arguments
   ret: returned values
*/

   int (*host2plug)(LACPA_PLUGIN instance, int msgtype, void *arg, void *ret);
 
/* Following plug -> host messages are currently defined:
   LACPA_VENDOR_SPECIFIC: used for vendor specific messages
   LACPA_PROCESS_START: arg = NULL, ret = NULL: process will be called from now
   LACPA_PROCESS_STOP:  arg = NULL, ret = NULL: process will not be called from 
now
   LACPA_PLUGIN_NAME: arg = NULL, ret = char * = name of plugin
   LACPA_PLUGIN_CATEGORY: arg = NULL, ret = char * = name of plugin category
   LACPA_PLUGIN_VENDOR: arg = NULL, ret = char * = name of plugin vendor
   LACPA_SAMPLERATE: arr = int samplerate, ret = NULL: set the samplerate 
(called while suspended)
   LACPA_BUFFERSIZE: arg = int buffersize, ret = NULL: set the buffersize 
(called while suspended)
   LACPA_NUM_PARAMETERS: arg = NULL, ret = int = number of controls
   LACPA_CONTROL_VALUE: arg = struct control,  ret = char * = human readable of 
the value (e.g. "-20")
   LACPA_CONTROL_UNIT: arg = int index, ret = char * = human readable unit of 
value (e.g. "dB")
   LACPA_CONTROL_NAME: arg = int index, ret = char * = name of control (e.g. 
"Gain")
   LACPA_NUM_INPUTS: arg = NULL, ret = int = number of inputs
   LACPA_NUM_OUTPUTS: arg = NULL, ret = int = number of outputs
   LACPA_INPUT_NAME: arg = int index, ret = char * = name of audio channel 
(e.g. "left input")
   LACPA_OUTPUT_NAME: arg = int index, ret = char * = name of audio channel 
(e.g. "left output")
   LACPA_TICKS_PER_BEAT: arg int tpb: set the ticks per beat (sequencer 
resolution)
   LACPA_SMPTE_TYPE: arg int smpte: set the SMPTE type (see below)
   LACPA_LATENCY: arg = NULL, ret = int latency: get plugin latency in samples
   LACPA_EDITOR_ON: arg = NULL, ret = NULL: instruct plugin to open its editor 
window
   LACPA_EDITOR_OFF: arg = NULL, ret = NULL: instruct plugin to close its 
editor window
*/

#define LACPA_VENDOR_SPECIFIC         0
#define LACPA_PROCESS_START           1
#define LACPA_PROCESS_STOP            2
#define LACPA_PLUGIN_NAME             3
#define LACPA_PLUGIN_CATEGORY         4
#define LACPA_PLUGIN_VENDOR           5
#define LACPA_SAMPLERATE              6
#define LACPA_BUFFERSIZE              7
#define LACPA_NUM_CONTROLS            8
#define LACPA_CONTROL_NAME            9
#define LACPA_CONTROL_UNIT           10
#define LACPA_CONTROL_VALUE_STRING   11
#define LACPA_NUM_INPUTS             12
#define LACPA_NUM_OUTPUTS            13
#define LACPA_INPUT_NAME             14
#define LACPA_OUTPUT_NAME            15
#define LACPA_TICKS_PER_BEAT         16
#define LACPA_SMPTE_TYPE             17
#define LACPA_LATENCY                18           
#define LACPA_EDITOR_ON              19
#define LACPA_EDITOR_OFF             20
                           
/* SMPTE types */

#define LACPA_SMPTE_24    1
#define LACPA_SMPTE_25    2
#define LACPA_SMPTE_30    3
#define LACPA_SMPTE_29d   4
#define LACPA_SMPTE_30d   5

/* realtime processing routine
   PARAMETERS:
   plug: plugin instance returned by create()
   inmsg: pointer to linked list of realtime messages for plugin
   outmsg: pointer to pointer to linked list for realtime messages produced by 
plugin
   in: pointer to array of pointers to input buffers
   out: pointer to array of pointers to output buffers
*/

struct lacpa_rt_msg;
typedef struct lacpa_rt_msg *LACPA_MSG;

int (*process)(LACPA_PLUGIN plug, 
               LACPA_MSG *inmsg, LACPA_MSG **outmsg, 
               LACPA_FRAME **in, LACPA_FRAME **out);

/* realtime messages to be sent to/from plugin through process():

   LACPA_MIDI: 1-3 byte midi messages
   LACPA_SYSEX: Midi sysex message
   LACPA_CTRL: control, range 0.0 - 1.0
   LACPA_BBT:  Timeinfo in Beats/Bar/Ticks
   LACPA_SMPTE: Timeinfo in SMPTE FRAMES
   -- more to be added as needed
*/

#define LACPA_MIDI  0
#define LACPA_SYSEX 1
#define LACPA_CTRL  2
#define LACPA_BBT   3
#define LACPA_SMPTE 4

struct lacpa_midi {
   int port;
   char data[4];
};

struct lacpa_sysex {
    int port;
    char *sysex;
};

struct lacpa_ctrl {
    int index;
    LACPA_CONTROL value;
};

struct lacpa_tempo {
     float tempo;
};

struct lacpa_bbt {
     int bar;
     int beat;
     int tick;
};

struct lacpa_smpte {
   int hour;
   int minute;
   int second;
   int frame;
};

struct lacpa_rt_msg {
     LACPA_MSG next;     /* next message in list */
     int type;     /* type of realtime message */
     int frame;    /* frame number within current process buffer */
     union {
       struct lacpa_midi  m;
       struct lacpa_sysex x;
       struct lacpa_ctrl  p;
       struct lacpa_tempo t;       
       struct lacpa_bbt   b;
       struct lacpa_smpte s;
     } lacpa_msg;
};

#ifdef __cplusplus
}
#endif

#endif /* LACPA */

Reply via email to