/* Fix 1 to n problem Bob Larkin June 2020 * Adapted to Chip Audette's Tympan routine. Allows random channels. * Class name does not have "_OA" to be backward compatible. * * MIT License. use at your own risk. */ #include "AudioMixer_F32.h" void AudioMixer4_F32::update(void) { audio_block_f32_t *in, *out=NULL; int channel = 0; //get the first available channel while (channel < 4) { out = receiveWritable_f32(channel); if (out) break; channel++; } if (!out) return; //there was no data output array available, so exit. arm_scale_f32(out->data, multiplier[channel], out->data, out->length); //add in the remaining channels, as available channel++; while (channel < 4) { in = receiveReadOnly_f32(channel); if (in) { audio_block_f32_t *tmp = allocate_f32(); arm_scale_f32(in->data, multiplier[channel], tmp->data, tmp->length); arm_add_f32(out->data, tmp->data, out->data, tmp->length); AudioStream_F32::release(tmp); AudioStream_F32::release(in); } else { //do nothing, this vector is empty } channel++; } AudioStream_F32::transmit(out); AudioStream_F32::release(out); } void AudioMixer8_F32::update(void) { audio_block_f32_t *in, *out=NULL; //get the first available channel int channel = 0; while (channel < 8) { out = receiveWritable_f32(channel); if (out) break; channel++; } if (!out) return; //there was no data output array. so exit. arm_scale_f32(out->data, multiplier[channel], out->data, out->length); //add in the remaining channels, as available channel++; while (channel < 8) { in = receiveReadOnly_f32(channel); if (in) { audio_block_f32_t *tmp = allocate_f32(); arm_scale_f32(in->data, multiplier[channel], tmp->data, tmp->length); arm_add_f32(out->data, tmp->data, out->data, tmp->length); AudioStream_F32::release(tmp); AudioStream_F32::release(in); } else { //do nothing, this vector is empty } channel++; } AudioStream_F32::transmit(out); AudioStream_F32::release(out); }