diff --git a/src/config.cpp b/src/config.cpp index 5ea3176..3fab069 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -200,6 +200,8 @@ void CConfig::Load (void) m_bProfileEnabled = m_Properties.GetNumber ("ProfileEnabled", 0) != 0; m_bPerformanceSelectToLoad = m_Properties.GetNumber ("PerformanceSelectToLoad", 1) != 0; m_bPerformanceSelectChannel = m_Properties.GetNumber ("PerformanceSelectChannel", 0); + + m_bFXEnabled = m_Properties.GetNumber("FXEnabled", 1) != 0; } unsigned CConfig::GetToneGenerators (void) const @@ -722,3 +724,8 @@ unsigned CConfig::GetPerformanceSelectChannel (void) const { return m_bPerformanceSelectChannel; } + +bool CConfig::GetFXEnabled (void) const +{ + return m_bFXEnabled; +} diff --git a/src/config.h b/src/config.h index 4e615bf..708e3f1 100644 --- a/src/config.h +++ b/src/config.h @@ -241,6 +241,9 @@ public: bool GetPerformanceSelectToLoad (void) const; unsigned GetPerformanceSelectChannel (void) const; + // Enable/Disable FXs + bool GetFXEnabled (void) const; + private: CPropertiesFatFsFile m_Properties; @@ -355,6 +358,8 @@ private: bool m_bProfileEnabled; bool m_bPerformanceSelectToLoad; unsigned m_bPerformanceSelectChannel; + + bool m_bFXEnabled; }; #endif diff --git a/src/minidexed.cpp b/src/minidexed.cpp index ef0d94b..2e66a81 100644 --- a/src/minidexed.cpp +++ b/src/minidexed.cpp @@ -1521,53 +1521,59 @@ void CMiniDexed::ProcessSound (void) m_pTG[0]->getSamples (SampleBuffer[indexL], nFrames); - m_InsertFXSpinLock[0]->Acquire(); - m_InsertFX[0]->process(SampleBuffer[indexL], SampleBuffer[indexL], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); - m_InsertFXSpinLock[0]->Release(); - - send_fx1_mixer->doAddMix(0, SampleBuffer[indexL], SampleBuffer[indexR]); - send_fx2_mixer->doAddMix(0, SampleBuffer[indexL], SampleBuffer[indexR]); - - // BEGIN adding send fx 1 - float32_t SendFXOutputBuffer[2][nFrames]; - float32_t SendFXMixBuffer[2][nFrames]; - arm_fill_f32(0.0f, SendFXMixBuffer[indexR], nFrames); - arm_fill_f32(0.0f, SendFXMixBuffer[indexL], nFrames); - - m_SendFX1SpinLock.Acquire (); - send_fx1_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - m_SendFX1->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); - m_SendFX1SpinLock.Release (); - - // send to FX 2 - send_fx2_mixer->doAddMix(CConfig::SendFX2MixerChannels - 1, SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - - // scale down and add left send fx buffer by send fx level - arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1Level, SendFXOutputBuffer[indexL], nFrames); - arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); - // scale down and add right send fx buffer by send fx level - arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1Level, SendFXOutputBuffer[indexR], nFrames); - arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); - // END adding send fx 1 - - - // BEGIN adding send fx 2 - m_SendFX2SpinLock.Acquire (); - send_fx2_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - m_SendFX2->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); - m_SendFX2SpinLock.Release (); - - // scale down and add left send fx buffer by send fx level - arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX2Level, SendFXOutputBuffer[indexL], nFrames); - arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); - // scale down and add right send fx buffer by send fx level - arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX2Level, SendFXOutputBuffer[indexR], nFrames); - arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); - // END adding send fx 2 - - m_MasterFXSpinLock.Acquire (); - m_MasterFX->process(SampleBuffer[indexL], SampleBuffer[indexR], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); - m_MasterFXSpinLock.Release (); + if (m_pConfig->GetFXEnabled()) + { + m_InsertFXSpinLock[0]->Acquire(); + m_InsertFX[0]->process(SampleBuffer[indexL], SampleBuffer[indexL], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); + m_InsertFXSpinLock[0]->Release(); + + send_fx1_mixer->doAddMix(0, SampleBuffer[indexL], SampleBuffer[indexR]); + send_fx2_mixer->doAddMix(0, SampleBuffer[indexL], SampleBuffer[indexR]); + + // BEGIN adding send fx 1 + float32_t SendFXOutputBuffer[2][nFrames]; + float32_t SendFXMixBuffer[2][nFrames]; + arm_fill_f32(0.0f, SendFXMixBuffer[indexR], nFrames); + arm_fill_f32(0.0f, SendFXMixBuffer[indexL], nFrames); + + m_SendFX1SpinLock.Acquire (); + send_fx1_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + m_SendFX1->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); + m_SendFX1SpinLock.Release (); + + // send to FX 2 + send_fx2_mixer->doAddMix(CConfig::SendFX2MixerChannels - 1, SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + + // scale down and add left send fx buffer by send fx level + arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1Level, SendFXOutputBuffer[indexL], nFrames); + arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); + // scale down and add right send fx buffer by send fx level + arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1Level, SendFXOutputBuffer[indexR], nFrames); + arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); + // END adding send fx 1 + + // BEGIN adding send fx 2 + m_SendFX2SpinLock.Acquire (); + send_fx2_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + m_SendFX2->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); + m_SendFX2SpinLock.Release (); + + // scale down and add left send fx buffer by send fx level + arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX2Level, SendFXOutputBuffer[indexL], nFrames); + arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); + // scale down and add right send fx buffer by send fx level + arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX2Level, SendFXOutputBuffer[indexR], nFrames); + arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); + // END adding send fx 2 + + m_MasterFXSpinLock.Acquire (); + m_MasterFX->process(SampleBuffer[indexL], SampleBuffer[indexR], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); + m_MasterFXSpinLock.Release (); + } + else + { + memcpy(SampleBuffer[indexR], SampleBuffer[indexR], nFrames * sizeof(float32_t)); + } // swap stereo channels if needed prior to writing back out if (m_bChannelsSwapped) @@ -1634,7 +1640,8 @@ void CMiniDexed::ProcessSound (void) m_pTG[i]->getSamples (m_OutputLevel[i][0], nFrames); - if (!m_bQuadDAC8Chan) { + if (!m_bQuadDAC8Chan && m_pConfig->GetFXEnabled()) + { m_InsertFXSpinLock[i]->Acquire(); m_InsertFX[i]->process(m_OutputLevel[i][0], m_OutputLevel[i][0], m_OutputLevel[i][0], m_OutputLevel[i][1], nFrames); m_InsertFXSpinLock[i]->Release(); @@ -1710,8 +1717,12 @@ void CMiniDexed::ProcessSound (void) for (uint8_t i = 0; i < m_nToneGenerators; i++) { tg_mixer->doAddMix(i, m_OutputLevel[i][indexL], m_OutputLevel[i][indexR]); - send_fx1_mixer->doAddMix(i, m_OutputLevel[i][indexL], m_OutputLevel[i][indexR]); - send_fx2_mixer->doAddMix(i, m_OutputLevel[i][indexL], m_OutputLevel[i][indexR]); + + if (m_pConfig->GetFXEnabled()) + { + send_fx1_mixer->doAddMix(i, m_OutputLevel[i][indexL], m_OutputLevel[i][indexR]); + send_fx2_mixer->doAddMix(i, m_OutputLevel[i][indexL], m_OutputLevel[i][indexR]); + } } // END TG mixing @@ -1722,49 +1733,52 @@ void CMiniDexed::ProcessSound (void) // get the mix of all TGs tg_mixer->getMix(SampleBuffer[indexL], SampleBuffer[indexR]); - // BEGIN adding send fx 1 - float32_t SendFXOutputBuffer[2][nFrames]; - float32_t SendFXMixBuffer[2][nFrames]; - arm_fill_f32(0.0f, SendFXOutputBuffer[indexL], nFrames); - arm_fill_f32(0.0f, SendFXOutputBuffer[indexR], nFrames); - arm_fill_f32(0.0f, SendFXMixBuffer[indexR], nFrames); - arm_fill_f32(0.0f, SendFXMixBuffer[indexL], nFrames); - - m_SendFX1SpinLock.Acquire (); - send_fx1_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - m_SendFX1->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); - m_SendFX1SpinLock.Release (); - - // send to FX 2 - arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1SendFXLevel, SendFXMixBuffer[indexL], nFrames); - arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1SendFXLevel, SendFXMixBuffer[indexR], nFrames); - send_fx2_mixer->doAddMix(CConfig::SendFX2MixerChannels - 1, SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - - // scale down and add left reverb buffer by reverb level - arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1Level, SendFXOutputBuffer[indexL], nFrames); - arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); - // scale down and add right reverb buffer by reverb level - arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1Level, SendFXOutputBuffer[indexR], nFrames); - arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); - // END adding send fx 1 - - // BEGIN adding send fx 2 - m_SendFX2SpinLock.Acquire (); - send_fx2_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); - m_SendFX2->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); - m_SendFX2SpinLock.Release (); - - // scale down and add left reverb buffer by reverb level - arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX2Level, SendFXOutputBuffer[indexL], nFrames); - arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); - // scale down and add right reverb buffer by reverb level - arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX2Level, SendFXOutputBuffer[indexR], nFrames); - arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); - // END adding send fx 2 - - m_MasterFXSpinLock.Acquire (); - m_MasterFX->process(SampleBuffer[indexL], SampleBuffer[indexR], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); - m_MasterFXSpinLock.Release (); + if (m_pConfig->GetFXEnabled()) + { + // BEGIN adding send fx 1 + float32_t SendFXOutputBuffer[2][nFrames]; + float32_t SendFXMixBuffer[2][nFrames]; + arm_fill_f32(0.0f, SendFXOutputBuffer[indexL], nFrames); + arm_fill_f32(0.0f, SendFXOutputBuffer[indexR], nFrames); + arm_fill_f32(0.0f, SendFXMixBuffer[indexR], nFrames); + arm_fill_f32(0.0f, SendFXMixBuffer[indexL], nFrames); + + m_SendFX1SpinLock.Acquire (); + send_fx1_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + m_SendFX1->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); + m_SendFX1SpinLock.Release (); + + // send to FX 2 + arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1SendFXLevel, SendFXMixBuffer[indexL], nFrames); + arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1SendFXLevel, SendFXMixBuffer[indexR], nFrames); + send_fx2_mixer->doAddMix(CConfig::SendFX2MixerChannels - 1, SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + + // scale down and add left reverb buffer by reverb level + arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX1Level, SendFXOutputBuffer[indexL], nFrames); + arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); + // scale down and add right reverb buffer by reverb level + arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX1Level, SendFXOutputBuffer[indexR], nFrames); + arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); + // END adding send fx 1 + + // BEGIN adding send fx 2 + m_SendFX2SpinLock.Acquire (); + send_fx2_mixer->getMix(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR]); + m_SendFX2->process(SendFXMixBuffer[indexL], SendFXMixBuffer[indexR], SendFXOutputBuffer[indexL], SendFXOutputBuffer[indexR], nFrames); + m_SendFX2SpinLock.Release (); + + // scale down and add left reverb buffer by reverb level + arm_scale_f32(SendFXOutputBuffer[indexL], m_SendFX2Level, SendFXOutputBuffer[indexL], nFrames); + arm_add_f32(SampleBuffer[indexL], SendFXOutputBuffer[indexL], SampleBuffer[indexL], nFrames); + // scale down and add right reverb buffer by reverb level + arm_scale_f32(SendFXOutputBuffer[indexR], m_SendFX2Level, SendFXOutputBuffer[indexR], nFrames); + arm_add_f32(SampleBuffer[indexR], SendFXOutputBuffer[indexR], SampleBuffer[indexR], nFrames); + // END adding send fx 2 + + m_MasterFXSpinLock.Acquire (); + m_MasterFX->process(SampleBuffer[indexL], SampleBuffer[indexR], SampleBuffer[indexL], SampleBuffer[indexR], nFrames); + m_MasterFXSpinLock.Release (); + } // swap stereo channels if needed prior to writing back out if (m_bChannelsSwapped)