#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; }