Kestrel Interface
Loading...
Searching...
No Matches
kest_transformer.c
Go to the documentation of this file.
1#include "kest_int.h"
2
3#ifndef PRINTLINES_ALLOWED
4#define PRINTLINES_ALLOWED 0
5#endif
6
7#define INITIAL_PARAMETER_ARRAY_LENGTH 8
8#define PARAMETER_ARRAY_CHUNK_SIZE 8
9
10#define INITIAL_OPTION_ARRAY_LENGTH 8
11#define OPTION_ARRAY_CHUNK_SIZE 8
12
13static const char *FNAME = "kest_effect.c";
14
16
17const char *kest_effect_name(kest_effect *effect)
18{
19 if (!effect)
20 return "(NULL)";
21
22 if (!effect->eff)
23 return "(Unknown)";
24
25 return effect->eff->name;
26}
27
28
30{
31 if (!effect)
32 return ERR_NULL_PTR;
33
34 effect->id = 0;
35 effect->type = 0;
36
37 effect->position = 0;
38
39 effect->parameters = NULL;
40 effect->settings = NULL;
41 effect->scope = NULL;
42
43 #ifdef KEST_ENABLE_UI
44 effect->view_page = NULL;
45 #endif
46 effect->profile = NULL;
47
48 init_parameter(&effect->wet_mix, "Wet Mix", 1.0, 0.0, 1.0);
52
55
56 effect->band_mode.n_options = 4;
58
59 if (!effect->band_mode.options)
60 return ERR_ALLOC_FAIL;
61
63 effect->band_mode.options[0].name = "All freq";
64
66 effect->band_mode.options[1].name = "Freq > cutoff";
67
69 effect->band_mode.options[2].name = "Freq < cutoff";
70
72 effect->band_mode.options[3].name = "Freq in band";
73
74 init_parameter(&effect->band_lp_cutoff, "Cutoff", 4000.0, 1, 4000);
79
80 init_parameter(&effect->band_hp_cutoff, "Cutoff", 1.0, 1, 4000);
85
86 effect->eff = NULL;
87
88 #ifdef KEST_USE_FREERTOS
89 effect->mutex = xSemaphoreCreateMutex();
90 #endif
91
92 #ifdef KEST_ENABLE_REPRESENTATIONS
93 effect->reps = NULL;
94 effect->profile_rep.representer = NULL;
95 effect->profile_rep.representee = effect;
96 effect->profile_rep.update = kest_effect_profile_rep_update;
97 kest_representation_pll_safe_append(&effect->reps, &effect->profile_rep);
98 #endif
99
100 return NO_ERROR;
101}
102
104{
105 init_effect(effect);
106 effect->eff = eff;
107
108 kest_parameter_pll *current_param = eff->parameters;
109 kest_setting_pll *current_setting = eff->settings;
110
111 while (current_param)
112 {
113 kest_parameter_pll_safe_append(&effect->parameters, kest_parameter_make_clone_for_effect(current_param->data, effect));
114 current_param = current_param->next;
115 }
116
117 kest_setting *setting;
118
119 while (current_setting)
120 {
121 kest_setting_pll_safe_append(&effect->settings, kest_setting_make_clone_for_effect(current_setting->data, effect));
122 current_setting = current_setting->next;
123 }
124
125 effect->scope = kest_effect_create_scope(effect);
126
127 return NO_ERROR;
128}
129
131{
132 if (!effect)
133 return ERR_NULL_PTR;
134
135 kest_parameter_pll *current_param = effect->parameters;
136
137 while (current_param)
138 {
139 if (current_param->data)
140 {
141 if (effect->profile)
142 current_param->data->id.profile_id = effect->profile->id;
143 current_param->data->id.effect_id = effect->id;
144 }
145
146 current_param = current_param->next;
147 }
148
149 setting_ll *current_setting = effect->settings;
150
151 while (current_setting)
152 {
153 if (current_setting->data)
154 {
155 if (effect->profile)
156 current_setting->data->id.profile_id = effect->profile->id;
157 current_setting->data->id.effect_id = effect->id;
158 }
159
160 current_setting = current_setting->next;
161 }
162
163 if (effect->profile)
164 effect->band_mode.id.profile_id = effect->profile->id;
165 effect->band_mode.id.effect_id = effect->id;
166
167 if (effect->profile)
168 effect->band_lp_cutoff.id.profile_id = effect->profile->id;
169 effect->band_lp_cutoff.id.effect_id = effect->id;
170
171 if (effect->profile)
172 effect->band_hp_cutoff.id.profile_id = effect->profile->id;
173 effect->band_hp_cutoff.id.effect_id = effect->id;
174
175 return NO_ERROR;
176}
177
178int effect_set_id(kest_effect *effect, uint16_t profile_id, uint16_t effect_id)
179{
180 if (!effect)
181 return ERR_NULL_PTR;
182
183 effect->id = effect_id;
184
186
187 return NO_ERROR;
188}
189
190int request_append_effect(uint16_t type, kest_effect *local)
191{
192 #ifdef USE_TEENSY
193 if (!local)
194 return ERR_NULL_PTR;
195
196 if (!local->profile)
197 return ERR_BAD_ARGS;
198
199 kest_message msg = create_m_message(KEST_MESSAGE_APPEND_TRANSFORMER, "ss", local->profile->id, local->type);
200 msg.callback = effect_receive_id;
201 msg.cb_arg = local;
202
203 return queue_msg_to_teensy(msg);
204 #endif
205
206 return NO_ERROR;
207}
208
209#ifdef USE_TEENSY
210void effect_receive_id(kest_message message, kest_response response)
211{
212 KEST_PRINTF("Transformer receive ID!\n");
213 kest_effect *effect = message.cb_arg;
214
215 if (!effect)
216 return;
217
218 uint16_t pid, tid;
219
220 memcpy(&pid, &response.data[0], sizeof(uint16_t));
221 memcpy(&tid, &response.data[2], sizeof(uint16_t));
222
223 if (!effect->profile || pid != effect->profile->id)
224 {
225 KEST_PRINTF("Transformer ID for effect in profile %d sent to effect in %d\n", pid, effect->profile->id);
226 }
227 else
228 {
229 KEST_PRINTF("Transformer %p obtains id %d.%d\n", effect, pid, tid);
230 effect->id = tid;
231
233 }
234}
235#endif
236
238{
239 if (!effect)
240 return NULL;
241
242 int ret_val;
243
244 kest_parameter *param = kest_alloc(sizeof(kest_parameter));
245
246 if (!param)
247 return NULL;
248
249 init_parameter_str(param);
250
251 kest_parameter_pll *nl = kest_parameter_pll_append(effect->parameters, param);
252
253 if (!nl)
254 {
255 kest_free(param);
256 return NULL;
257 }
258
259 effect->parameters = nl;
260
261 return param;
262}
263
265{
266 if (!effect)
267 return NULL;
268
269 int ret_val;
270
271 kest_setting *setting = kest_alloc(sizeof(kest_setting));
272
273 if (!setting)
274 return NULL;
275
276 init_setting_str(setting);
277
278 setting_ll *nl = kest_setting_pll_append(effect->settings, setting);
279
280 if (!nl)
281 {
282 kest_free(setting);
283 return NULL;
284 }
285
286 effect->settings = nl;
287
288 return setting;
289}
290
291#ifdef KEST_ENABLE_UI
292
294{
295 KEST_PRINTF("effect_init_ui_page. effect = %p, parent = %p\n", effect, parent);
296 if (!effect)
297 return ERR_NULL_PTR;
298
299 effect->view_page = kest_alloc(sizeof(kest_ui_page));
300
301 if (!effect->view_page)
302 return ERR_ALLOC_FAIL;
303
304 init_ui_page(effect->view_page);
305 init_effect_view(effect->view_page);
306 configure_effect_view(effect->view_page, effect);
307 effect->view_page->parent = parent;
308
309 return NO_ERROR;
310}
311/*
312int kest_effect_init_view_page(kest_effect *effect)
313{
314 KEST_PRINTF("kest_effect_init_view_page(effect = %p)\n", effect);
315
316 if (!effect)
317 return ERR_NULL_PTR;
318
319 effect->view_page = kest_alloc(sizeof(kest_ui_page));
320
321 if (!effect->view_page)
322 return ERR_ALLOC_FAIL;
323
324 int ret_val = NO_ERROR;
325
326 if ((ret_val = init_ui_page(effect->view_page)) != NO_ERROR) return ret_val;
327 if ((ret_val = init_effect_view(effect->view_page)) != NO_ERROR) return ret_val;
328 if ((ret_val = configure_effect_view(effect->view_page, effect)) != NO_ERROR) return ret_val;
329
330 kest_profile *profile = effect->profile;
331
332 KEST_PRINTF("effect->profile = %p\n", effect->profile);
333
334 if (profile)
335 {
336 KEST_PRINTF("effect->profile->view_page = %p\n", effect->profile->view_page);
337 effect->view_page->parent = profile->view_page;
338 }
339
340 KEST_PRINTF("kest_effect_init_view_page done\n");
341 return NO_ERROR;
342}*/
343#endif
344
346{
347 if (!src || !dest)
348 return ERR_NULL_PTR;
349
350 uint16_t profile_id;
351 uint16_t effect_id;
352
353 init_effect(dest);
354
355 dest->type = src->type;
356 dest->position = src->position;
357
358 kest_parameter_pll *current_param = src->parameters;
359 kest_parameter *param;
360
361 while (current_param)
362 {
363 if(current_param->data)
364 {
365 param = effect_add_parameter(dest);
366
367 if (param)
368 {
369 memcpy(param, current_param->data, sizeof(kest_parameter));
370 }
371 else
372 {
373 return ERR_ALLOC_FAIL;
374 }
375 }
376
377 current_param = current_param->next;
378 }
379
380 setting_ll *current_setting = src->settings;
381 kest_setting *setting;
382
383 while (current_setting)
384 {
385 if(current_setting->data)
386 {
387 setting = effect_add_setting(dest);
388
389 if (setting)
390 {
391 clone_setting(setting, current_setting->data);
392 }
393 else
394 {
395 return ERR_ALLOC_FAIL;
396 }
397 }
398
399 current_setting = current_setting->next;
400 }
401
402 #ifdef KEST_ENABLE_UI
403 src->view_page = NULL;
404 #endif
405
406 return NO_ERROR;
407}
408
409
411{
412 if (!effect)
413 return;
414
415 kest_parameter_pll_free(effect->parameters);
416 kest_setting_pll_destroy(effect->settings, gut_setting);
417 effect->parameters = NULL;
418 effect->settings = NULL;
419
420 gut_setting(&effect->band_mode);
421
422 #ifdef KEST_ENABLE_UI
423 free_effect_view(effect->view_page);
424 effect->view_page = NULL;
425 #endif
426
427 effect->id = 0;
428 effect->type = 0;
429 effect->position = 0;
430}
431
432
434{
435 if (!effect)
436 return;
437
438 kest_parameter_pll_destroy(effect->parameters, kest_parameter_free);
439 kest_setting_pll_destroy(effect->settings, kest_setting_free);
440
441 #ifdef KEST_ENABLE_UI
442 free_effect_view(effect->view_page);
443 #endif
444
445 kest_free(effect);
446}
447
449{
450 if (!effect)
451 return NULL;
452
453 kest_parameter_pll *current = effect->parameters;
454 int i = 0;
455
456 while (current && i < n)
457 {
458 current = current->next;
459 i++;
460 }
461
462 return current ? current->data : NULL;
463}
464
465
467{
468 if (!effect)
469 return NULL;
470
471 setting_ll *current = effect->settings;
472 int i = 0;
473
474 while (current && i < n)
475 {
476 current = current->next;
477 i++;
478 }
479
480 return current ? current->data : NULL;
481}
482
484{
485 #ifdef KEST_ENABLE_FPGA
486
487 if (!effect)
488 return ERR_NULL_PTR;
489
490 if (!effect->eff)
491 return ERR_BAD_ARGS;
492
494
495 if (!batch.buf)
496 return ERR_ALLOC_FAIL;
497
499
500 int ret_val = kest_fpga_queue_transfer_batch(batch);
501
502 return ret_val;
503 #else
505 #endif
506}
507
508
510{
511 if (!effect)
512 return NULL;
513
515
516 if (!scope)
517 return NULL;
518
519 kest_parameter_pll *current_param = effect->parameters;
520 kest_setting_pll *current_setting = effect->settings;
521 kest_named_expression_pll *current_def_expr = effect->eff ? effect->eff->def_exprs : NULL;
522
523 while (current_param)
524 {
525 if (current_param->data)
526 kest_expr_scope_add_param(scope, current_param->data);
527
528 current_param = current_param->next;
529 }
530
531 while (current_setting)
532 {
533 if (current_setting->data)
534 kest_expr_scope_add_setting(scope, current_setting->data);
535
536 current_setting = current_setting->next;
537 }
538
539
540 while (current_def_expr)
541 {
542 if (current_def_expr->data)
543 kest_expr_scope_add_expr(scope, current_def_expr->data->name, current_def_expr->data->expr);
544
545 current_def_expr = current_def_expr->next;
546 }
547
548 return scope;
549}
550
551int kest_effect_set_parameter(kest_effect *effect, const char *name, float value)
552{
553 if (!effect)
554 return ERR_NULL_PTR;
555
556 int ret_val;
557
558 kest_parameter_pll *current = effect->parameters;
559
560 while (current)
561 {
562 if (current && current->data && current->data->name_internal && (strcmp(current->data->name_internal, name) == 0))
563 {
564 current->data->value = value;
565 return NO_ERROR;
566 }
567
568 current = current->next;
569 }
570
571 return ERR_BAD_ARGS;
572}
573
574int kest_effect_set_setting(kest_effect *effect, const char *name, int value)
575{
576 if (!effect)
577 return ERR_NULL_PTR;
578
579 int ret_val;
580
581 kest_setting_pll *current = effect->settings;
582
583 while (current)
584 {
585 if (current && current->data && current->data->name_internal && (strcmp(current->data->name_internal, name) == 0))
586 {
587 current->data->value = value;
588 return NO_ERROR;
589 }
590
591 current = current->next;
592 }
593
594 return ERR_BAD_ARGS;
595}
596
597
598void kest_effect_profile_rep_update(void *representer, void *representee)
599{
600 #ifdef KEST_ENABLE_REPRESENTATIONS
601 kest_profile *profile = representer;
602 kest_effect *effect = representee;
603
604 if (!representer || !representee)
605 return;
606
607 save_profile(profile);
608 #endif
609
610 return;
611}
612
614{
615 #ifdef KEST_ENABLE_REPRESENTATIONS
616 if (!effect)
617 return ERR_NULL_PTR;
618
620 #endif
621
622 return NO_ERROR;
623}
void kest_free(void *ptr)
Definition kest_alloc.c:32
void * kest_alloc(size_t size)
Definition kest_alloc.c:11
void kest_effect_profile_rep_update(void *representer, void *representee)
int kest_effect_init_view_page(kest_effect *effect, struct kest_ui_page *parent)
#define TRANSFORMER_MODE_UPPER_SPECTRUM
Definition kest_effect.h:5
#define TRANSFORMER_BAND_LP_CUTOFF_PID
Definition kest_effect.h:11
#define TRANSFORMER_WET_MIX_PID
Definition kest_effect.h:9
#define TRANSFORMER_MODE_FULL_SPECTRUM
Definition kest_effect.h:4
#define TRANSFORMER_BAND_MODE_SID
Definition kest_effect.h:13
#define TRANSFORMER_MODE_BAND
Definition kest_effect.h:7
#define TRANSFORMER_MODE_LOWER_SPECTRUM
Definition kest_effect.h:6
#define TRANSFORMER_BAND_HP_CUTOFF_PID
Definition kest_effect.h:12
int init_effect_view(kest_ui_page *page)
int free_effect_view(kest_ui_page *page)
int configure_effect_view(kest_ui_page *page, void *data)
#define ERR_ALLOC_FAIL
#define ERR_BAD_ARGS
#define NO_ERROR
#define ERR_FEATURE_DISABLED
#define ERR_NULL_PTR
int kest_expr_scope_add_param(kest_expr_scope *scope, kest_parameter *param)
kest_expr_scope * kest_new_expr_scope()
int kest_expr_scope_add_setting(kest_expr_scope *scope, kest_setting *setting)
int kest_expr_scope_add_expr(kest_expr_scope *scope, const char *name, struct kest_expression *expr)
kest_expression kest_expression_zero
kest_expression kest_expression_freq_max
kest_expression kest_expression_one
int save_profile(kest_profile *profile)
Definition kest_files.c:883
int kest_fpga_queue_transfer_batch(kest_fpga_transfer_batch batch)
int kest_fpga_transfer_batch_append_effect_register_updates(kest_fpga_transfer_batch *batch, kest_effect_desc *eff, kest_expr_scope *scope, int pos)
kest_fpga_transfer_batch kest_new_fpga_transfer_batch()
#define IMPLEMENT_LINKED_PTR_LIST(X)
int clone_setting(kest_setting *dest, kest_setting *src)
int init_parameter(kest_parameter *param, const char *name, float level, float min, float max)
int init_parameter_str(kest_parameter *param)
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)
kest_setting * kest_setting_make_clone_for_effect(kest_setting *src, kest_effect *effect)
kest_parameter * kest_parameter_make_clone_for_effect(kest_parameter *src, kest_effect *effect)
kest_setting_pll setting_ll
#define PARAMETER_SCALE_LOGARITHMIC
#define KEST_PRINTF(...)
Definition kest_printf.h:10
int queue_representation_list_update(kest_representation_pll *reps)
void free_effect(kest_effect *effect)
int effect_rectify_param_ids(kest_effect *effect)
int kest_effect_set_parameter(kest_effect *effect, const char *name, float value)
int init_effect(kest_effect *effect)
void gut_effect(kest_effect *effect)
int init_effect_from_effect_desc(kest_effect *effect, kest_effect_desc *eff)
kest_parameter * effect_add_parameter(kest_effect *effect)
const char * kest_effect_name(kest_effect *effect)
int clone_effect(kest_effect *dest, kest_effect *src)
int kest_effect_set_setting(kest_effect *effect, const char *name, int value)
int request_append_effect(uint16_t type, kest_effect *local)
int kest_effect_update_fpga_registers(kest_effect *effect)
void kest_effect_profile_rep_update(void *representer, void *representee)
kest_setting * effect_add_setting(kest_effect *effect)
kest_setting * effect_get_setting(kest_effect *effect, int n)
kest_expr_scope * kest_effect_create_scope(kest_effect *effect)
int effect_set_id(kest_effect *effect, uint16_t profile_id, uint16_t effect_id)
kest_parameter * effect_get_parameter(kest_effect *effect, int n)
int kest_effect_update_reps(kest_effect *effect)
int init_ui_page(kest_ui_page *page)
Definition kest_ui.c:152
kest_parameter_pll * parameters
kest_setting_pll * settings
const char * name
kest_named_expression_pll * def_exprs
kest_setting band_mode
Definition kest_effect.h:25
kest_expr_scope * scope
Definition kest_effect.h:44
kest_setting_pll * settings
Definition kest_effect.h:35
uint16_t id
Definition kest_effect.h:21
kest_parameter band_lp_cutoff
Definition kest_effect.h:26
kest_parameter band_hp_cutoff
Definition kest_effect.h:27
kest_parameter wet_mix
Definition kest_effect.h:23
int block_position
Definition kest_effect.h:32
kest_effect_desc * eff
Definition kest_effect.h:43
struct kest_profile * profile
Definition kest_effect.h:37
kest_parameter_pll * parameters
Definition kest_effect.h:34
uint16_t type
Definition kest_effect.h:20
struct kest_expression * min_expr
struct kest_expression * max_expr
kest_parameter_id id
uint16_t id
kest_setting_option * options
kest_setting_id id