/* -*- 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 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 */