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.
70 lines
2.8 KiB
70 lines
2.8 KiB
#include "basic_bypassStereo_F32.h"
|
|
|
|
bool bypass_process(audio_block_f32_t** p_blockL, audio_block_f32_t** p_blockR, bypass_mode_t mode, bool state)
|
|
{
|
|
bool result = false;
|
|
|
|
/**
|
|
* @brief bypass mode PASS can be used to validate the incoming audio blocks, create silence blocks if the input ones
|
|
* are not available (NULL).
|
|
*/
|
|
if (!state) mode = BYPASS_MODE_PASS;
|
|
|
|
switch(mode)
|
|
{
|
|
/**
|
|
* @brief TRAILS mode is the same as OFF with the different the component "update" function does not return
|
|
* and processes the incoming data, which is silence. Used in reverb/delays to let them naturally
|
|
* fade out
|
|
*/
|
|
case BYPASS_MODE_TRAILS:
|
|
/**
|
|
* @brief bypass mode OFF sends silence on both outputs. Used with components placed in an effect loop with separate
|
|
* dry path. Classic example is a parallel effect loop used for delays and reverbs:
|
|
* input ------------> |0 |---> output
|
|
* |--->reverb --> |1 mixer|
|
|
*/
|
|
case BYPASS_MODE_OFF:
|
|
if (*p_blockL) AudioStream_F32::release(*p_blockL); // discard both input blocks
|
|
if (*p_blockR) AudioStream_F32::release(*p_blockR);
|
|
*p_blockL = NULL;
|
|
*p_blockR = NULL;
|
|
// no break - let it run through the next switch case, with input blocks as NULL it will emit silence on both channels
|
|
|
|
/**
|
|
* @brief PASS mode connects the input signal directly to the output
|
|
* in case one of the blocks is not available, it tries to allocate a new block and make it silent
|
|
* returns false if allocation is not possbile due to not enoufg audio memory (increase AudioMemory_F32(xx);)
|
|
* Used in components connected in series.
|
|
*/
|
|
case BYPASS_MODE_PASS:
|
|
if(!*p_blockL) // no channel left available
|
|
{
|
|
*p_blockL = AudioStream_F32::allocate_f32(); // try to allocate a new block
|
|
if( !*p_blockL)
|
|
{
|
|
if (*p_blockR) AudioStream_F32::release(*p_blockR); // if the Rch is present, release/discard it
|
|
result = false;
|
|
break; // operation failed due to no audio memory left
|
|
}
|
|
memset(&(*p_blockL)->data[0], 0, (*p_blockL)->length*sizeof(float32_t)); // zero the data block to make it silent
|
|
}
|
|
if(!*p_blockR) // no channel right available
|
|
{
|
|
*p_blockR = AudioStream_F32::allocate_f32();
|
|
if( !*p_blockR) // no memory for a new block, but we might have L channel zeroed
|
|
{
|
|
if (*p_blockL) AudioStream_F32::release(*p_blockL); // blockL is available and contains audio. Discard it
|
|
result = false;
|
|
break; // and sigbnal failed operation
|
|
}
|
|
memset(&(*p_blockR)->data[0], 0, (*p_blockR)->length*sizeof(float32_t));
|
|
}
|
|
result = true; // audio data on L and R is avaialble
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return result;
|
|
} |