lbajardsilogic@223: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@223: lbajardsilogic@223: /* Sound Access lbajardsilogic@223: EASAIER client application. lbajardsilogic@223: Silogic 2007. Laure Bajard. lbajardsilogic@223: lbajardsilogic@223: Integration of the filter provided by: lbajardsilogic@223: Dublin Institute of Technology - Audio Research Group 2007 lbajardsilogic@223: www.audioresearchgroup.com lbajardsilogic@223: Author: Dan Barry lbajardsilogic@223: lbajardsilogic@223: This program is free software; you can redistribute it and/or lbajardsilogic@223: modify it under the terms of the GNU General Public License as lbajardsilogic@223: published by the Free Software Foundation; either version 2 of the lbajardsilogic@223: License, or (at your option) any later version. See the file lbajardsilogic@223: COPYING included with this distribution for more information. lbajardsilogic@223: */ lbajardsilogic@223: lbajardsilogic@223: #include lbajardsilogic@223: #include lbajardsilogic@223: lbajardsilogic@223: #include "MultiRealTimeFilter.h" lbajardsilogic@223: lbajardsilogic@223: #include "FFTReal.h" lbajardsilogic@223: #include "DSP.h" lbajardsilogic@223: lbajardsilogic@223: #include "system/System.h" lbajardsilogic@223: #include "main/MainWindow.h" lbajardsilogic@223: lbajardsilogic@229: // DAN added lbajardsilogic@229: float *L_mags; ///CURRENT FRAME MAGNITUDES lbajardsilogic@229: float *R_mags; ///CURRENT FRAME MAGNITUDES lbajardsilogic@229: float *pL_mags; ///PREVIOUS FRAME MAGNITUDES lbajardsilogic@229: float *pR_mags; ///PREVIOUS FRAME MAGNITUDES lbajardsilogic@229: benoitrigolleau@278: float *plotarray; ///STORES HISTOGRAM PLOT FOR SEPARATOR benoitrigolleau@278: float *grapharray; ///HIGHER RESOLUTION VERSION OF ABOVE FOR SCREEN PLOTTING benoitrigolleau@278: lbajardsilogic@229: float *L_FFTframe; //Left FFT Frame lbajardsilogic@229: float *R_FFTframe; //Right FFT Frame lbajardsilogic@229: lbajardsilogic@223: extern float hopfactor; lbajardsilogic@223: lbajardsilogic@223: //need in DSP.cpp lbajardsilogic@223: float lastfactor; lbajardsilogic@223: lbajardsilogic@223: int numpeaks; lbajardsilogic@223: float *peak_locations; lbajardsilogic@223: int currentposition; lbajardsilogic@223: // lbajardsilogic@223: lbajardsilogic@223: MultiRealTimeFilter::MultiRealTimeFilter() : Filter(), lbajardsilogic@223: m_framesize(4096), lbajardsilogic@223: m_transhold(0) lbajardsilogic@223: { lbajardsilogic@223: m_hop = m_framesize/4; lbajardsilogic@223: lbajardsilogic@223: currentposition = m_hop; lbajardsilogic@223: lbajardsilogic@232: m_mutex = new QMutex; lbajardsilogic@232: lbajardsilogic@223: m_timeStretchFilter = new TimeStretchFilter(); lbajardsilogic@232: m_equalizerFilter = new EqualizerFilter(m_framesize, m_mutex); lbajardsilogic@223: benoitrigolleau@278: lbajardsilogic@223: m_filterCollection.push_back(m_timeStretchFilter); lbajardsilogic@223: m_filterCollection.push_back(m_equalizerFilter); lbajardsilogic@223: lbajardsilogic@223: connect(m_timeStretchFilter, SIGNAL(filterEnabled(bool)), this, SLOT(setFilterEnabled(bool))); lbajardsilogic@223: connect(m_equalizerFilter, SIGNAL(filterEnabled(bool)), this, SLOT(setFilterEnabled(bool))); lbajardsilogic@223: lbajardsilogic@229: m_inputBufferL = (float *)calloc(m_framesize*(m_timeStretchFilter->getMaxPitchFactor()+1), sizeof(float)); lbajardsilogic@229: m_inputBufferR = (float *)calloc(m_framesize*(m_timeStretchFilter->getMaxPitchFactor()+1), sizeof(float)); lbajardsilogic@229: /**********malloc***********/ lbajardsilogic@223: lbajardsilogic@229: lbajardsilogic@229: //This block specifically sets up the buffers required to do a 75% overlap scheme lbajardsilogic@229: window=(float *)calloc((m_framesize), sizeof(float)); //Window lbajardsilogic@229: lbajardsilogic@229: L_FFTframe=(float *)calloc((m_framesize), sizeof(float)); lbajardsilogic@229: R_FFTframe=(float *)calloc((m_framesize), sizeof(float)); lbajardsilogic@229: lbajardsilogic@229: L_audioframe=(float *)calloc((m_framesize), sizeof(float)); //The current frame lbajardsilogic@229: R_audioframe=(float *)calloc((m_framesize), sizeof(float)); lbajardsilogic@229: pL_audioframe=(float *)calloc((m_framesize), sizeof(float)); // lbajardsilogic@229: pR_audioframe=(float *)calloc((m_framesize), sizeof(float)); lbajardsilogic@229: L_processedframe=(float *)calloc((m_framesize), sizeof(float)); //The current frame lbajardsilogic@229: R_processedframe=(float *)calloc((m_framesize), sizeof(float)); lbajardsilogic@229: lbajardsilogic@229: L_outbuffer=(float *)calloc((m_framesize/4), sizeof(float)); //The current output segment which is 1/4 framesize for 75% overlap lbajardsilogic@229: L_holdbuffer3=(float *)calloc((m_framesize*0.75), sizeof(float)); //The hold buffer for the previous frame segment lbajardsilogic@229: L_holdbuffer2=(float *)calloc((m_framesize/2), sizeof(float)); //The fold buffer for the frame segment 2 frames ago lbajardsilogic@229: L_holdbuffer1=(float *)calloc((m_framesize/4), sizeof(float)); //The fold buffer for the frame segment 3 frames ago lbajardsilogic@223: lbajardsilogic@229: R_outbuffer=(float *)calloc((m_framesize/4), sizeof(float)); //The current output segment which is 1/4 framesize for 75% overlap lbajardsilogic@229: R_holdbuffer3=(float *)calloc((m_framesize*0.75), sizeof(float)); //The hold buffer for the previous frame segment lbajardsilogic@229: R_holdbuffer2=(float *)calloc((m_framesize/2), sizeof(float)); //The fold buffer for the frame segment 2 frames ago lbajardsilogic@229: R_holdbuffer1=(float *)calloc((m_framesize/4), sizeof(float)); lbajardsilogic@229: lbajardsilogic@229: L_mags=(float *)calloc((m_framesize/2), sizeof(float)); //The magnitude and phase arrays lbajardsilogic@229: R_mags=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: L_phase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: R_phase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: pL_mags=(float *)calloc((m_framesize/2), sizeof(float)); //The magnitude and phase arrays lbajardsilogic@229: pR_mags=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: pL_phase=(float *)calloc((m_framesize/2), sizeof(float)); //The magnitude and phase arrays lbajardsilogic@229: pR_phase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: cL_synthphase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: cR_synthphase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: pL_synthphase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: pR_synthphase=(float *)calloc((m_framesize/2), sizeof(float)); lbajardsilogic@229: lbajardsilogic@223: peak_locations=(float *)calloc((m_framesize/2), sizeof(float)); benoitrigolleau@278: benoitrigolleau@278: plotarray=(float *)calloc((200), sizeof(float)); benoitrigolleau@278: grapharray=(float *)calloc((400), sizeof(float)); lbajardsilogic@223: lbajardsilogic@223: hanning(window, m_framesize); lbajardsilogic@223: lbajardsilogic@223: connect(this, SIGNAL(playSpeedChanged(float)), lbajardsilogic@223: MainWindow::instance(), SLOT(playSpeedChanged(float))); lbajardsilogic@223: lbajardsilogic@223: hopfactor = 1; lbajardsilogic@223: /***************************/ lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: MultiRealTimeFilter::~MultiRealTimeFilter() lbajardsilogic@223: { lbajardsilogic@223: /**********de-alloc***********/ lbajardsilogic@229: delete m_inputBufferL; lbajardsilogic@229: delete m_inputBufferR; lbajardsilogic@229: delete L_mags; ///CURRENT FRAME MAGNITUDES lbajardsilogic@229: delete R_mags; ///CURRENT FRAME MAGNITUDES lbajardsilogic@229: delete pL_mags; ///PREVIOUS FRAME MAGNITUDES lbajardsilogic@229: delete pR_mags; ///PREVIOUS FRAME MAGNITUDES lbajardsilogic@229: lbajardsilogic@229: delete L_FFTframe; //Left FFT Frame lbajardsilogic@229: delete R_FFTframe; lbajardsilogic@229: lbajardsilogic@229: lbajardsilogic@229: //delete FFTframe; lbajardsilogic@223: lbajardsilogic@229: delete L_audioframe; // lbajardsilogic@229: delete R_audioframe; // lbajardsilogic@229: delete pL_audioframe; // lbajardsilogic@229: delete pR_audioframe; // lbajardsilogic@229: delete L_processedframe; // lbajardsilogic@229: delete R_processedframe; lbajardsilogic@229: lbajardsilogic@229: delete window; lbajardsilogic@229: lbajardsilogic@229: delete L_outbuffer; lbajardsilogic@229: delete L_holdbuffer3; lbajardsilogic@229: delete L_holdbuffer2; lbajardsilogic@229: delete L_holdbuffer1; lbajardsilogic@229: delete R_outbuffer; lbajardsilogic@229: delete R_holdbuffer3; lbajardsilogic@229: delete R_holdbuffer2; lbajardsilogic@229: delete R_holdbuffer1; lbajardsilogic@229: lbajardsilogic@229: delete L_phase; lbajardsilogic@229: delete R_phase; lbajardsilogic@229: delete pL_phase; lbajardsilogic@229: delete pR_phase; lbajardsilogic@229: delete cL_synthphase; lbajardsilogic@229: delete cR_synthphase; lbajardsilogic@229: delete pL_synthphase; lbajardsilogic@229: delete pR_synthphase; lbajardsilogic@223: lbajardsilogic@223: delete peak_locations; lbajardsilogic@223: lbajardsilogic@223: hopfactor = 1; lbajardsilogic@223: lbajardsilogic@223: emit playSpeedChanged(1); lbajardsilogic@223: lbajardsilogic@232: delete m_mutex; lbajardsilogic@241: m_mutex = 0; lbajardsilogic@223: /***************************/ lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void MultiRealTimeFilter::putInput(float **input, size_t samples) lbajardsilogic@223: { lbajardsilogic@223: int dd; lbajardsilogic@223: float sampdiff; lbajardsilogic@223: float difratio; lbajardsilogic@223: float interpsample; lbajardsilogic@223: lbajardsilogic@223: bool drum = 0; lbajardsilogic@223: float drumthresh = 65; lbajardsilogic@223: lbajardsilogic@223: int delta = m_hop; //the "current position" is shifted of m_hop lbajardsilogic@223: lbajardsilogic@223: if ( samples < ( (size_t) floor(m_framesize*(m_timeStretchFilter->getPitchFactor() + 1)) ) ) lbajardsilogic@223: return; lbajardsilogic@223: lbajardsilogic@223: int channel = getSourceChannelCount(); lbajardsilogic@223: lbajardsilogic@229: lbajardsilogic@229: lbajardsilogic@223: for (int i=0; i< ((int) samples); i++){ lbajardsilogic@223: if (channel > 1) lbajardsilogic@229: { lbajardsilogic@229: m_inputBufferL[i] = input[0][i]; //real-time biffer taken from left ring buffer lbajardsilogic@229: m_inputBufferR[i] = input[1][i]; //real-time biffer taken from right ring buffer lbajardsilogic@229: } else { lbajardsilogic@229: m_inputBufferL[i] = input[0][i]; //If file is mono we copy same channel into both buffers into both buffers lbajardsilogic@229: m_inputBufferR[i] = input[0][i]; lbajardsilogic@229: } lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@229: lbajardsilogic@229: lbajardsilogic@223: for (int i = 0; i< ((int) m_framesize); i++) lbajardsilogic@223: { lbajardsilogic@223: lbajardsilogic@223: //This block was specifically written to do resampling interpolation for crude pitch shifting lbajardsilogic@223: //if it's not being used the audioframe line after the else should be used which is also used in bypass mode lbajardsilogic@223: //At lbajardsilogic@223: lbajardsilogic@229: if (m_timeStretchFilter->bypass() == false) lbajardsilogic@229: { lbajardsilogic@223: dd = floor(double(i*m_timeStretchFilter->getPitchFactor())); lbajardsilogic@223: difratio = (double(i*m_timeStretchFilter->getPitchFactor())) - floor(double(i*m_timeStretchFilter->getPitchFactor())); lbajardsilogic@223: lbajardsilogic@223: // this block loads a frame as normal lbajardsilogic@229: sampdiff=m_inputBufferL[dd+delta+1]-m_inputBufferL[dd+delta]; lbajardsilogic@229: interpsample = (difratio*sampdiff)+m_inputBufferL[dd+delta]; lbajardsilogic@229: L_audioframe[i] = interpsample*window[i]; lbajardsilogic@223: lbajardsilogic@229: sampdiff=m_inputBufferL[dd+delta+1-m_hop]-m_inputBufferL[dd+delta-m_hop]; lbajardsilogic@229: interpsample = (difratio*sampdiff)+m_inputBufferL[dd+delta-m_hop]; lbajardsilogic@229: pL_audioframe[i] = interpsample*window[i]; lbajardsilogic@229: lbajardsilogic@229: lbajardsilogic@229: sampdiff=m_inputBufferR[dd+delta+1]-m_inputBufferR[dd+delta]; lbajardsilogic@229: interpsample = (difratio*sampdiff)+m_inputBufferR[dd+delta]; lbajardsilogic@229: R_audioframe[i] = interpsample*window[i]; lbajardsilogic@229: lbajardsilogic@229: sampdiff=m_inputBufferR[dd+delta+1-m_hop]-m_inputBufferR[dd+delta-m_hop]; lbajardsilogic@229: interpsample = (difratio*sampdiff)+m_inputBufferR[dd+delta-m_hop]; lbajardsilogic@229: pR_audioframe[i] = interpsample*window[i]; lbajardsilogic@229: lbajardsilogic@223: } lbajardsilogic@223: else { lbajardsilogic@229: L_audioframe[i] = m_inputBufferL[i+delta+1]*window[i]; lbajardsilogic@229: R_audioframe[i] = m_inputBufferR[i+delta+1]*window[i]; lbajardsilogic@229: lbajardsilogic@229: L_processedframe[i] = L_audioframe[i]*window[i]; lbajardsilogic@229: R_processedframe[i] = R_audioframe[i]*window[i]; lbajardsilogic@223: } lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: FFTReal fft_object(m_framesize); lbajardsilogic@223: lbajardsilogic@230: //if (m_timeStretchFilter->bypass() == false)//DAN This bypass would stop all processing...need to replace this with a master bypass instead of just timestretch bypass lbajardsilogic@230: if (filterEnabled) lbajardsilogic@223: { lbajardsilogic@229: lbajardsilogic@229: //CURRENT FRAME LEFT AND RIGHT TIME 2 FREQUENCY ***** THIS IS REQUIRED BY ALL PROCESSES lbajardsilogic@229: fft_object.do_fft(L_FFTframe,L_audioframe); lbajardsilogic@229: fft_object.do_fft(R_FFTframe,R_audioframe); lbajardsilogic@223: lbajardsilogic@229: cart2pol(L_FFTframe, L_mags, L_phase, m_framesize); lbajardsilogic@229: cart2pol(R_FFTframe, R_mags, R_phase, m_framesize); lbajardsilogic@223: lbajardsilogic@230: lbajardsilogic@229: //CURRENT FRAME LEFT AND RIGHT TIME 2 FREQUENCY ***** THIS IS REQUIRED BY ALL PROCESSES lbajardsilogic@229: fft_object.do_fft (L_FFTframe,pL_audioframe); lbajardsilogic@229: fft_object.do_fft (R_FFTframe,pR_audioframe); lbajardsilogic@229: lbajardsilogic@229: cart2pol(L_FFTframe, pL_mags, pL_phase, m_framesize); lbajardsilogic@229: cart2pol(R_FFTframe, pR_mags, pR_phase, m_framesize); lbajardsilogic@229: lbajardsilogic@223: //-------------------------------------------- lbajardsilogic@229: benoitrigolleau@278: benoitrigolleau@278: lbajardsilogic@229: lbajardsilogic@229: //EQUALISER CALLS - lbajardsilogic@229: //Will need a bypass " m_equalizerFilter->bypass()" as below lbajardsilogic@229: //Will need a simplemode " m_equalizerFilter->simplemode_bypass() " to switch between draw and slider control lbajardsilogic@229: if (m_equalizerFilter->bypass() == false) lbajardsilogic@229: { lbajardsilogic@232: lbajardsilogic@232: m_mutex->lock(); lbajardsilogic@232: if (m_equalizerFilter->simpleMode()) lbajardsilogic@229: { lbajardsilogic@232: //m_equalizerFilter->create_filterbands(); lbajardsilogic@232: bandeq(L_mags, R_mags, m_equalizerFilter->curve(), m_framesize); //Gainband 1 - 5 values from EQ sliders lbajardsilogic@232: //log10plot2(bandcurve,plotbandcurve, m_framesize, 400); //Converts linear band curve to log band curve only for plot lbajardsilogic@229: } lbajardsilogic@229: else lbajardsilogic@232: { lbajardsilogic@229: applyEQ(L_mags, R_mags, m_framesize, m_equalizerFilter->curve().size(), m_equalizerFilter->curve()); //Takes "eqcurve" which is what user draws in advanced mode lbajardsilogic@232: } lbajardsilogic@223: lbajardsilogic@229: m_equalizerFilter->emitPlotFFTArray(L_mags, m_framesize); lbajardsilogic@232: m_mutex->unlock(); lbajardsilogic@229: } lbajardsilogic@229: lbajardsilogic@229: if (m_timeStretchFilter->bypass() == false) lbajardsilogic@223: { lbajardsilogic@229: //TRANSIENT DETECTION FOR TIME STRETCHER lbajardsilogic@229: drum=transient_detect(L_mags, R_mags, pL_mags, pR_mags, drumthresh, m_framesize); lbajardsilogic@229: lbajardsilogic@229: if (m_timeStretchFilter->transcheck()) lbajardsilogic@229: { lbajardsilogic@229: lbajardsilogic@229: if (drum && m_transhold==0){ lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: cur2last(L_phase, cL_synthphase, pL_synthphase, m_framesize); lbajardsilogic@229: cur2last(R_phase, cR_synthphase, pR_synthphase, m_framesize); lbajardsilogic@229: lbajardsilogic@229: m_transhold=4; lbajardsilogic@223: } lbajardsilogic@223: else{ lbajardsilogic@229: if(m_timeStretchFilter->peakcheck()){ lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: rotatephases_peaklocked(L_phase, pL_phase, cL_synthphase, pL_synthphase, L_mags, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: rotatephases_peaklocked(R_phase, pR_phase, cR_synthphase, pR_synthphase, R_mags, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: lbajardsilogic@229: } lbajardsilogic@229: else{ lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: rotatephases(L_phase, pL_phase, cL_synthphase, pL_synthphase, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: rotatephases(R_phase, pR_phase, cR_synthphase, pR_synthphase, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: lbajardsilogic@229: } lbajardsilogic@223: } lbajardsilogic@223: } lbajardsilogic@229: else lbajardsilogic@229: { lbajardsilogic@229: if(m_timeStretchFilter->peakcheck()){ lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: rotatephases_peaklocked(L_phase, pL_phase, cL_synthphase, pL_synthphase, L_mags, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: rotatephases_peaklocked(R_phase, pR_phase, cR_synthphase, pR_synthphase, R_mags, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: lbajardsilogic@229: } lbajardsilogic@229: else{ lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: rotatephases(L_phase, pL_phase, cL_synthphase, pL_synthphase, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: rotatephases(R_phase, pR_phase, cR_synthphase, pR_synthphase, m_framesize, m_timeStretchFilter->getPitchFactor()); lbajardsilogic@229: } lbajardsilogic@223: } lbajardsilogic@229: lbajardsilogic@229: // FOR TIME STRETCHER lbajardsilogic@229: if(m_transhold != 0){ lbajardsilogic@229: m_transhold = m_transhold - 1; lbajardsilogic@223: } lbajardsilogic@230: lbajardsilogic@230: drum = 0; lbajardsilogic@230: lbajardsilogic@230: pol2cart(L_FFTframe, L_mags, cL_synthphase, m_framesize); lbajardsilogic@230: pol2cart(R_FFTframe, R_mags, cR_synthphase, m_framesize); lbajardsilogic@230: lbajardsilogic@230: } else lbajardsilogic@230: { lbajardsilogic@230: pol2cart(L_FFTframe, L_mags, L_phase, m_framesize); lbajardsilogic@230: pol2cart(R_FFTframe, R_mags, R_phase, m_framesize); lbajardsilogic@223: } lbajardsilogic@229: lbajardsilogic@230: fft_object.do_ifft (L_FFTframe,L_processedframe); lbajardsilogic@230: fft_object.do_ifft (R_FFTframe,R_processedframe); lbajardsilogic@229: lbajardsilogic@230: fft_object.rescale (L_processedframe); lbajardsilogic@230: fft_object.rescale (R_processedframe); lbajardsilogic@230: lbajardsilogic@230: } lbajardsilogic@223: lbajardsilogic@223: for (int p = 0; p < ((int) m_framesize); p++){ lbajardsilogic@229: L_processedframe[p]=L_processedframe[p]*window[p]; lbajardsilogic@229: R_processedframe[p]=R_processedframe[p]*window[p]; lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: for (int j = 0; j< ((int) m_framesize); j++) lbajardsilogic@223: { lbajardsilogic@229: //This block deals with the buffers for a 75% overlap scheme AND IS NOW STEREO lbajardsilogic@223: if (j < ((int) m_framesize)/4){ lbajardsilogic@229: L_outbuffer[j]=(L_processedframe[j]+L_holdbuffer1[j]+L_holdbuffer2[j]+L_holdbuffer3[j])*0.5; lbajardsilogic@229: L_holdbuffer1[j]=L_holdbuffer2[j+(m_framesize/4)]; lbajardsilogic@229: lbajardsilogic@229: R_outbuffer[j]=(R_processedframe[j]+R_holdbuffer1[j]+R_holdbuffer2[j]+R_holdbuffer3[j])*0.5; lbajardsilogic@229: R_holdbuffer1[j]=R_holdbuffer2[j+(m_framesize/4)]; lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: if (j < ((int) m_framesize)/2){ lbajardsilogic@229: L_holdbuffer2[j]=L_holdbuffer3[j+(m_framesize/4)]; lbajardsilogic@229: R_holdbuffer2[j]=R_holdbuffer3[j+(m_framesize/4)]; lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: if (j < ((int) m_framesize)*0.75){ lbajardsilogic@229: L_holdbuffer3[j]=L_processedframe[j+(m_framesize/4)]; lbajardsilogic@229: R_holdbuffer3[j]=R_processedframe[j+(m_framesize/4)]; lbajardsilogic@223: } lbajardsilogic@229: lbajardsilogic@229: lbajardsilogic@223: } lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void MultiRealTimeFilter::getOutput(float **output, size_t samples) lbajardsilogic@223: { lbajardsilogic@223: if (samples > m_framesize/4) lbajardsilogic@223: return; lbajardsilogic@223: lbajardsilogic@223: int channel = getSourceChannelCount(); lbajardsilogic@223: lbajardsilogic@229: for (size_t i = 0; i < samples; ++i) // Now that there are 2 out buffers, the output is filled according to channel count lbajardsilogic@229: { lbajardsilogic@229: lbajardsilogic@229: output[0][i] = L_outbuffer[i]; lbajardsilogic@229: lbajardsilogic@229: if (channel > 1) lbajardsilogic@229: { lbajardsilogic@229: output[1][i] = R_outbuffer[i]; lbajardsilogic@229: } lbajardsilogic@229: } lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: size_t MultiRealTimeFilter::getRequiredInputSamples(size_t outputSamplesNeeded) lbajardsilogic@223: { lbajardsilogic@223: size_t need = (size_t) (floor(m_framesize*(m_timeStretchFilter->getPitchFactor() + 1))); lbajardsilogic@223: return need; lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: size_t MultiRealTimeFilter::getRequiredSkipSamples() lbajardsilogic@223: { lbajardsilogic@223: size_t skip = 1024; lbajardsilogic@223: lbajardsilogic@223: if (m_timeStretchFilter->bypass() == false && m_transhold==0) lbajardsilogic@223: { lbajardsilogic@223: skip = floor(m_hop*hopfactor); lbajardsilogic@223: currentposition += floor(m_hop*hopfactor); lbajardsilogic@223: } lbajardsilogic@223: else lbajardsilogic@223: { lbajardsilogic@223: skip = m_hop; lbajardsilogic@223: currentposition += m_hop; benoitrigolleau@278: lbajardsilogic@223: } benoitrigolleau@278: benoitrigolleau@278: if (m_timeStretchFilter->bypass() == false && m_timeStretchFilter->isFreezed() == true) benoitrigolleau@278: { benoitrigolleau@278: skip = 0; benoitrigolleau@278: currentposition += 0; benoitrigolleau@278: } benoitrigolleau@278: lbajardsilogic@223: return skip; lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void MultiRealTimeFilter::setFilterEnabled(bool b) lbajardsilogic@223: { lbajardsilogic@223: filterEnabled = (m_timeStretchFilter->isEnabled() || m_equalizerFilter->isEnabled()); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: void MultiRealTimeFilter::setFilterEnabled(int b) lbajardsilogic@223: { lbajardsilogic@223: filterEnabled = (m_timeStretchFilter->isEnabled() || m_equalizerFilter->isEnabled()); lbajardsilogic@223: } lbajardsilogic@223: lbajardsilogic@223: