Kestrel Interface
Loading...
Searching...
No Matches
kest_dict_extract.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 1
5#endif
6
7static const char *FNAME = "kest_dict_extract.c";
8
10{
11 if (!dict)
12 return NULL;
13
14 int ret_val;
16
17 if (!param) return NULL;
18
19 init_parameter_str(param);
20
21 param->name_internal = kest_strndup(dict->name, 128);
22
23 if (!param->name_internal)
24 goto parameter_extract_abort;
25
26 char *str;
27 float v;
28 int i;
29 kest_expression *expr;
30
31 if ((ret_val = kest_dictionary_lookup_str(dict, "name", (void*)&str)) == NO_ERROR)
32 {
33 param->name = kest_strndup(str, 128);
34 KEST_PRINTF("Obtained parameter name; \"%s\"\n", param->name);
35 }
36 else
37 {
38 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"name\" for parameter \"%s\"", param->name_internal);
39 goto parameter_extract_abort;
40 }
41
42 if ((ret_val = kest_dictionary_lookup_expr(dict, "default", &expr)) == NO_ERROR)
43 {
45 {
46 kest_parser_error_at_node(ps, dict_node, "Default value must be constant; \"%s\" (type \"%s\") is not\n",
48 goto parameter_extract_abort;
49 }
50
51 param->value = kest_expression_evaluate(expr, NULL);
52 }
53 else
54 {
55 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"default\" for parameter \"%s\"", param->name_internal);
56 goto parameter_extract_abort;
57 }
58
59 if ((ret_val = kest_dictionary_lookup_expr(dict, "min", &expr)) == NO_ERROR)
60 {
61 param->min_expr = expr;
62 }
63 else
64 {
65 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"min\" for parameter \"%s\"", param->name_internal);
66 goto parameter_extract_abort;
67 }
68
69 if ((ret_val = kest_dictionary_lookup_expr(dict, "max", &expr)) == NO_ERROR)
70 {
71 param->max_expr = expr;
72 }
73 else
74 {
75 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"max\" for parameter \"%s\"", param->name_internal);
76 goto parameter_extract_abort;
77 }
78
79 if ((ret_val = kest_dictionary_lookup_str(dict, "scale", (void*)&str)) == NO_ERROR)
80 {
81 if (strcmp(str, "linear") == 0 || strcmp(str, "flat") == 0)
82 {
84 }
85 else if (strcmp(str, "log") == 0 || strcmp(str, "logarithmic") == 0
86 || strcmp(str, "exp") == 0 || strcmp(str, "exponential") == 0
87 || strcmp(str, "freq") == 0 || strcmp(str, "octave") == 0)
88 {
90 }
91 else
92 {
93 kest_parser_warn_at_node(ps, dict_node, "Unknown scale \"%s\" given to parameter \"%s\". Defaulting to linear.", str, param->name_internal);
94 }
95 }
96
97 if ((ret_val = kest_dictionary_lookup_str(dict, "units", (void*)&str)) == NO_ERROR)
98 {
99 param->units = kest_strndup(str, 128);
100 }
101
102 if ((ret_val = kest_dictionary_lookup_expr(dict, "max_velocity", &expr)) == NO_ERROR)
103 {
105 {
106 kest_parser_error_at_node(ps, dict_node, "max_velocity must be constant");
107 goto parameter_extract_abort;
108 }
109
110 param->max_velocity = fabsf(kest_expression_evaluate(expr, NULL));
111 }
112
113 if ((ret_val = kest_dictionary_lookup_str(dict, "widget_type", (void*)&str)) == NO_ERROR)
114 {
115 if (strcmp(str, "dial") == 0 || strcmp(str, "potentiometer") == 0)
116 {
118 }
119 else if (strcmp(str, "slider" ) == 0 || strcmp(str, "slider_horizontal") == 0
120 || strcmp(str, "hslider") == 0)
121 {
123 }
124 else if (strcmp(str, "slider_vertical") == 0
125 || strcmp(str, "vslider") == 0)
126 {
128 }
129 else if (strcmp(str, "slider_tall_vertical") == 0 || strcmp(str, "slider_vertical_tall") == 0
130 || strcmp(str, "vslider_tall") == 0)
131 {
133 }
134 else
135 {
136 kest_parser_warn_at_node(ps, dict_node, "Unknown widget type \"%s\" given to parameter \"%s\". Defaulting to dial.", str, param->name_internal);
137 }
138 }
139
140 if ((ret_val = kest_dictionary_lookup_expr(dict, "group", &expr)) == NO_ERROR)
141 {
143 {
144 kest_parser_error_at_node(ps, dict_node, "Group value must be constant");
145 goto parameter_extract_abort;
146 }
147
148 param->group = (int)(roundf(kest_expression_evaluate(expr, NULL)));
149 }
150
151 KEST_PRINTF("Extracted a parameter;\n");
152 KEST_PRINTF("\tname: \"%s\"\n", param->name);
153 KEST_PRINTF("\tname_internal: \"%s\"\n", param->name_internal);
154 KEST_PRINTF("\tvalue: %f\n", param->value);
155 KEST_PRINTF("\tmin_expr: %s\n", kest_expression_to_string(param->min_expr));
156 KEST_PRINTF("\tmax_expr: %s\n", kest_expression_to_string(param->max_expr));
157 KEST_PRINTF("\tscale: %d\n", param->scale);
158 KEST_PRINTF("\tmax_velocity: %f\n", param->max_velocity);
159 KEST_PRINTF("\twidget_type: %d\n", param->widget_type);
160 KEST_PRINTF("\tgroup: %d\n", param->group);
161
162 return param;
163
164parameter_extract_abort:
165 if (param)
166 {
167 gut_parameter(param);
168 kest_free(param);
169 }
170
171 return NULL;
172}
173
175{
176 if (!dict || !setting)
177 return ERR_NULL_PTR;
178
179 int ret_val;
181
182 return NO_ERROR;
183}
184
186{
187 if (!dict || !setting)
188 return ERR_NULL_PTR;
189
190 int ret_val;
192
193 const char *str;
194
195 setting->value = 0;
196 if ((ret_val = kest_dictionary_lookup_str(dict, "default", &str)) == NO_ERROR)
197 {
198 if (strcmp(str, "true") == 0)
199 {
200 setting->value = 1;
201 }
202 else if (strcmp(str, "false") != 0)
203 {
204 kest_parser_warn_at_node(ps, dict_node, "Unknown default value \"%s\" given to bool setting \"%s\". Defaulting to false", str, setting->name_internal);
205 }
206 }
207 else
208 {
209 kest_parser_warn_at_node(ps, dict_node, "No default value given to bool setting \"%s\". Defaulting to false", setting->name_internal);
210 }
211
212 return NO_ERROR;
213}
214
216{
217 if (!dict || !setting)
218 return ERR_NULL_PTR;
219
220 int ret_val;
222
223 kest_expression *expr;
224
225 setting->value = 0;
226 if ((ret_val = kest_dictionary_lookup_expr(dict, "default", &expr)) == NO_ERROR)
227 {
229 {
230 kest_parser_error_at_node(ps, dict_node, "Default value must be constant");
231 return ERR_BAD_ARGS;
232 }
233
234 setting->value = (int)(roundf(kest_expression_evaluate(expr, NULL)));
235 }
236 else
237 {
238 kest_parser_warn_at_node(ps, dict_node, "Could not find mandatory attribute \"default\" for setting \"%s\"; defulating to 0.", setting->name_internal);
239 }
240
241 setting->min = 0;
242 if ((ret_val = kest_dictionary_lookup_expr(dict, "min", &expr)) == NO_ERROR)
243 {
245 {
246 kest_parser_error_at_node(ps, dict_node, "Min must be constant");
247 return ERR_BAD_ARGS;
248 }
249
250 setting->min = (int)(roundf(kest_expression_evaluate(expr, NULL)));
251 }
252 else
253 {
254 kest_parser_warn_at_node(ps, dict_node, "Could not find mandatory attribute \"min\" for setting \"%s\"; defulating to 0.", setting->name_internal);
255 }
256
257 setting->max = 0;
258 if ((ret_val = kest_dictionary_lookup_expr(dict, "max", &expr)) == NO_ERROR)
259 {
261 {
262 kest_parser_error_at_node(ps, dict_node, "Max must be constant");
263 return ERR_BAD_ARGS;
264 }
265
266 setting->max = (int)(roundf(kest_expression_evaluate(expr, NULL)));
267 }
268 else
269 {
270 kest_parser_warn_at_node(ps, dict_node, "Could not find mandatory attribute \"max\" for setting \"%s\"; defulating to 0.", setting->name_internal);
271 }
272
273 return NO_ERROR;
274}
275
277{
278 if (!dict)
279 return NULL;
280
281 int ret_val;
282 char *str;
283 float v;
284 int i;
285 kest_expression *expr;
286
287 kest_setting *setting = kest_alloc(sizeof(kest_setting));
288 if (!setting) return NULL;
289
290 init_setting_str(setting);
291
292 setting->name_internal = kest_strndup(dict->name, 128);
293
294 if (!setting->name_internal)
295 goto setting_extract_abort;
296
297 if ((ret_val = kest_dictionary_lookup_str(dict, "name", (void*)&str)) == NO_ERROR)
298 {
299 setting->name = kest_strndup(str, 128);
300 KEST_PRINTF("Obtained setting name; \"%s\"\n", setting->name);
301 }
302 else
303 {
304 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"name\" for setting \"%s\"", setting->name_internal);
305 goto setting_extract_abort;
306 }
307
309 if ((ret_val = kest_dictionary_lookup_str(dict, "type", (void*)&str)) == NO_ERROR)
310 {
311 KEST_PRINTF("Obtained setting type; \"%s\"\n", str);
312
313 if (strcmp(str, "enum") == 0)
314 {
316 }
317 else if (strcmp(str, "bool") == 0)
318 {
320 }
321 else if (strcmp(str, "int") == 0)
322 {
323 setting->type = TRANSFORMER_SETTING_INT;
324 }
325 else
326 {
327 kest_parser_warn_at_node(ps, dict_node, "Unknown scale \"%s\" given to setting \"%s\". Defaulting to int.", str, setting->name_internal);
328 }
329 }
330 else
331 {
332 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"type\" for setting \"%s\"", setting->name_internal);
333 goto setting_extract_abort;
334 }
335
336 switch (setting->type)
337 {
339 ret_val = kest_extract_enum_setting_from_dict(ps, dict_node, dict, setting);
340
341 if (ret_val != NO_ERROR)
342 goto setting_extract_abort;
343 break;
344
346 ret_val = kest_extract_bool_setting_from_dict(ps, dict_node, dict, setting);
347
348 if (ret_val != NO_ERROR)
349 goto setting_extract_abort;
350 break;
351
353 ret_val = kest_extract_int_setting_from_dict(ps, dict_node, dict, setting);
354
355 if (ret_val != NO_ERROR)
356 goto setting_extract_abort;
357 break;
358 }
359
360 if ((ret_val = kest_dictionary_lookup_str(dict, "units", (void*)&str)) == NO_ERROR)
361 setting->units = kest_strndup(str, 128);
362
364
365 if ((ret_val = kest_dictionary_lookup_str(dict, "page", (void*)&str)) == NO_ERROR)
366 {
367 KEST_PRINTF("Obtained setting page; \"%s\"\n", str);
368
369 if (strcmp(str, "main") == 0)
371 else if (strcmp(str, "settings") == 0)
373 else
374 kest_parser_warn_at_node(ps, dict_node, "Unknown page \"%s\" given for setting \"%s\". Defaulting to settings page.", str, setting->name_internal);
375 }
376
377 if ((ret_val = kest_dictionary_lookup_expr(dict, "group", &expr)) == NO_ERROR)
378 {
380 {
381 kest_parser_error_at_node(ps, dict_node, "Group value must be constant");
382 goto setting_extract_abort;
383 }
384
385 setting->group = (int)(roundf(kest_expression_evaluate(expr, NULL)));
386 }
387
388 KEST_PRINTF("Extracted a setting;\n");
389 KEST_PRINTF("\tname: \"%s\"\n", setting->name);
390 KEST_PRINTF("\tname_internal: \"%s\"\n", setting->name_internal);
391 KEST_PRINTF("\tpage: %s\n", (setting->page == TRANSFORMER_SETTING_PAGE_MAIN) ? "main" : "settings");
392
393 return setting;
394
395setting_extract_abort:
396
397 if (setting)
398 {
399 gut_setting(setting);
400 kest_free(setting);
401 }
402
403 return NULL;
404}
405
407{
408 if (!dict || !res)
409 return ERR_NULL_PTR;
410
411 int ret_val;
412
413 kest_expression *expr;
414
415 ret_val = kest_dictionary_lookup_expr(dict, "size", &expr);
416
417 if (ret_val == NO_ERROR)
418 {
419 res->size = expr;
420 }
421 else
422 {
423 res->size = NULL;
424 }
425
426 ret_val = kest_dictionary_lookup_expr(dict, "delay", &expr);
427
428 if (ret_val == NO_ERROR)
429 {
430 res->delay = expr;
431 }
432 else
433 {
434 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"delay\" for delay buffer \"%s\"", res->name);
435 return ERR_BAD_ARGS;
436 }
437
438 KEST_PRINTF("Found delay \"%s\", size %p, delay %p\n", res->name, res->size, res->delay);
439
440 return NO_ERROR;
441}
442
444{
445 if (!dict || !res)
446 return ERR_NULL_PTR;
447
448 int ret_val;
449
450 int size = 1;
451
452 kest_expression *expr;
453
454 KEST_PRINTF("Extracting filter \"%s\"...\n", res->name);
455
456 ret_val = kest_dictionary_lookup_expr(dict, "size", &expr);
457
458 if (ret_val == NO_ERROR)
459 {
460 size = (int)(roundf(fabs(kest_expression_evaluate(expr, NULL))));
461
462 if (size == 0)
463 size = 1;
464
465 res->mem_size = size;
466 }
467 else
468 {
469 res->mem_size = 1;
470 }
471
472 return NO_ERROR;
473}
474
476{
477 if (!dict || !res)
478 return ERR_NULL_PTR;
479
480 KEST_PRINTF("Extracting coefficients for filter \"%s\"...\n", res->name);
481
482 kest_filter *filter = (kest_filter*)res->data;
483
484 if (!filter)
485 return ERR_ALLOC_FAIL;
486
487 kest_dictionary_entry_list *coefs = NULL;
488
489 int ret_val = kest_dictionary_lookup_list(dict, "coefs", &coefs);
490
491 if (ret_val != NO_ERROR)
492 {
493 kest_parser_error_at_node(ps, dict_node, "Could not find mandatory attribute \"coefs\" for filter \"%s\"", res->name);
494 return ERR_BAD_ARGS;
495 }
496
497 KEST_PRINTF("Found list; pointer %p.\n", coefs);
498
499 KEST_PRINTF("%d entries. begin traversal\n", coefs->count);
500
501 kest_string *string;
502 char *str;
503
504 for (int i = 0; i < coefs->count; i++)
505 {
506 string = kest_dict_entry_to_string(&coefs->entries[i]);
507 if (!string)
508 {
509 KEST_PRINTF("Alloc fail!!\n");
510 return ERR_ALLOC_FAIL;
511 }
512 str = kest_string_to_native(string);
513 if (!str)
514 {
515 KEST_PRINTF("Alloc fail 2!!\n");
516 return ERR_ALLOC_FAIL;
517 }
518 KEST_PRINTF("Entry %d; %s\n", i, str);
519 kest_free(str);
520 kest_string_destroy(string);
521 string = NULL;
522
523 if (coefs->entries[i].type != DICT_ENTRY_TYPE_EXPR)
524 {
525 kest_parser_error_at_node(ps, dict_node, "Filter coefficients must be expressions, but coefficient %d of filter \"%s\" is a %s (%d).",
526 i, res->name, kest_dict_entry_type_to_string_nice(coefs->entries[i].type), coefs->entries[i].type);
527 return ERR_BAD_ARGS;
528 }
529
530 kest_expression_ptr_list_append(&filter->coefs, coefs->entries[i].value.val_expr);
531 }
532
533 return NO_ERROR;
534}
535
537{
538 if (!dict || !res)
539 return ERR_NULL_PTR;
540
541 kest_filter *filter = kest_filter_create(NULL);
542
543 if (!filter)
544 return ERR_ALLOC_FAIL;
545
546 res->data = (void*)filter;
547
548 filter->feed_forward = 3;
549 filter->feed_back = 2;
550
551 int ret_val = kest_extract_filter_coefs_from_dict(ps, dict_node, dict, res);
552
553 if (ret_val != NO_ERROR)
554 return ret_val;
555
556 kest_expression_ptr_list *coefs = &filter->coefs;
557
558 if (filter->feed_forward + filter->feed_back != coefs->count)
559 {
560 kest_parser_error_at_node(ps, dict_node, "Filter \"%s\" is declared to be a biquad, but supplies %d coefficients, not 5.", res->name, coefs->count);
561 return ERR_BAD_ARGS;
562 }
563
564 KEST_PRINTF("Extracted (%d, %d) filter \"%s\", with coefficients\n", filter->feed_forward, filter->feed_back, res->name);
565
566 for (int i = 0; i < coefs->count; i++)
567 {
568 KEST_PRINTF("\t%s\n", kest_expression_to_string(coefs->entries[i]));
569 }
570
571 return NO_ERROR;
572}
573
575{
576 if (!dict || !res)
577 return ERR_NULL_PTR;
578
579 kest_filter *filter = kest_filter_create(NULL);
580
581 if (!filter)
582 return ERR_ALLOC_FAIL;
583
584 res->data = (void*)filter;
585
586 int ret_val = kest_extract_filter_coefs_from_dict(ps, dict_node, dict, res);
587
588 if (ret_val != NO_ERROR)
589 return ret_val;
590
591 kest_expression *expr;
592
593 ret_val = kest_dictionary_lookup_expr(dict, "feed_back", &expr);
594
595 if (ret_val == NO_ERROR)
596 {
597 filter->feed_back = (int)(roundf(kest_expression_evaluate(expr, NULL)));
598
599 if (filter->feed_back < 0)
600 {
601 kest_parser_error_at_node(ps, dict_node, "Filter \"%s\" has negative feed-back degree %d, which doesn't make sense.",
602 res->name, filter->feed_back);
603 return ERR_BAD_ARGS;
604 }
605 if (filter->feed_back > filter->coefs.count)
606 {
607 kest_parser_error_at_node(ps, dict_node, "Filter \"%s\" has feed-back degree %d, which is higher than its coefficient count %d!",
608 res->name, filter->feed_back, filter->coefs.count);
609 return ERR_BAD_ARGS;
610 }
611
612 filter->feed_forward = filter->coefs.count - filter->feed_back;
613 }
614 else
615 {
616 filter->feed_back = 0;
617 filter->feed_forward = filter->coefs.count;
618 }
619
620 KEST_PRINTF("Extracted (%d, %d) filter \"%s\", with coefficients\n", filter->feed_forward, filter->feed_back, res->name);
621
622 kest_expression_ptr_list *coefs = &filter->coefs;
623
624 for (int i = 0; i < coefs->count; i++)
625 {
626 KEST_PRINTF("\t%s\n", kest_expression_to_string(coefs->entries[i]));
627 }
628
629 return NO_ERROR;
630}
631
633{
634 if (!dict)
635 return NULL;
636
637 int ret_val;
638 float delay_len;
639 char *type_str = NULL;
641
642 if (!res) return NULL;
643
645
646 res->name = kest_strndup(dict->name, 128);
647
648 if (!res->name)
649 goto resource_extract_abort;
650
651 ret_val = kest_dictionary_lookup_str(dict, "type", (void*)&type_str);
652
653 if (ret_val != NO_ERROR || !type_str)
654 {
655 kest_parser_error_at_node(ps, dict_node, "Could not find attribute \"type\" for resource \"%s\"", dict->name);
656 goto resource_extract_abort;
657 }
658
659 res->type = string_to_resource_type(type_str);
660
662 {
663 kest_parser_error_at_node(ps, dict_node, "Resource type \"%s\" unrecognised", type_str);
664 goto resource_extract_abort;
665 }
666 else if (res->type == KEST_DSP_RESOURCE_DELAY)
667 {
668 kest_extract_delay_buffer_from_dict(ps, dict_node, dict, res);
669 }
670 else if (res->type == KEST_DSP_RESOURCE_MEM)
671 {
672 kest_extract_mem_from_dict(ps, dict_node, dict, res);
673 }
674 else if (res->type == KEST_DSP_RESOURCE_FILTER)
675 {
676 if (strcmp(type_str, "biquad") == 0)
677 kest_extract_biquad_from_dict(ps, dict_node, dict, res);
678 else
679 kest_extract_filter_from_dict(ps, dict_node, dict, res);
680 }
681
682 return res;
683
684resource_extract_abort:
685 if (res)
686 {
687 if (res->name)
688 kest_free(res->name);
689
690 kest_free(res);
691 }
692
693 return NULL;
694}
695
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
char * kest_strndup(const char *str, size_t n)
Definition kest_alloc.c:73
kest_setting * kest_extract_setting_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict)
int kest_extract_delay_buffer_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_dsp_resource *res)
int kest_extract_filter_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_dsp_resource *res)
int kest_extract_int_setting_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_setting *setting)
kest_parameter * kest_extract_parameter_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict)
int kest_extract_biquad_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_dsp_resource *res)
int kest_extract_mem_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_dsp_resource *res)
int kest_extract_filter_coefs_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_dsp_resource *res)
kest_dsp_resource * kest_extract_resource_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict)
int kest_extract_bool_setting_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_setting *setting)
int kest_extract_enum_setting_from_dict(kest_eff_parsing_state *ps, kest_ast_node *dict_node, kest_dictionary *dict, kest_setting *setting)
int kest_dictionary_lookup_list(kest_dictionary *dict, const char *name, kest_dictionary_entry_list **result)
kest_string * kest_dict_entry_to_string(kest_dictionary_entry *entry)
int kest_dictionary_lookup_str(kest_dictionary *dict, const char *name, const char **result)
int kest_dictionary_lookup_expr(kest_dictionary *dict, const char *name, kest_expression **result)
const char * kest_dict_entry_type_to_string_nice(int type)
#define DICT_ENTRY_TYPE_EXPR
void kest_parser_warn_at_node(kest_eff_parsing_state *ps, kest_ast_node *node, const char *msg,...)
void kest_parser_error_at_node(kest_eff_parsing_state *ps, kest_ast_node *node, const char *msg,...)
#define ERR_ALLOC_FAIL
#define ERR_BAD_ARGS
#define NO_ERROR
#define ERR_NULL_PTR
int kest_expression_is_constant(kest_expression *expr)
char * kest_expression_type_to_str(int type)
const char * kest_expression_to_string(kest_expression *expr)
float kest_expression_evaluate(kest_expression *expr, kest_expr_scope *scope)
int init_parameter_str(kest_parameter *param)
void gut_setting(kest_setting *setting)
int init_setting_str(kest_setting *setting)
void gut_parameter(kest_parameter *param)
#define PARAMETER_SCALE_LINEAR
#define PARAMETER_SCALE_LOGARITHMIC
#define TRANSFORMER_SETTING_BOOL
#define TRANSFORMER_SETTING_ENUM
#define TRANSFORMER_SETTING_PAGE_SETTINGS
#define TRANSFORMER_SETTING_PAGE_MAIN
#define TRANSFORMER_SETTING_INT
#define SETTING_WIDGET_DROPDOWN
#define PARAM_WIDGET_VIRTUAL_POT
#define SETTING_WIDGET_FIELD
#define PARAM_WIDGET_VSLIDER_TALL
#define PARAM_WIDGET_VSLIDER
#define PARAM_WIDGET_HSLIDER
#define SETTING_WIDGET_SWITCH
#define KEST_PRINTF(...)
Definition kest_printf.h:10
int kest_init_dsp_resource(kest_dsp_resource *res)
kest_filter * kest_filter_create(kest_allocator *alloc)
int string_to_resource_type(const char *type_str)
#define KEST_DSP_RESOURCE_MEM
#define KEST_DSP_RESOURCE_FILTER
#define KEST_DSP_RESOURCE_NOTHING
#define KEST_DSP_RESOURCE_DELAY
char * kest_string_to_native(kest_string *string)
int kest_string_destroy(kest_string *string)
Definition kest_string.c:97
char_list kest_string
Definition kest_string.h:6
const char * name
struct kest_expression * size
struct kest_expression * delay
struct kest_expression_ptr_list coefs
struct kest_expression * min_expr
const char * name_internal
const char * name
struct kest_expression * max_expr
const char * units
const char * units
const char * name_internal
const char * name