void EqAnalyser::analyze( sampleFrame *buf, const fpp_t frames ) { //only analyse if the view is visible if ( m_active ) { m_inProgress=true; const int FFT_BUFFER_SIZE = 2048; fpp_t f = 0; if( frames > FFT_BUFFER_SIZE ) { m_framesFilledUp = 0; f = frames - FFT_BUFFER_SIZE; } // meger channels for( ; f < frames; ++f ) { m_buffer[m_framesFilledUp] = ( buf[f][0] + buf[f][1] ) * 0.5; ++m_framesFilledUp; } if( m_framesFilledUp < FFT_BUFFER_SIZE ) { m_inProgress = false; return; } m_sampleRate = Engine::mixer()->processingSampleRate(); const int LOWEST_FREQ = 0; const int HIGHEST_FREQ = m_sampleRate / 2; fftwf_execute( m_fftPlan ); absspec( m_specBuf, m_absSpecBuf, FFT_BUFFER_SIZE+1 ); compressbands( m_absSpecBuf, m_bands, FFT_BUFFER_SIZE+1, MAX_BANDS, ( int )( LOWEST_FREQ * ( FFT_BUFFER_SIZE + 1 ) / ( float )( m_sampleRate / 2 ) ), ( int )( HIGHEST_FREQ * ( FFT_BUFFER_SIZE + 1) / ( float )( m_sampleRate / 2 ) ) ); m_energy = maximum( m_bands, MAX_BANDS ) / maximum( m_buffer, FFT_BUFFER_SIZE ); m_framesFilledUp = 0; m_inProgress = false; m_active = false; } }
bool SpectrumAnalyzer::processAudioBuffer( sampleFrame* _buf, const fpp_t _frames ) { if( !isEnabled() || !isRunning () ) { return false; } if( !m_saControls.isViewVisible() ) { return true; } fpp_t f = 0; if( _frames > FFT_BUFFER_SIZE ) { m_framesFilledUp = 0; f = _frames - FFT_BUFFER_SIZE; } const int cm = m_saControls.m_channelMode.value(); switch( cm ) { case MergeChannels: for( ; f < _frames; ++f ) { m_buffer[m_framesFilledUp] = ( _buf[f][0] + _buf[f][1] ) * 0.5; ++m_framesFilledUp; } break; case LeftChannel: for( ; f < _frames; ++f ) { m_buffer[m_framesFilledUp] = _buf[f][0]; ++m_framesFilledUp; } break; case RightChannel: for( ; f < _frames; ++f ) { m_buffer[m_framesFilledUp] = _buf[f][1]; ++m_framesFilledUp; } break; } if( m_framesFilledUp < FFT_BUFFER_SIZE ) { return isRunning(); } // hanming( m_buffer, FFT_BUFFER_SIZE, HAMMING ); const sample_rate_t sr = Engine::mixer()->processingSampleRate(); const int LOWEST_FREQ = 0; const int HIGHEST_FREQ = sr / 2; fftwf_execute( m_fftPlan ); absspec( m_specBuf, m_absSpecBuf, FFT_BUFFER_SIZE+1 ); if( m_saControls.m_linearSpec.value() ) { compressbands( m_absSpecBuf, m_bands, FFT_BUFFER_SIZE+1, MAX_BANDS, (int)(LOWEST_FREQ*(FFT_BUFFER_SIZE+1)/(float)(sr/2)), (int)(HIGHEST_FREQ*(FFT_BUFFER_SIZE+1)/(float)(sr/2))); m_energy = maximum( m_bands, MAX_BANDS ) / maximum( m_buffer, FFT_BUFFER_SIZE ); } else { calc13octaveband31( m_absSpecBuf, m_bands, FFT_BUFFER_SIZE+1, sr/2.0 ); m_energy = signalpower( m_buffer, FFT_BUFFER_SIZE ) / maximum( m_buffer, FFT_BUFFER_SIZE ); } m_framesFilledUp = 0; checkGate( 1 ); return isRunning(); }