|
- /* -*- Mode: C ; c-basic-offset: 2 -*- */
- /*****************************************************************************
- *
- * This work is in public domain.
- *
- * This file 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.
- *
- * If you have questions, contact Nedko Arnaudov <nedko@arnaudov.name> or
- * ask in #lad channel, FreeNode IRC network.
- *
- *****************************************************************************/
-
- /**
- * @file lv2dynparam.h
- * @brief LV2 dynparam extension definition
- *
- * @par Purpose
- *
- * The purpose of this extension is to allow plugin parameters appear
- * and disappear as response of existing parameter changes (i.e. number
- * of voices) or executing commands (i.e. "add new voice"). It also
- * allows grouping of parameters and groups. Groups can be used for
- * things like ADSR abstraction, i.e. group of 4 float parameters.
- *
- * @par Architectural overview
- *
- * Plugin notifies host for changes through callbacks. During
- * initialization, plugin notifies host about initial groups,
- * parameters and commands through same callbacks used for later
- * notification. There are callbacks to notify host for group,
- * parameter and command disappears.
- *
- * Groups are containers of other groups, parameters and
- * commands. Parameters and groups have URIs. Parameter URIs are
- * used to describe type of parameter (i.e. boolean, integer,
- * string, etc.). Parameters are as simple as possible. There is one
- * predefined Group URI for "generic group" type, i.e. container
- * that is just that - a container of other groups, parameters and
- * commands. Other group types are just hints and ones that are
- * unknown to host, can be looked as generic ones. Only generic
- * groups can contain groups. Groups of other types can contain only
- * parameters. There is always one, root group. Name of the root
- * groop is expected to match name of the plugin.
- *
- * Groups, parameters and commands, have "name" containing short
- * human readble description of object purpose.
- *
- * Parameter ports, are bidirectional. Parameters have values, and
- * some of them (depending of type) - range. Data storage for
- * current, min and max values is in plugin memory. Host gets
- * pointers to that memory and accesses the data in type specific
- * way.
- *
- * When plugin decides to change parameter value or range (as
- * response to command execution or other parameter value change), it
- * notifies host through callback.
- *
- * When host decides to change parameter value or execute command (as
- * resoponse to user action, i.e. knob rotation/button press, or some
- * kind of automation), it calls plugin callback. In case of
- * parameter, it first changes the value in the plugin data storage
- * for particular parameter. Host ensures that values being set are
- * within current range (if range is defined for particular port
- * type).
- *
- * Apart from initialization (host_attach), plugin may call host
- * callbacks only as response to command execution or parameter
- * change notification (from host).
- *
- * Host serializes calls to plugin dynparam callbacks and the
- * run/connect_port lv2 callbacks. Thus plugin does not need to take
- * special measures for thread safety. in callbacks called by host.
- *
- * Plugin can assume that host will never call dynamic parameter
- * functions when lv2 plugin callbacks (like run and connect_port) are
- * being called. I.e. calls are serialized, no need for locks in
- * plugin. Plugin must not suspend execution (sleep/lock) while being
- * called by host. If it needs to sleep to implement action requested
- * by host, like allocation of data for new voice, the allocation
- * should be done in background thread and when ready, transfered to
- * the realtime code. During initialization (host_attach) plugin is
- * allowed to sleep. Thus conventional memory allocation is allowed
- * in host_attach.
- *
- * @par Intialization sequence
- *
- * -# Host discovers whether plugin supports the extension by
- * inspecting the RDF Turtle file.
- * -# Host calls lv2 extension_data callback, plugin returns pointer
- * to struct lv2dynparam_plugin_callbacks containing pointers to
- * several funtions, including host_attach.
- * -# For each instantiated plugin supporting this extension, host
- * calls host_attach function with parameters:
- * - a LV2_Handle, plugin instance handle
- * - pointer to struct lv2dynparam_host_callbacks, containing
- * pointers to several functions, to be called by plugin.
- * - instance host context, opaque pointer
- * -# During initialization (host_attach), initial groups and
- * parameters appear and host callbacks are called by plugin.
- *
- * @par Parameter types
- * - float, with range
- * - 32-bit 2's complement signed int, with range
- * - midi note, value stored as byte, with range
- * - string
- * - filename
- * - boolean, value stored as byte, non-zero means TRUE, zero means FALSE
- *
- * @par Notes:
- * - if function fails, variables where output parameters are normally
- * stored remain unmodified.
- * - If host callback, called by plugin, fails - plugin should try the
- * operation later.
- */
-
-
- #ifndef LV2DYNPARAM_H__31DEB371_3874_44A0_A9F2_AAFB0360D8C5__INCLUDED
- #define LV2DYNPARAM_H__31DEB371_3874_44A0_A9F2_AAFB0360D8C5__INCLUDED
-
- #ifdef __cplusplus
- extern "C" {
- #endif
- #if 0
- } /* Adjust editor indent */
- #endif
-
- /** base URI to be used for composing real URIs (internal use only) */
- #define LV2DYNPARAM_BASE_URI "http://home.gna.org/lv2dynparam/v1"
-
- /** URI of the LV2 extension defined in this file */
- #define LV2DYNPARAM_URI LV2DYNPARAM_BASE_URI
-
- /** max size of name and type_uri buffers, including terminating zero char */
- #define LV2DYNPARAM_MAX_STRING_SIZE 1024
-
- /** handle identifying parameter, supplied by plugin */
- typedef void * lv2dynparam_parameter_handle;
-
- /** handle identifying group, supplied by plugin */
- typedef void * lv2dynparam_group_handle;
-
- /** handle identifying command, supplied by plugin */
- typedef void * lv2dynparam_command_handle;
-
- /**
- * Structure containing set of hints.
- */
- struct lv2dynparam_hints
- {
- unsigned char count; /**< Number of hints in the set. Size of @c names and @c values arrays. */
- char ** names; /**< Hint names. Array of hint names with size @c count. */
- char ** values; /**< Hint values. Array of hint values with size @c count. Element can be NULL if hint has no value. */
- };
-
- /**
- * Structure containing poitners to functions called by
- * plugin and implemented by host.
- */
- struct lv2dynparam_host_callbacks
- {
- /**
- * This function is called by plugin to notify host about new
- * group.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param parent_group_host_context Host context of parent
- * group. For the root group, parent context is NULL.
- * @param group Plugin context for the group
- * @param hints_ptr Pointer to structure representing hints set
- * associated with appearing group.
- * @param group_host_context Pointer to variable where host context
- * for the new group will be stored.
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*group_appear)(
- void * instance_host_context,
- void * parent_group_host_context,
- lv2dynparam_group_handle group,
- const struct lv2dynparam_hints * hints_ptr,
- void ** group_host_context);
-
- /**
- * This function is called by plugin to notify host about group
- * removal.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param group_host_context Host context of the group
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*group_disappear)(
- void * instance_host_context,
- void * group_host_context);
-
- /**
- * This function is called by plugin to notify host about new
- * parameter.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param group_host_context Host context of parent group.
- * @param parameter Plugin context for the parameter
- * @param hints_ptr Pointer to structure representing hints set
- * associated with appearing parameter.
- * @param parameter_host_context Pointer to variable where host
- * context for the new parameter will be stored.
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*parameter_appear)(
- void * instance_host_context,
- void * group_host_context,
- lv2dynparam_parameter_handle parameter,
- const struct lv2dynparam_hints * hints_ptr,
- void ** parameter_host_context);
-
- /**
- * This function is called by plugin to notify host about parameter
- * removal.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param parameter_host_context Host context of the parameter
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*parameter_disappear)(
- void * instance_host_context,
- void * parameter_host_context);
-
- /**
- * This function is called by plugin to notify host about parameter
- * value or range change.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param parameter_host_context Host context of the parameter
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*parameter_change)(
- void * instance_host_context,
- void * parameter_host_context);
-
- /**
- * This function is called by plugin to notify host about new commmand.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param group_host_context Host context of parent group.
- * @param command Plugin context for the command
- * @param hints_ptr Pointer to structure representing hints set
- * associated with appearing command.
- * @param command_host_context Pointer to variable where host
- * context for the new command will be stored.
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*command_appear)(
- void * instance_host_context,
- void * group_host_context,
- lv2dynparam_command_handle command,
- const struct lv2dynparam_hints * hints_ptr,
- void ** command_host_context);
-
- /**
- * This function is called by plugin to notify host about command
- * removal.
- *
- * @param instance_host_context Host instance context, as supplied
- * during initialization (host_attach).
- * @param command_host_context Host context of the command
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*command_disappear)(
- void * instance_host_context,
- void * command_host_context);
- };
-
- /**
- * Structure containing poitners to functions called by
- * host and implemented by plugin.
- * Pointer to this struct is returned by LV2 extension_data plugin callback
- */
- struct lv2dynparam_plugin_callbacks
- {
- /**
- * This callback is called by host during initialization.
- * Plugin is allowed to suspend execution (sleep/lock).
- * Thus conventional memory allocation is allowed.
- *
- * @param instance Handle of instantiated LV2 plugin
- * @param host_callbacks Pointer to struncture containing pointer to
- * functions implemented by host, to be called by plugin.
- * @param instance_host_context Context to be supplied as parameter
- * to callbacks implemented by host and called by plugin.
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error
- */
- unsigned char (*host_attach)(
- LV2_Handle instance,
- struct lv2dynparam_host_callbacks * host_callbacks,
- void * instance_host_context);
-
- /**
- * This function is called by host to retrieve name of group
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param group Group handle, as supplied by plugin
- * @param buffer Pointer to buffer with size of
- * LV2DYNPARAM_MAX_STRING_SIZE bytes, where ASCIIZ string containing
- * name of the group will be stored.
- */
- void (*group_get_name)(
- lv2dynparam_group_handle group,
- char * buffer);
-
- /**
- * This function is called by host to retrieve type URI of parameter
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param parameter Parameter handle, as supplied by plugin
- * @param buffer Pointer to buffer with size of
- * LV2DYNPARAM_MAX_STRING_SIZE bytes, where ASCIIZ string containing
- * type URI of the parameter will be stored.
- */
- void (*parameter_get_type_uri)(
- lv2dynparam_parameter_handle parameter,
- char * buffer);
-
- /**
- * This function is called by host to retrieve name of parameter
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param parameter Parameter handle, as supplied by plugin
- * @param buffer Pointer to buffer with size of
- * LV2DYNPARAM_MAX_STRING_SIZE bytes, where ASCIIZ string containing
- * name of the parameter will be stored.
- */
- void (*parameter_get_name)(
- lv2dynparam_parameter_handle parameter,
- char * buffer);
-
- /**
- * This funtion is called by host to retrieve pointer to memory
- * where value data for particular parameter is stored.
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param parameter Parameter handle, as supplied by plugin
- * @param value_buffer Pointer to variable where pointer to value
- * data will be stored.
- */
- void (*parameter_get_value)(
- lv2dynparam_parameter_handle parameter,
- void ** value_buffer);
-
- /**
- * This funtion is called by host to retrieve pointer to memory
- * where range min and max values data for particular parameter are
- * stored. Host calls this function only for parameter with types
- * that have range.
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param parameter Parameter handle, as supplied by plugin
- * @param value_min_buffer Pointer to variable where pointer to min
- * value data will be stored.
- * @param value_max_buffer Pointer to variable where pointer to max
- * value data will be stored.
- */
- void (*parameter_get_range)(
- lv2dynparam_parameter_handle parameter,
- void ** value_min_buffer,
- void ** value_max_buffer);
-
- /**
- * This function is called by host to notify plugin about value
- * change. For parameters with types that have range, value is
- * guaranteed to be with the range. Before calling this function,
- * host updates value data storage with the new value.
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param parameter Parameter handle, as supplied by plugin
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*parameter_change)(
- lv2dynparam_parameter_handle parameter);
-
- /**
- * This function is called by host to retrieve name of command
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param command Command handle, as supplied by plugin
- * @param buffer Pointer to buffer with size of
- * LV2DYNPARAM_MAX_STRING_SIZE bytes, where ASCIIZ string containing
- * name of the command will be stored.
- */
- void (*command_get_name)(
- lv2dynparam_command_handle command,
- char * buffer);
-
- /**
- * This function is called by host to execute command defined by
- * plugin.
- * Plugin implementation must not suspend execution (sleep/lock).
- *
- * @param command Command handle, as supplied by plugin
- *
- * @return Success status
- * @retval Non-zero - success
- * @retval Zero - error, try later
- */
- unsigned char (*command_execute)(
- lv2dynparam_command_handle command);
- };
-
- /** URI for float parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_FLOAT_URI LV2DYNPARAM_BASE_URI "#parameter_float"
-
- /** URI for integer parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_INT_URI LV2DYNPARAM_BASE_URI "#parameter_int"
-
- /** URI for note parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_NOTE_URI LV2DYNPARAM_BASE_URI "#parameter_note"
-
- /** URI for string parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_STRING_URI LV2DYNPARAM_BASE_URI "#parameter_string"
-
- /** URI for filename parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_FILENAME_URI LV2DYNPARAM_BASE_URI "#parameter_filename"
-
- /** URI for boolean parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_BOOLEAN_URI LV2DYNPARAM_BASE_URI "#parameter_boolean"
-
- /** URI for enumeration parameter */
- #define LV2DYNPARAM_PARAMETER_TYPE_ENUM_URI LV2DYNPARAM_BASE_URI "#parameter_enum"
-
- #if 0
- { /* Adjust editor indent */
- #endif
- #ifdef __cplusplus
- } /* extern "C" */
- #endif
-
- #endif /* #ifndef LV2DYNPARAM_H__31DEB371_3874_44A0_A9F2_AAFB0360D8C5__INCLUDED */
|