ERIS CORE
eris_mixer_ext.cpp
Go to the documentation of this file.
1 #include "eris_mixer_ext.h"
2 #include <dspinst.h>
3 
4 
5 
6 static void applyGain2(int16_t *data, int32_t mult)
7 {
8  uint32_t *p = (uint32_t *)data;
9  const uint32_t *end = (uint32_t *)(data + AUDIO_BLOCK_SAMPLES);
10 
11  do {
12  uint32_t tmp32 = *p; // read 2 samples from *data
13  int32_t val1 = signed_multiply_32x16b(mult, tmp32);
14  int32_t val2 = signed_multiply_32x16t(mult, tmp32);
15  val1 = signed_saturate_rshift(val1, 16, 0);
16  val2 = signed_saturate_rshift(val2, 16, 0);
17  *p++ = pack_16b_16b(val2, val1);
18  } while (p < end);
19 }
20 
21 static void applyGainThenAdd2(int16_t *data, const int16_t *in, int32_t mult)
22 {
23  uint32_t *dst = (uint32_t *)data;
24  const uint32_t *src = (uint32_t *)in;
25  const uint32_t *end = (uint32_t *)(data + AUDIO_BLOCK_SAMPLES);
26 
27  if (mult == 65536) {
28  do {
29  uint32_t tmp32 = *dst;
30  *dst++ = signed_add_16_and_16(tmp32, *src++);
31  tmp32 = *dst;
32  *dst++ = signed_add_16_and_16(tmp32, *src++);
33  } while (dst < end);
34  } else {
35  do {
36  uint32_t tmp32 = *src++; // read 2 samples from *data
37  int32_t val1 = signed_multiply_32x16b(mult, tmp32);
38  int32_t val2 = signed_multiply_32x16t(mult, tmp32);
39  val1 = signed_saturate_rshift(val1, 16, 0);
40  val2 = signed_saturate_rshift(val2, 16, 0);
41  tmp32 = pack_16b_16b(val2, val1);
42  uint32_t tmp32b = *dst;
43  *dst++ = signed_add_16_and_16(tmp32, tmp32b);
44  } while (dst < end);
45  }
46 }
47 
48 
50 {
51  audio_block_t *in, *out=NULL;
52  unsigned int channel;
53 
54  for (channel=0; channel < 8; channel++) {
55  if (!out) {
56  out = receiveWritable(channel);
57  if (out) {
58  int32_t mult = multiplier[channel];
59  if (mult != 65536) applyGain2(out->data, mult);
60  }
61  } else {
62  in = receiveReadOnly(channel);
63  if (in) {
64  applyGainThenAdd2(out->data, in->data, multiplier[channel]);
65  release(in);
66  }
67  }
68  }
69  if (out) {
70  transmit(out);
71  release(out);
72  }
73 }
74 
const char PROGMEM p[][16]
Definition: Eris.h:247
int32_t multiplier[8]
virtual void update(void)
static void release(audio_block_t *block)
audio_block_t * receiveReadOnly(unsigned int index=0)
void transmit(audio_block_t *block, unsigned char index=0)
audio_block_t * receiveWritable(unsigned int index=0)
static void applyGainThenAdd2(int16_t *data, const int16_t *in, int32_t mult)
static void applyGain2(int16_t *data, int32_t mult)
int16_t data[AUDIO_BLOCK_SAMPLES]
Definition: AudioStream.h:78