You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
hexefx_audiolib_F32/src/effect_xfaderStereo_F32.h

121 lines
4.5 KiB

/**
* @file effect_xfaderStereo_F32.h
* @author Piotr Zapart
* @brief constant power crossfader for two stereo signals
* @version 0.1
* @date 2024-03-21
*
* @copyright Copyright (c) 2024
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with this program.
* If not, see <https://www.gnu.org/licenses/>."
*/
#ifndef _EFFECT_XFADERSTEREO_F32_H_
#define _EFFECT_XFADERSTEREO_F32_H_
#include <arm_math.h>
#include <AudioStream_F32.h>
#include "basic_components.h"
class AudioEffectXfaderStereo_F32 : public AudioStream_F32
{
public:
AudioEffectXfaderStereo_F32(void) : AudioStream_F32(4, inputQueueArray_f32){};
AudioEffectXfaderStereo_F32(const AudioSettings_F32 &settings) : AudioStream_F32(2, inputQueueArray_f32){};
void mix(float32_t m)
{
float32_t gA, gB;
m = constrain(m, 0.0f, 1.0f);
mix_pwr(m, &gB, &gA);
__disable_irq()
gainA = gA;
gainB = gB;
__enable_irq();
}
void update()
{
audio_block_f32_t *blockLa, *blockRa, *blockLb, *blockRb;
audio_block_f32_t *blockOutLa, *blockOutRa,*blockOutLb, *blockOutRb, *blockZero;
blockZero = AudioStream_F32::allocate_f32();
if(!blockZero) return;
memset(&blockZero->data[0], 0, blockZero->length*sizeof(float32_t));
blockLa = AudioStream_F32::receiveReadOnly_f32(0);
blockRa = AudioStream_F32::receiveReadOnly_f32(1);
blockLb = AudioStream_F32::receiveReadOnly_f32(2);
blockRb = AudioStream_F32::receiveReadOnly_f32(3);
if (!blockLa) blockLa = blockZero;
if (!blockLb) blockLb = blockZero;
if (!blockRa) blockRa = blockZero;
if (!blockRb) blockRb = blockZero;
// max A, B mited
if (gainA == 1.0f)
{
AudioStream_F32::transmit(blockLa, 0);
AudioStream_F32::transmit(blockRa, 1);
if (blockLa != blockZero) AudioStream_F32::release(blockLa);
if (blockRa != blockZero) AudioStream_F32::release(blockRa);
if (blockLb != blockZero) AudioStream_F32::release(blockLb);
if (blockRb != blockZero) AudioStream_F32::release(blockRb);
AudioStream_F32::release(blockZero);
return;
}
if (gainB == 1.0f)
{
AudioStream_F32::transmit(blockLb, 0);
AudioStream_F32::transmit(blockRb, 1);
if (blockLa != blockZero) AudioStream_F32::release(blockLa);
if (blockRa != blockZero) AudioStream_F32::release(blockRa);
if (blockLb != blockZero) AudioStream_F32::release(blockLb);
if (blockRb != blockZero) AudioStream_F32::release(blockRb);
AudioStream_F32::release(blockZero);
return;
}
blockOutLa = AudioStream_F32::allocate_f32();
blockOutRa = AudioStream_F32::allocate_f32();
blockOutLb = AudioStream_F32::allocate_f32();
blockOutRb = AudioStream_F32::allocate_f32();
if (!blockOutLa || !blockOutRa || !blockOutLa || !blockOutRa)
{
if (blockOutLa) AudioStream_F32::release(blockOutLa);
if (blockOutRa) AudioStream_F32::release(blockOutRa);
if (blockOutLb) AudioStream_F32::release(blockOutLb);
if (blockOutRb) AudioStream_F32::release(blockOutRb);
return;
}
arm_scale_f32(blockLa->data, gainA, blockOutLa->data, blockOutLa->length);
arm_scale_f32(blockRa->data, gainA, blockOutRa->data, blockOutRa->length);
arm_scale_f32(blockLb->data, gainB, blockOutLb->data, blockOutLb->length);
arm_scale_f32(blockRb->data, gainB, blockOutRb->data, blockOutRb->length);
arm_add_f32(blockOutLa->data, blockOutLb->data, blockOutLa->data, blockOutLa->length);
arm_add_f32(blockOutRa->data, blockOutRb->data, blockOutRa->data, blockOutRa->length);
AudioStream_F32::transmit(blockOutLa, 0);
AudioStream_F32::transmit(blockOutRa, 1);
if (blockLa != blockZero) AudioStream_F32::release(blockLa);
if (blockRa != blockZero) AudioStream_F32::release(blockRa);
if (blockLb != blockZero) AudioStream_F32::release(blockLb);
if (blockRb != blockZero) AudioStream_F32::release(blockRb);
AudioStream_F32::release(blockZero);
AudioStream_F32::release(blockOutLa);
AudioStream_F32::release(blockOutRa);
AudioStream_F32::release(blockOutLb);
AudioStream_F32::release(blockOutRb);
}
private:
audio_block_f32_t *inputQueueArray_f32[4];
float32_t gainA = 1.0f;
float32_t gainB = 0.0f;
};
#endif // _EFFECT_XFADERSTEREO_F32_H_