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/switch_selectorStereo_F32.h

89 lines
2.4 KiB

/**
* @file switch_selectorStereo_F32.h
* @author Piotr Zapart
* @brief Signal selector for routing mono to stereo
* @version 0.1
* @date 2024-03-21
*
* @copyright Copyright (c) 2024 www.hexefx.com
*
* 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 _SWITCH_SELECTORSTEREO_F32_H_
#define _SWITCH_SELECTORSTEREO_F32_H_
#include <AudioStream_F32.h>
#include <arm_math.h>
class AudioSwitchSelectorStereo : public AudioStream_F32
{
public:
AudioSwitchSelectorStereo(void) : AudioStream_F32(2, inputQueueArray){};
typedef enum
{
SIGNAL_SELECT_LR, // default stereo operation
SIGNAL_SELECT_L, // left input as mono input
SIGNAL_SELECT_R // right input as mono input
}selector_mode_t;
selector_mode_t setMode(selector_mode_t m)
{
if (m <= 2)
{
__disable_irq();
mode = m;
__enable_irq();
}
return mode;
}
selector_mode_t getMode() {return mode;};
void update()
{
audio_block_f32_t *blockL, *blockR, *outL, *outR;
blockL = AudioStream_F32::receiveWritable_f32(0);
blockR = AudioStream_F32::receiveWritable_f32(1);
if (!blockL || !blockR)
{
if (blockL) AudioStream_F32::release(blockL);
if (blockR) AudioStream_F32::release(blockR);
return;
}
switch(mode)
{
case SIGNAL_SELECT_LR:
outL = blockL;
outR = blockR;
break;
case SIGNAL_SELECT_L:
outL = blockL;
outR = blockL;
break;
case SIGNAL_SELECT_R:
outL = blockR;
outR = blockR;
break;
default:
outL = blockL;
outR = blockR;
break;
}
AudioStream_F32::transmit(outL, 0);
AudioStream_F32::transmit(outR, 1);
AudioStream_F32::release(blockL);
AudioStream_F32::release(blockR);
}
private:
audio_block_f32_t *inputQueueArray[2];
selector_mode_t mode = SIGNAL_SELECT_LR;
};
#endif // _SWITCH_SELECTORSTEREO_F32_H_