Kestrel Interface
Loading...
Searching...
No Matches
kest_parameter.c
Go to the documentation of this file.
1#include <float.h>
2#include "kest_int.h"
3
4#ifndef PRINTLINES_ALLOWED
5#define PRINTLINES_ALLOWED 0
6#endif
7
8#define DEFAULT_MAX_VELOCITY 1.0
9
12
13static const char *FNAME = "kest_parameter.c";
14
16{
17 if (!param)
18 return ERR_NULL_PTR;
19
20 param->value = 0.0;
21 param->min = 0.0;
22 param->min_expr = NULL;
23 param->max = 1.0;
24 param->max_expr = NULL;
26 param->factor = 1.0;
27 param->id = (kest_parameter_id){.profile_id = 0, .effect_id = 0, .parameter_id = 0};
28 param->name = NULL;
29 param->name_internal = NULL;
30 param->units = NULL;
33 param->group = -1;
34
35 #ifdef KEST_ENABLE_REPRESENTATIONS
36 param->reps = NULL;
37 param->effect_rep.representer = NULL;
38 param->effect_rep.representee = param;
39 param->effect_rep.update = kest_parameter_effect_rep_update;
40 kest_representation_pll_safe_append(&param->reps, &param->effect_rep);
41 #endif
42
43 return NO_ERROR;
44}
45
46int init_parameter(kest_parameter *param, const char *name, float level, float min, float max)
47{
48 if (!param) return ERR_NULL_PTR;
49
50 param->name = name;
51 param->name_internal = NULL;
52 param->units = NULL;
53 param->value = level;
54 param->min = min;
55 param->min_expr = NULL;
56 param->max = max;
57 param->max_expr = NULL;
58 param->max_velocity = fabsf(DEFAULT_MAX_VELOCITY * (max - min));
59 param->factor = 1.0;
60 param->group = -1;
62
63 #ifdef KEST_ENABLE_REPRESENTATIONS
64 param->reps = NULL;
65 param->effect_rep.representer = NULL;
66 param->effect_rep.representee = param;
67 param->effect_rep.update = kest_parameter_effect_rep_update;
68 kest_representation_pll_safe_append(&param->reps, &param->effect_rep);
69 #endif
70 return NO_ERROR;
71}
72
73kest_parameter *new_m_parameter_wni(const char *name, const char *name_internal, float level, float min, float max)
74{
76 if (!param)
77 return NULL;
78
79 init_parameter_wni(param, name, name_internal, level, min, max);
80
81 return param;
82}
83
84int init_parameter_wni(kest_parameter *param, const char *name, const char *name_internal, float level, float min, float max)
85{
86 if (!param)
87 return ERR_NULL_PTR;
88 init_parameter(param, name, level, min, max);
89 param->name_internal = name_internal;
90
91 return NO_ERROR;
92}
93
95{
96 if (!setting)
97 return ERR_NULL_PTR;
98
100
101 setting->name = NULL;
102 setting->name_internal = NULL;
103 setting->value = 0;
104
105 setting->n_options = 0;
106 setting->options = NULL;
107
110 setting->group = -1;
111
112 #ifdef KEST_ENABLE_REPRESENTATIONS
113 setting->reps = NULL;
114 setting->effect_rep.representer = NULL;
115 setting->effect_rep.representee = setting;
116 setting->effect_rep.update = kest_setting_effect_rep_update;
117 kest_representation_pll_safe_append(&setting->reps, &setting->effect_rep);
118 #endif
119
120 return NO_ERROR;
121}
122
123int init_setting(kest_setting *setting, const char *name, uint16_t level)
124{
125 if (!setting)
126 return ERR_NULL_PTR;
127
128 setting->name = name;
129 setting->value = level;
130
131 setting->n_options = 0;
132 setting->options = NULL;
133
135
136 setting->group = -1;
137
138 #ifdef KEST_ENABLE_REPRESENTATIONS
139 setting->reps = NULL;
140 setting->effect_rep.representer = NULL;
141 setting->effect_rep.representee = setting;
142 setting->effect_rep.update = kest_setting_effect_rep_update;
143 kest_representation_pll_safe_append(&setting->reps, &setting->effect_rep);
144 #endif
145
146 return NO_ERROR;
147}
148
150{
151 if (!param)
152 return;
153
154
155
156 return;
157}
158
160{
161 if (!param)
162 return;
163
164 gut_parameter(param);
165 kest_free(param);
166
167 return;
168}
169
170int parameter_set_id(kest_parameter *param, uint16_t pid, uint16_t tid, uint16_t ppid)
171{
172 if (!param)
173 return ERR_NULL_PTR;
174
175 param->id.profile_id = pid;
176 param->id.effect_id = tid;
177 param->id.parameter_id = ppid;
178
179 return NO_ERROR;
180}
181
183{
184 if (!dest || !src)
185 return;
186
187 init_parameter_str(dest);
188
189 dest->value = src->value;
190 dest->min = src->min;
191 dest->min_expr = src->min_expr;
192 dest->max = src->max;
193 dest->max_expr = src->max_expr;
194
195 dest->factor = src->factor;
196
197 dest->widget_type = src->widget_type;
198 dest->name = src->name;
199 dest->name_internal = src->name_internal;
200 dest->units = src->units;
201
202 dest->max_velocity = src->max_velocity;
203
204 dest->scale = src->scale;
205
206 dest->group = src->group;
207
208 dest->id.parameter_id = src->id.parameter_id;
209
210 return;
211}
212
214{
215 if (!src)
216 return NULL;
217
218 kest_parameter *param = kest_alloc(sizeof(kest_parameter));
219
220 if (!param)
221 return NULL;
222
223 clone_parameter(param, src);
224
225 return param;
226}
227
229{
230 if (!src)
231 return NULL;
232
233 kest_parameter *param = kest_alloc(sizeof(kest_parameter));
234
235 if (!param)
236 return NULL;
237
238 clone_parameter(param, src);
239
240 #ifdef KEST_ENABLE_REPRESENTATIONS
241 param->effect_rep.representer = (void*)effect;
242 #endif
243
244 return param;
245}
246
248{
249 if (!dest || !src)
250 return ERR_NULL_PTR;
251
252 init_setting_str(dest);
253
254 dest->id = src->id;
255
256 dest->value = src->value;
257 dest->min = src->min;
258 dest->max = src->max;
259
260 dest->n_options = src->n_options;
261
262 if (dest->n_options)
263 {
264 dest->options = kest_alloc(sizeof(kest_setting_option) * dest->n_options);
265
266 if (!dest->options)
267 {
268 return ERR_ALLOC_FAIL;
269 }
270
271 for (int i = 0; i < dest->n_options; i++)
272 {
273 if (src->options)
274 {
275 memcpy(&dest->options[i], &src->options[i], sizeof(kest_setting_option));
276 }
277 else
278 {
279 dest->options[i].value = i;
280 dest->options[i].name = "";
281 }
282 }
283 }
284
285 dest->widget_type = src->widget_type;
286 dest->name = src->name;
287 dest->name_internal = src->name_internal;
288
289 dest->group = src->group;
290
291 dest->units = src->units;
292 dest->page = src->page;
293
294 return NO_ERROR;
295}
296
297
299{
300 if (!src)
301 return NULL;
302
303 kest_setting *setting = kest_alloc(sizeof(kest_setting));
304
305 if (!setting)
306 return NULL;
307
308 clone_setting(setting, src);
309
310 return setting;
311}
312
314{
315 if (!src)
316 return NULL;
317
318 kest_setting *setting = kest_alloc(sizeof(kest_setting));
319
320 if (!setting)
321 return NULL;
322
323 clone_setting(setting, src);
324
325 #ifdef KEST_ENABLE_REPRESENTATIONS
326 setting->effect_rep.representer = (void*)effect;
327 #endif
328
329 return setting;
330}
331
333{
334 if (!setting)
335 return;
336
337 if (setting->options)
338 {
339 kest_free(setting->options);
340 }
341
342 return;
343}
344
345
347{
348 if (!setting)
349 return;
350
351 gut_setting(setting);
352 kest_free(setting);
353
354 return;
355}
356
357int kest_parameters_assign_ids(kest_parameter_pll *list)
358{
359 int next_parameter_id = 0;
360 KEST_PRINTF("kest_parameters_assign_ids\n");
361
362 kest_parameter_pll *current = list;
363
364 while (current)
365 {
366 if (current->data)
367 {
368 KEST_PRINTF("Assigning ID %d...\n",
369 next_parameter_id);
370 current->data->id.parameter_id = next_parameter_id++;
371 }
372 current = current->next;
373 }
374
375 KEST_PRINTF("kest_parameters_assign_ids done\n");
376 return NO_ERROR;
377}
378
379int kest_settings_assign_ids(kest_setting_pll *list)
380{
381 int next_setting_id = 0;
382 KEST_PRINTF("kest_settings_assign_ids\n");
383
384 kest_setting_pll *current = list;
385
386 while (current)
387 {
388 if (current->data)
389 {
390 KEST_PRINTF("Assigning ID %d...\n",
391 next_setting_id);
392 current->data->id.setting_id = next_setting_id++;
393 }
394 current = current->next;
395 }
396
397 KEST_PRINTF("kest_settings_assign_ids done\n");
398 return NO_ERROR;
399}
400
401#ifdef KEST_ENABLE_GLOBAL_CONTEXT
402kest_interval kest_parameter_get_range(kest_parameter *param)
403{
405
406 if (!param) return i;
407
409
410 if (effect && !effect->scope)
411 {
412 KEST_PRINTF("effect is not in posession of a scope... strange. generate it\n");
413 effect->scope = kest_effect_create_scope(effect);
414 }
415
416 int no_effect = 0;
417 int no_scope = 0;
418
419 if (param->min_expr)
420 {
422 {
423 i.a = kest_expression_evaluate(param->min_expr, NULL);
424 }
425 else
426 {
427 if (effect && effect->scope)
428 {
429 i.a = kest_expression_evaluate(param->min_expr, effect->scope);
430 }
431 else
432 {
433 if (param->min_expr->cached)
434 {
435 i.a = param->min_expr->cached_val;
436 }
437 }
438 }
439 }
440
441 if (param->max_expr)
442 {
444 {
445 i.b = kest_expression_evaluate(param->max_expr, NULL);
446 }
447 else
448 {
449 if (effect && effect->scope)
450 {
451 i.b = kest_expression_evaluate(param->max_expr, effect->scope);
452 }
453 else
454 {
455 if (param->max_expr->cached)
456 {
457 i.b = param->max_expr->cached_val;
458 }
459 }
460 }
461 }
462
463 return i;
464}
465#endif
466
467void kest_parameter_effect_rep_update(void *representer, void *representee)
468{
469 kest_effect *effect = (kest_effect*)representer;
470 kest_parameter *param = (kest_parameter*)representee;
471
472 if (!effect || !param)
473 return;
474
476
477 return;
478}
479
480void kest_setting_effect_rep_update(void *representer, void *representee)
481{
482 kest_effect *effect = (kest_effect*)representer;
483 kest_setting *setting = (kest_setting*)representee;
484
485 if (!effect || !setting)
486 return;
487
489
490 return;
491}
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
kest_effect * cxt_get_effect_by_id(kest_context *cxt, uint16_t profile_id, uint16_t effect_id)
kest_expr_scope * kest_effect_create_scope(kest_effect *effect)
int kest_effect_update_reps(kest_effect *effect)
#define ERR_ALLOC_FAIL
#define NO_ERROR
#define ERR_NULL_PTR
int kest_expression_is_constant(kest_expression *expr)
kest_interval kest_interval_real_line()
float kest_expression_evaluate(kest_expression *expr, kest_expr_scope *scope)
kest_context global_cxt
Definition kest_int.c:12
#define IMPLEMENT_LINKED_PTR_LIST(X)
int clone_setting(kest_setting *dest, kest_setting *src)
kest_parameter * kest_parameter_make_clone(kest_parameter *src)
int init_parameter(kest_parameter *param, const char *name, float level, float min, float max)
void kest_setting_effect_rep_update(void *representer, void *representee)
int init_parameter_str(kest_parameter *param)
int parameter_set_id(kest_parameter *param, uint16_t pid, uint16_t tid, uint16_t ppid)
kest_setting * kest_setting_make_clone(kest_setting *src)
void gut_setting(kest_setting *setting)
int init_setting(kest_setting *setting, const char *name, uint16_t level)
void kest_setting_free(kest_setting *setting)
int init_setting_str(kest_setting *setting)
void kest_parameter_free(kest_parameter *param)
void clone_parameter(kest_parameter *dest, kest_parameter *src)
kest_setting * kest_setting_make_clone_for_effect(kest_setting *src, kest_effect *effect)
int kest_settings_assign_ids(kest_setting_pll *list)
int kest_parameters_assign_ids(kest_parameter_pll *list)
void gut_parameter(kest_parameter *param)
void kest_parameter_effect_rep_update(void *representer, void *representee)
kest_parameter * new_m_parameter_wni(const char *name, const char *name_internal, float level, float min, float max)
kest_parameter * kest_parameter_make_clone_for_effect(kest_parameter *src, kest_effect *effect)
#define DEFAULT_MAX_VELOCITY
int init_parameter_wni(kest_parameter *param, const char *name, const char *name_internal, float level, float min, float max)
#define PARAMETER_SCALE_LINEAR
#define TRANSFORMER_SETTING_PAGE_SETTINGS
#define TRANSFORMER_SETTING_INT
#define SETTING_WIDGET_DROPDOWN
#define PARAM_WIDGET_VIRTUAL_POT
#define SETTING_WIDGET_FIELD
#define KEST_PRINTF(...)
Definition kest_printf.h:10
kest_expr_scope * scope
Definition kest_effect.h:44
struct kest_expression * min_expr
const char * name_internal
const char * name
struct kest_expression * max_expr
const char * units
kest_parameter_id id
kest_setting_option * options
const char * units
kest_setting_id id
const char * name_internal
const char * name