Mercurial > hg > beaglert
comparison projects/heavy/envelopeTrigger/ControlSlice.c @ 162:c3e8226a5651 heavy-updated
- added additional flags to C rules (-DNDEBUG, -mfpu=neon)
- sample-accurate envelope triggering pd/heavy example
author | chnrx <chris.heinrichs@gmail.com> |
---|---|
date | Thu, 12 Nov 2015 14:59:46 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
161:07735c9d95c8 | 162:c3e8226a5651 |
---|---|
1 /** | |
2 * Copyright (c) 2014, 2015, Enzien Audio Ltd. | |
3 * | |
4 * Permission to use, copy, modify, and/or distribute this software for any | |
5 * purpose with or without fee is hereby granted, provided that the above | |
6 * copyright notice and this permission notice appear in all copies. | |
7 * | |
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | |
9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | |
10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | |
11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | |
12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR | |
13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | |
14 * PERFORMANCE OF THIS SOFTWARE. | |
15 */ | |
16 | |
17 #include "ControlSlice.h" | |
18 | |
19 hv_size_t cSlice_init(ControlSlice *o, int i, int n) { | |
20 o->i = i; | |
21 o->n = n; | |
22 return 0; | |
23 } | |
24 | |
25 void cSlice_onMessage(HvBase *_c, ControlSlice *o, int letIn, const HvMessage *const m, | |
26 void (*sendMessage)(HvBase *, int, const HvMessage *const)) { | |
27 switch (letIn) { | |
28 case 0: { | |
29 // if the start point is greater than the number of elements in the source message, do nothing | |
30 if (o->i < msg_getNumElements(m)) { | |
31 int x = msg_getNumElements(m) - o->i; // number of elements in the new message | |
32 if (o->n > 0) x = hv_min_i(x, o->n); | |
33 HvMessage *n = HV_MESSAGE_ON_STACK(x); | |
34 msg_init(n, x, msg_getTimestamp(m)); | |
35 hv_memcpy(&n->elem, &m->elem+o->i, x*sizeof(Element)); | |
36 sendMessage(_c, 0, n); | |
37 } else { | |
38 // if nothing can be sliced, send a bang out of the right outlet | |
39 HvMessage *n = HV_MESSAGE_ON_STACK(1); | |
40 msg_initWithBang(n, msg_getTimestamp(m)); | |
41 sendMessage(_c, 1, n); | |
42 } | |
43 break; | |
44 } | |
45 case 1: { | |
46 if (msg_isFloat(m,0)) { | |
47 o->i = (int) msg_getFloat(m,0); | |
48 if (msg_isFloat(m,1)) { | |
49 o->n = (int) msg_getFloat(m,1); | |
50 } | |
51 } | |
52 break; | |
53 } | |
54 case 2: { | |
55 if (msg_isFloat(m,0)) { | |
56 o->n = (int) msg_getFloat(m,0); | |
57 } | |
58 break; | |
59 } | |
60 default: break; | |
61 } | |
62 } |