|
|
|
/* 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);
|
|
|
|
}
|