ProcessSound: do not optimize for special values

this makes the code easier to understand and the execution more predictable
pull/952/head
Gergo Koteles 6 days ago
parent ce9f82ca51
commit 7c68142b6b
  1. 131
      src/minidexed.cpp

@ -1354,33 +1354,20 @@ void CMiniDexed::ProcessSound (void)
float32_t tmp_float[nFrames*Channels]; float32_t tmp_float[nFrames*Channels];
int32_t tmp_int[nFrames*Channels]; int32_t tmp_int[nFrames*Channels];
if(nMasterVolume > 0.0) // Convert dual float array (8 chan) to single int16 array (8 chan)
for(uint16_t i=0; i<nFrames;i++)
{ {
// Convert dual float array (8 chan) to single int16 array (8 chan) // TGs will alternate on L/R channels for each output
for(uint16_t i=0; i<nFrames;i++) // reading directly from the TG OutputLevel buffer with
// no additional processing.
for (uint8_t tg = 0; tg < Channels; tg++)
{ {
// TGs will alternate on L/R channels for each output tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i] * nMasterVolume;
// reading directly from the TG OutputLevel buffer with
// no additional processing.
for (uint8_t tg = 0; tg < Channels; tg++)
{
if(nMasterVolume >0.0 && nMasterVolume <1.0)
{
tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i] * nMasterVolume;
}
else if(nMasterVolume == 1.0)
{
tmp_float[(i*Channels)+tg]=m_OutputLevel[tg][i];
}
}
} }
arm_float_to_q23(tmp_float,tmp_int,nFrames*Channels);
}
else
{
arm_fill_q31(0, tmp_int, nFrames*Channels);
} }
arm_float_to_q23(tmp_float,tmp_int,nFrames*Channels);
// Prevent PCM510x analog mute from kicking in // Prevent PCM510x analog mute from kicking in
for (uint8_t tg = 0; tg < Channels; tg++) for (uint8_t tg = 0; tg < Channels; tg++)
{ {
@ -1404,78 +1391,64 @@ void CMiniDexed::ProcessSound (void)
float32_t tmp_float[nFrames*2]; float32_t tmp_float[nFrames*2];
int32_t tmp_int[nFrames*2]; int32_t tmp_int[nFrames*2];
if(nMasterVolume > 0.0) // get the mix buffer of all TGs
{ float32_t *SampleBuffer[2];
// get the mix buffer of all TGs tg_mixer->getBuffers(SampleBuffer);
float32_t *SampleBuffer[2];
tg_mixer->getBuffers(SampleBuffer);
tg_mixer->zeroFill(); tg_mixer->zeroFill();
for (uint8_t i = 0; i < m_nToneGenerators; i++) for (uint8_t i = 0; i < m_nToneGenerators; i++)
{ {
tg_mixer->doAddMix(i,m_OutputLevel[i]); tg_mixer->doAddMix(i,m_OutputLevel[i]);
} }
// END TG mixing // END TG mixing
// BEGIN adding reverb
if (m_nParameter[ParameterReverbEnable])
{
float32_t ReverbBuffer[2][nFrames];
float32_t *ReverbSendBuffer[2]; // BEGIN adding reverb
reverb_send_mixer->getBuffers(ReverbSendBuffer); if (m_nParameter[ParameterReverbEnable])
{
float32_t ReverbBuffer[2][nFrames];
reverb_send_mixer->zeroFill(); float32_t *ReverbSendBuffer[2];
reverb_send_mixer->getBuffers(ReverbSendBuffer);
for (uint8_t i = 0; i < m_nToneGenerators; i++) reverb_send_mixer->zeroFill();
{
reverb_send_mixer->doAddMix(i,m_OutputLevel[i]);
}
m_ReverbSpinLock.Acquire (); for (uint8_t i = 0; i < m_nToneGenerators; i++)
{
reverb_send_mixer->doAddMix(i,m_OutputLevel[i]);
}
reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[indexL], ReverbBuffer[indexR],nFrames); m_ReverbSpinLock.Acquire ();
// scale down and add left reverb buffer by reverb level reverb->doReverb(ReverbSendBuffer[indexL],ReverbSendBuffer[indexR],ReverbBuffer[indexL], ReverbBuffer[indexR],nFrames);
arm_scale_f32(ReverbBuffer[indexL], reverb->get_level(), ReverbBuffer[indexL], nFrames);
arm_add_f32(SampleBuffer[indexL], ReverbBuffer[indexL], SampleBuffer[indexL], nFrames);
// scale down and add right reverb buffer by reverb level
arm_scale_f32(ReverbBuffer[indexR], reverb->get_level(), ReverbBuffer[indexR], nFrames);
arm_add_f32(SampleBuffer[indexR], ReverbBuffer[indexR], SampleBuffer[indexR], nFrames);
m_ReverbSpinLock.Release (); // scale down and add left reverb buffer by reverb level
} arm_scale_f32(ReverbBuffer[indexL], reverb->get_level(), ReverbBuffer[indexL], nFrames);
// END adding reverb arm_add_f32(SampleBuffer[indexL], ReverbBuffer[indexL], SampleBuffer[indexL], nFrames);
// scale down and add right reverb buffer by reverb level
arm_scale_f32(ReverbBuffer[indexR], reverb->get_level(), ReverbBuffer[indexR], nFrames);
arm_add_f32(SampleBuffer[indexR], ReverbBuffer[indexR], SampleBuffer[indexR], nFrames);
// swap stereo channels if needed prior to writing back out m_ReverbSpinLock.Release ();
if (m_bChannelsSwapped) }
{ // END adding reverb
indexL=1;
indexR=0;
}
// Convert dual float array (left, right) to single int16 array (left/right) // swap stereo channels if needed prior to writing back out
for(uint16_t i=0; i<nFrames;i++) if (m_bChannelsSwapped)
{ {
if(nMasterVolume >0.0 && nMasterVolume <1.0) indexL=1;
{ indexR=0;
tmp_float[i*2]=SampleBuffer[indexL][i] * nMasterVolume;
tmp_float[(i*2)+1]=SampleBuffer[indexR][i] * nMasterVolume;
}
else if(nMasterVolume == 1.0)
{
tmp_float[i*2]=SampleBuffer[indexL][i];
tmp_float[(i*2)+1]=SampleBuffer[indexR][i];
}
}
arm_float_to_q23(tmp_float,tmp_int,nFrames*2);
} }
else
// Convert dual float array (left, right) to single int16 array (left/right)
for(uint16_t i=0; i<nFrames;i++)
{ {
arm_fill_q31(0, tmp_int, nFrames * 2); tmp_float[i*2]=SampleBuffer[indexL][i] * nMasterVolume;
tmp_float[(i*2)+1]=SampleBuffer[indexR][i] * nMasterVolume;
} }
arm_float_to_q23(tmp_float,tmp_int,nFrames*2);
// Prevent PCM510x analog mute from kicking in // Prevent PCM510x analog mute from kicking in
if (tmp_int[nFrames * 2 - 1] == 0) if (tmp_int[nFrames * 2 - 1] == 0)
{ {

Loading…
Cancel
Save