clap

CLAP Audio Plugin API
Log | Files | Refs | README | LICENSE

commit 95099c1cd3d847fa99436fad36b4541cf1f43d41
parent d10a568e4f6dfc61276f6ff0de5505ef8a6f8c98
Author: Alexandre Bique <bique.alexandre@gmail.com>
Date:   Thu,  3 Mar 2016 19:24:27 +0100

Many improvement :)

Diffstat:
Mexamples/thyns/env.h | 10+++++-----
Mexamples/thyns/filt.h | 6+++---
Mexamples/thyns/osc.h | 10+++++-----
Mexamples/thyns/plugin.c | 5++---
Mexamples/thyns/voice.h | 8++++----
Minclude/clap/clap.h | 84++++++++++++++++++++++++++++++++++++-------------------------------------------
Minclude/clap/ext/params.c | 15++++++---------
Minclude/clap/ext/params.h | 45++++++++++++++++++++++++++++-----------------
Minclude/clap/ext/ports.h | 36+++++++++++++++++++++++++-----------
Minclude/clap/ext/presets.h | 59+++++++++++++++++++----------------------------------------
Minclude/clap/midi/parser.c | 9+--------
Mtools/clap-info/clap-info.c | 8++------
12 files changed, 138 insertions(+), 157 deletions(-)

diff --git a/examples/thyns/env.h b/examples/thyns/env.h @@ -1,4 +1,4 @@ -#ifndef ENV_H +#ifndef ENV_H # define ENV_H # include "defs.h" @@ -52,7 +52,7 @@ thyns_env_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 10000; - param->scale = CLAP_PARAM_LOG; + param->scale = CLAP_PARAM_SCALE_LOG; break; case THYNS_ENV_PARAM_DECAY: @@ -67,7 +67,7 @@ thyns_env_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 10000; - param->scale = CLAP_PARAM_LOG; + param->scale = CLAP_PARAM_SCALE_LOG; break; case THYNS_ENV_PARAM_SUSTAIN: @@ -82,7 +82,7 @@ thyns_env_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 1; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_ENV_PARAM_RELEASE: @@ -97,7 +97,7 @@ thyns_env_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 10000; - param->scale = CLAP_PARAM_LOG; + param->scale = CLAP_PARAM_SCALE_LOG; break; } #undef P diff --git a/examples/thyns/filt.h b/examples/thyns/filt.h @@ -1,4 +1,4 @@ -/** +/** * Basic filter adapted from Urs Heckman's code: * http://www.kvraudio.com/forum/viewtopic.php?f=33&t=412944#p5766724 */ @@ -55,7 +55,7 @@ thyns_filt_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 28000; - param->scale = CLAP_PARAM_LOG; + param->scale = CLAP_PARAM_SCALE_LOG; break; case THYNS_FILT_PARAM_RESONANCE: @@ -70,7 +70,7 @@ thyns_filt_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 2; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; } #undef P diff --git a/examples/thyns/osc.h b/examples/thyns/osc.h @@ -1,4 +1,4 @@ -#ifndef OSC_H +#ifndef OSC_H # define OSC_H # include "defs.h" @@ -65,7 +65,7 @@ thyns_osc_param_info(uint32_t index, param->value = value; param->min.i = 0; param->max.i = THYNS_OSC_SINE; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_OSC_PARAM_PHASE: @@ -80,7 +80,7 @@ thyns_osc_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 2 * M_PI; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_OSC_PARAM_PWM: @@ -95,7 +95,7 @@ thyns_osc_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 1; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_OSC_PARAM_TUNE: @@ -110,7 +110,7 @@ thyns_osc_param_info(uint32_t index, param->value = value; param->min.f = -48; param->max.f = +48; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; } diff --git a/examples/thyns/plugin.c b/examples/thyns/plugin.c @@ -1,4 +1,4 @@ -#include <stdlib.h> +#include <stdlib.h> #include <stdio.h> #include <clap/clap.h> #include <clap/ext/params.h> @@ -109,7 +109,6 @@ thyns_params_get(struct clap_plugin *plugin, int32_t i = 0; param->index = index; - param->parent = -1; if (index < i + THYNS_OSC_PARAM_COUNT) { thyns_osc_param_info(index - i, p->thyns.params.osc1[index - i], @@ -201,7 +200,7 @@ thyns_plugin_create(struct clap_host *host, p->plugin.activate = thyns_plugin_activate; p->plugin.deactivate = thyns_plugin_deactivate; p->params.count = thyns_params_count; - p->params.get = thyns_params_get; + p->params.get_param = thyns_params_get; p->state.save = thyns_state_save; p->state.restore = thyns_state_restore; diff --git a/examples/thyns/voice.h b/examples/thyns/voice.h @@ -1,4 +1,4 @@ -#ifndef VOICE_H +#ifndef VOICE_H # define VOICE_H # include "env.h" @@ -74,7 +74,7 @@ thyns_voice_param_info(uint32_t index, param->value = value; param->min.f = 0; param->max.f = 1; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_VOICE_PARAM_FILT_ENV_DEPTH: @@ -89,7 +89,7 @@ thyns_voice_param_info(uint32_t index, param->value = value; param->min.f = -4; param->max.f = 4; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; case THYNS_VOICE_PARAM_AMP: @@ -104,7 +104,7 @@ thyns_voice_param_info(uint32_t index, param->value = value; param->min.f = -1; param->max.f = 1; - param->scale = CLAP_PARAM_LINEAR; + param->scale = CLAP_PARAM_SCALE_LINEAR; break; } #undef P diff --git a/include/clap/clap.h b/include/clap/clap.h @@ -1,4 +1,4 @@ -/* +/* * CLAP - CLever Audio Plugin (<--- needs to find a marketing ok name) * ~~~~~~~~~~~~~~~~~~~~~~~~~~ * @@ -50,12 +50,11 @@ struct clap_host; enum clap_string_size { - CLAP_ID_SIZE = 48, - CLAP_NAME_SIZE = 32, + CLAP_ID_SIZE = 64, + CLAP_NAME_SIZE = 64, CLAP_DESC_SIZE = 256, - CLAP_DISPLAY_SIZE = 32, - CLAP_TAGS_SIZE = 128, - CLAP_URL_SIZE = 256, + CLAP_DISPLAY_SIZE = 64, + CLAP_TAGS_SIZE = 256, }; enum clap_log_severity @@ -104,34 +103,34 @@ union clap_param_value enum clap_event_type { - CLAP_EVENT_NOTE_ON = 0, // note attribute - CLAP_EVENT_NOTE_OFF = 1, // note attribute + CLAP_EVENT_NOTE_ON = 0, // note attribute + CLAP_EVENT_NOTE_OFF = 1, // note attribute + CLAP_EVENT_NOTE_CHOKE = 16, // note attribute CLAP_EVENT_PARAM_SET = 2, // param attribute CLAP_EVENT_PARAM_RAMP = 3, // param attribute CLAP_EVENT_PRESET_SET = 4, // preset attribute CLAP_EVENT_MIDI = 5, // midi attribute - CLAP_EVENT_CONTROL = 6, // control attribute CLAP_EVENT_GUI_OPENED = 7, // plugin to host, no attribute CLAP_EVENT_GUI_CLOSED = 8, // plugin to host, no attribute - CLAP_EVENT_NEW_PRESETS = 9, // plugin to host, no attribute CLAP_EVENT_NEW_PORTS_CONFIGS = 10, // plugin to host, no attribute + CLAP_EVENT_NEW_PARAMS = 9, // plugin to host CLAP_EVENT_LATENCY_CHANGED = 11, // plugin to host, latency attribute CLAP_EVENT_PLAY = 12, // no attribute CLAP_EVENT_PAUSE = 13, // no attribute CLAP_EVENT_STOP = 14, // no attribute - - CLAP_EVENT_JUMP = 15, // attribute jump + CLAP_EVENT_JUMP = 15, // attribute jump }; struct clap_event_note { - uint8_t key; + int8_t key; + int8_t channel; float pitch; float velocity; // 0..1 }; @@ -140,10 +139,11 @@ struct clap_event_param { /* key/voice index */ bool is_global; // is this event global? - uint8_t key; // if !is_global, target key + int8_t key; // if !is_global, target key + int8_t channel; /* parameter */ - int32_t index; // parameter index + int32_t index; // parameter index union clap_param_value value; float increment; // for param ramp char display_text[CLAP_DISPLAY_SIZE]; // use this for display. @@ -152,31 +152,16 @@ struct clap_event_param bool is_used; // is the parameter used in the patch? }; -struct clap_event_control -{ - /* voice/key index */ - bool is_global; // is this event global? - uint8_t key; // if !is_global, target key - - /* control */ - int32_t index; - float value; // 0 .. 1.0f -}; - struct clap_event_preset { - char url[CLAP_URL_SIZE]; // the url to the preset + const char *url; // the url to the preset }; struct clap_event_midi { - /* voice/key index */ - bool is_global; // is this event global? - uint8_t key; // if !is_global, target key - /* midi event */ const uint8_t *buffer; - int32_t size; + int32_t size; }; struct clap_event_latency @@ -188,7 +173,7 @@ struct clap_event_jump { int32_t tempo; // tempo in samples int32_t bar; // the bar number - int32_t bar_offset; // 0 <= cycle_offset < tsig_denom * tempo + int32_t bar_offset; // 0 <= bar_offset < tsig_denom * tempo int32_t tsig_num; // time signature numerator int32_t tsig_denom; // time signature denominator }; @@ -197,14 +182,15 @@ struct clap_event { struct clap_event *next; // linked list, NULL on end enum clap_event_type type; - int64_t steady_time; // steady_time of the event, see host->steady_time(host) + int32_t type_space; // the space to which belongs the event + // see host->get_event_type_space(); + int64_t steady_time; // steady_time of the event, see host->steady_time(host) union { struct clap_event_note note; struct clap_event_param param; struct clap_event_preset preset; struct clap_event_midi midi; - struct clap_event_control control; struct clap_event_latency latency; struct clap_event_jump jump; }; @@ -231,7 +217,7 @@ struct clap_process /* audio buffers */ float **inputs; float **outputs; - int32_t samples_count; + int32_t samples_count; /* process info */ int64_t steady_time; // the steady time in samples @@ -270,6 +256,9 @@ struct clap_host enum clap_log_severity severity, const char *msg); + /* Request for the event type space for space_id. */ + int32_t (*get_event_type_space)(struct clap_host *host, const char *space_id); + /* feature extensions */ void *(*extension)(struct clap_host *host, const char *extention_id); }; @@ -289,7 +278,7 @@ enum clap_plugin_type struct clap_plugin { - int32_t clap_version; // initialized to CALP_VERSION + int32_t clap_version; // initialized to CLAP_VERSION void *host_data; // reserved pointer for the host void *plugin_data; // reserved pointer for the plugin @@ -303,9 +292,9 @@ struct clap_plugin * Returns the size of the original string or 0 if there is no * value for this attributes. */ int32_t (*get_attribute)(struct clap_plugin *plugin, - const char *attr, - char *buffer, - int32_t size); + const char *attr, + char *buffer, + int32_t size); /* activation */ bool (*activate)(struct clap_plugin *plugin); @@ -320,22 +309,25 @@ struct clap_plugin }; /* typedef for dlsym() cast */ -typedef struct clap_plugin *(*clap_create_f)(int32_t plugin_index, +typedef struct clap_plugin *(*clap_create_f)(int32_t plugin_index, struct clap_host *host, - int32_t sample_rate, - int32_t *plugins_count); + int32_t sample_rate, + int32_t *plugins_count); /* Plugin entry point. If plugins_count is not null, then clap_create has * to store the number of plugins available in *plugins_count. * If clap_create failed to create a plugin, it returns NULL. * The return value has to be freed by calling plugin->destroy(plugin). * + * Common sample rate values are: 44100, 48000, 88200, 96000, + * 176400, 192000. + * * This function must be thread-safe. */ struct clap_plugin * -clap_create(int32_t plugin_index, +clap_create(int32_t plugin_index, struct clap_host *host, - int32_t sample_rate, - int32_t *plugins_count); + int32_t sample_rate, + int32_t *plugins_count); # ifdef __cplusplus } diff --git a/include/clap/ext/params.c b/include/clap/ext/params.c @@ -1,7 +1,7 @@ -static inline bool +static inline bool clap_plugin_params_save(struct clap_plugin *plugin, uint8_t *buffer, - int32_t *size) + int32_t *size) { struct clap_plugin_params *params = (struct clap_plugin_params *) plugin->extension(plugin, CLAP_EXT_PARAMS); @@ -21,10 +21,7 @@ clap_plugin_params_save(struct clap_plugin *plugin, for (int32_t i = 0; i < count; ++i) { struct clap_param param; - if (!params->get(plugin, i, &param)) - continue; - - if (param.type == CLAP_PARAM_GROUP) + if (!params->get_param(plugin, i, &param)) continue; clap_serializer_str(&s, param.id, strlen(param.id)); @@ -60,8 +57,8 @@ clap_plugin_params_save(struct clap_plugin *plugin, static inline void clap_plugin_params_restore(struct clap_plugin *plugin, const uint8_t *buffer, - int32_t size, - int64_t steady_time) + int32_t size, + int64_t steady_time) { struct clap_plugin_params *params = (struct clap_plugin_params *) plugin->extension(plugin, CLAP_EXT_PARAMS); @@ -76,7 +73,7 @@ clap_plugin_params_restore(struct clap_plugin *plugin, // fill ids for (int32_t i = 0; i < count; ++i) { struct clap_param param; - if (params->get(plugin, i, &param)) + if (params->get_param(plugin, i, &param)) memcpy(ids[i], param.id, sizeof (param.id)); } diff --git a/include/clap/ext/params.h b/include/clap/ext/params.h @@ -1,4 +1,4 @@ -#ifndef CLAP_EXT_PARAMS_H +#ifndef CLAP_EXT_PARAMS_H # define CLAP_EXT_PARAMS_H # include "../clap.h" @@ -12,33 +12,33 @@ extern "C" { enum clap_param_type { - CLAP_PARAM_GROUP = 0, // no value for this one + CLAP_PARAM_FLOAT = 0, // uses value.f CLAP_PARAM_BOOL = 1, // uses value.b - CLAP_PARAM_FLOAT = 2, // uses value.f - CLAP_PARAM_INT = 3, // uses value.i - CLAP_PARAM_ENUM = 4, // uses value.i + CLAP_PARAM_INT = 2, // uses value.i + CLAP_PARAM_ENUM = 3, // uses value.i }; enum clap_param_scale { - CLAP_PARAM_LINEAR = 0, - CLAP_PARAM_LOG = 1, + CLAP_PARAM_SCALE_LINEAR = 0, + CLAP_PARAM_SCALE_LOG = 1, + CLAP_PARAM_SCALE_EXP = 2, }; struct clap_param { - /* tree fields */ int32_t index; // parameter's index - int32_t parent; // parent's index, -1 for no parent /* param info */ + char module_id[CLAP_ID_SIZE]; char id[CLAP_ID_SIZE]; // a string which identify the param char name[CLAP_NAME_SIZE]; // the display name char desc[CLAP_DESC_SIZE]; char display[CLAP_DISPLAY_SIZE]; // the text used to display the value enum clap_param_type type; bool is_per_note; - bool is_used; // is this parameter used by the patch? + bool is_per_channel; + bool is_used; // is this parameter used by the patch? bool is_periodic; bool is_locked; // if true, the parameter can't be changed by // the host @@ -46,7 +46,14 @@ struct clap_param union clap_param_value min; union clap_param_value max; union clap_param_value deflt; // default value - enum clap_param_scale scale; + enum clap_param_scale scale; +}; + +struct clap_param_module +{ + char id[CLAP_ID_SIZE]; + char name[CLAP_NAME_SIZE]; + char desc[CLAP_DESC_SIZE]; }; struct clap_plugin_params @@ -56,9 +63,13 @@ struct clap_plugin_params /* Copies the parameter's info to param and returns true. * If index is greater or equal to the number then return false. */ - bool (*get)(struct clap_plugin *plugin, - int32_t index, - struct clap_param *param); + bool (*get_param)(struct clap_plugin *plugin, + int32_t index, + struct clap_param *param); + + bool (*get_module)(struct clap_plugin *plugin, + const char *module_id, + struct clap_param_module *module); }; /* Helper that will serialize the plugin's parameters value into the buffer. @@ -69,7 +80,7 @@ struct clap_plugin_params static inline bool clap_plugin_params_save(struct clap_plugin *plugin, uint8_t *buffer, - int32_t *size); + int32_t *size); /* Helper that will deserialize parameters value from the buffer * and send CLAP_EVENT_PARAM_SET to the plugin to restore them. @@ -79,8 +90,8 @@ clap_plugin_params_save(struct clap_plugin *plugin, static inline void clap_plugin_params_restore(struct clap_plugin *plugin, const uint8_t *buffer, - int32_t size, - int64_t steady_time); + int32_t size, + int64_t steady_time); # include "params.c" diff --git a/include/clap/ext/ports.h b/include/clap/ext/ports.h @@ -1,4 +1,4 @@ -#ifndef CLAP_EXT_PORTS_H +#ifndef CLAP_EXT_PORTS_H # define CLAP_EXT_PORTS_H # include "../clap.h" @@ -7,28 +7,38 @@ enum clap_port_type { - CLAP_PORT_MONO = 0, - CLAP_PORT_STEREO = 1, - CLAP_PORT_SURROUND = 2, + CLAP_PORT_AUDIO = 0, + CLAP_PORT_EVENT = 1, +}; + +enum clap_port_channel_mapping +{ + CLAP_PORT_UNKNWN = 0, + CLAP_PORT_MONO = 1, + CLAP_PORT_STEREO = 2, + CLAP_PORT_SURROUND = 3, }; enum clap_port_role { - CLAP_PORT_INOUT = 0, - CLAP_PORT_SIDECHAIN = 1, + CLAP_PORT_INOUT = 0, + CLAP_PORT_SIDECHAIN = 1, + CLAP_PORT_MODULATION = 2, }; struct clap_port_info { - enum clap_port_type type; - enum clap_port_role role; - char name[CLAP_NAME_SIZE]; - bool is_repeatable; + enum clap_port_type type; + int channel_count; + enum clap_port_channel_mapping channel_mapping; + enum clap_port_role role; + char name[CLAP_NAME_SIZE]; + bool is_repeatable; }; struct clap_ports_config { - char name[CLAP_NAME_SIZE]; + char name[CLAP_NAME_SIZE]; int32_t inputs_count; int32_t outputs_count; }; @@ -39,15 +49,19 @@ struct clap_plugin_ports { /* Returns the number of available configurations */ int32_t (*get_configs_count)(struct clap_plugin *plugin); + bool (*get_config)(struct clap_plugin *plugin, int32_t config_index, struct clap_ports_config *config); + bool (*get_info)(struct clap_plugin *plugin, int32_t config_index, int32_t port_index, struct clap_port_info *port); + bool (*set_config)(struct clap_plugin *plugin, int32_t config_index); + bool (*set_repeat)(struct clap_plugin *plugin, int32_t port_index, int32_t count); diff --git a/include/clap/ext/presets.h b/include/clap/ext/presets.h @@ -1,4 +1,4 @@ -#ifndef CLAP_EXT_PRESETS_H +#ifndef CLAP_EXT_PRESETS_H # define CLAP_EXT_PRESETS_H # include "../clap.h" @@ -7,53 +7,32 @@ struct clap_preset { - char url[CLAP_URL_SIZE]; // location to the patch - char name[CLAP_NAME_SIZE]; // display name - char desc[CLAP_DESC_SIZE]; // desc and how to use it + char name[CLAP_NAME_SIZE]; // display name + char desc[CLAP_DESC_SIZE]; // desc and how to use it char author[CLAP_NAME_SIZE]; - char tags[CLAP_TAGS_SIZE]; // "tag1;tag2;tag3;..." - uint8_t score; // 0 = garbage, ..., 4 = favorite + char categories[CLAP_TAGS_SIZE]; // "cat1;cat2;cat3;..." + char tags[CLAP_TAGS_SIZE]; // "tag1;tag2;tag3;..." + uint8_t score; // 0 = garbage, ..., 100 = best }; -struct clap_preset_iterator; - +/* The principle behind this extension is that the host gets a list of + * directories to scan recursively, and then for each files, it can ask + * the interface to load the preset. */ struct clap_plugin_presets { - /* Allocate a new preset iterator positioned at the beginning of the - * preset collection, store its pointer into (*iter). - * Returns true on success, false otherwise. - * If the collection is empty, then it must return false and (*iter) - * should be NULL. */ - bool (*iter_begin)(struct clap_plugin *plugin, - struct clap_preset_iterator **iter); - - /* Iterate to the next value. If the iterator reached the end of the - * collection, returns false. - * Returns true on success. */ - bool (*iter_next)(struct clap_plugin *plugin, - struct clap_preset_iterator *iter); - - /* Release the iterator. - * If iter is NULL, then do nothing. */ - void (*iter_destroy)(struct clap_plugin *plugin, - struct clap_preset_iterator *iter); - - /* Get preset at the current iterator position. - * Returns true on success, false otherwise. */ - bool (*iter_get)(struct clap_plugin *plugin, - struct clap_preset_iterator *iter, - struct clap_preset *preset); + /* Copies at most *path_size bytes into path. + * If directory_index is bigger than the number of directories, + * then return false. */ + bool (*get_directory)(struct clap_plugin_presets *presets, + int directory_index, + char *path, + int32_t *path_size); /* Get a preset info by its URL and returns true. * If the preset is not found, then it should return false. */ - bool (*get)(struct clap_plugin *plugin, - const char *url, - struct clap_preset *preset); - - /* Set the preset score. */ - void (*set_score)(struct clap_plugin *plugin, - const char *url, - uint8_t score); + bool (*get_preset)(struct clap_plugin *plugin, + const char *path, + struct clap_preset *preset); }; #endif /* !CLAP_EXT_PRESETS_H */ diff --git a/include/clap/midi/parser.c b/include/clap/midi/parser.c @@ -1,4 +1,4 @@ -#include <assert.h> +#include <assert.h> #include <math.h> static inline float @@ -307,13 +307,6 @@ clap_midi_convert(const uint8_t *in, event->note.velocity = ((float)parser.channel.param2) / 127.0f; event->note.pitch = clap_midi_pitches[event->note.key]; return; - - case CLAP_MIDI_CHANNEL_CC: - event->type = CLAP_EVENT_CONTROL; - event->control.is_global = false; - event->control.index = parser.channel.param1; - event->control.value = ((float)parser.channel.param2) / 127.0f; - return; } /* fall to default */ diff --git a/tools/clap-info/clap-info.c b/tools/clap-info/clap-info.c @@ -1,4 +1,4 @@ -#include <stdio.h> +#include <stdio.h> #include <dlfcn.h> #include <clap/clap.h> @@ -73,7 +73,7 @@ static void print_params(struct clap_plugin *plugin) struct clap_param param; for (int32_t i = 0; i < count; ++i) { - if (!params->get(plugin, i, &param)) + if (!params->get_param(plugin, i, &param)) continue; fprintf(stdout, " => {id: %s, name: %s, desc: %s, display: %s, " @@ -101,10 +101,6 @@ static void print_params(struct clap_plugin *plugin) fprintf(stdout, ", type: bool, value: %d, min: %d, max: %d, default: %d", param.value.i, param.min.i, param.max.i, param.deflt.i); break; - - case CLAP_PARAM_GROUP: - fprintf(stdout, ", type: group"); - break; } fprintf(stdout, "}\n");