void AudioFilterFIR::update(void) { audio_block_t *block,*b_new; // If there's no coefficient table, give up. if(coeff_p == NULL)return; // do passthru if(coeff_p == FIR_PASSTHRU) { // Just passthrough block = receiveReadOnly(0); if(block) { transmit(block,0); release(block); } return; } // Left Channel block = receiveReadOnly(0); // get a block for the FIR output b_new = allocate(); if(block && b_new) { if(arm_fast) arm_fir_fast_q15(&l_fir_inst, (q15_t *)block->data, (q15_t *)b_new->data, AUDIO_BLOCK_SAMPLES); else arm_fir_q15(&l_fir_inst, (q15_t *)block->data, (q15_t *)b_new->data, AUDIO_BLOCK_SAMPLES); // send the FIR output to the left channel transmit(b_new,0); } if(block)release(block); if(b_new)release(b_new); }
// the core dsp function void dsp(int16_t* buffer, int length) { // only enable the filter if the user button is pressed if (user_mode & 1) { // we initiate the filter only if needed to prevent clitches at the beginning of new buffers if (firstStart == false || old_user_mode != user_mode) { initFilter(); old_user_mode = user_mode; firstStart = true; } // process with FIR arm_fir_fast_q15(&FIR, buffer, outSignal, BLOCKSIZE); // copy the result arm_copy_q15(outSignal, buffer, length); } }