@@ -51,11 +51,12 @@ void PCM::Add(int16_t const* const samples, uint32_t channels, size_t const coun
5151void PCM::UpdateFrameAudioData (double secondsSinceLastFrame, uint32_t frame)
5252{
5353 // 1. Copy audio data from input buffer
54- CopyNewWaveformData ();
54+ CopyNewWaveformData (m_inputBufferL, m_waveformL);
55+ CopyNewWaveformData (m_inputBufferR, m_waveformR);
5556
5657 // 2. Update spectrum analyzer data for both channels
57- UpdateFftChannel ( 0 );
58- UpdateFftChannel ( 1 );
58+ UpdateSpectrum (m_waveformL, m_spectrumL );
59+ UpdateSpectrum (m_waveformR, m_spectrumR );
5960
6061 // 3. Align waveforms
6162 m_alignL.Align (m_waveformL);
@@ -91,43 +92,32 @@ auto PCM::GetFrameAudioData() const -> FrameAudioData
9192 return data;
9293}
9394
94- void PCM::UpdateFftChannel ( size_t const channel )
95+ void PCM::UpdateSpectrum ( const WaveformBuffer& waveformData, SpectrumBuffer& spectrumData )
9596{
96- assert (channel == 0 || channel == 1 );
97-
9897 std::vector<float > waveformSamples (AudioBufferSamples);
9998 std::vector<float > spectrumValues;
10099
101- auto const & from = channel == 0 ? m_waveformL : m_waveformR;
102- auto & spectrum = channel == 0 ? m_spectrumL : m_spectrumR;
103-
104100 size_t oldI{0 };
105101 for (size_t i = 0 ; i < AudioBufferSamples; i++)
106102 {
107103 // Damp the input into the FFT a bit, to reduce high-frequency noise:
108- waveformSamples[i] = 0 .5f * (from [i] + from [oldI]);
104+ waveformSamples[i] = 0 .5f * (waveformData [i] + waveformData [oldI]);
109105 oldI = i;
110106 }
111107
112108 m_fft.TimeToFrequencyDomain (waveformSamples, spectrumValues);
113109
114- std::copy (spectrumValues.begin (), spectrumValues.end (), spectrum .begin ());
110+ std::copy (spectrumValues.begin (), spectrumValues.end (), spectrumData .begin ());
115111}
116112
117- void PCM::CopyNewWaveformData ()
113+ void PCM::CopyNewWaveformData (const WaveformBuffer& source, WaveformBuffer& destination )
118114{
119- const auto & copyChannel =
120- [](size_t start, const std::array<float , AudioBufferSamples>& inputSamples, std::array<float , AudioBufferSamples>& outputSamples)
121- {
122- for (size_t i = 0 ; i < AudioBufferSamples; i++)
123- {
124- outputSamples[i] = inputSamples[(start + i) % AudioBufferSamples];
125- }
126- };
127-
128115 auto const bufferStartIndex = m_start.load ();
129- copyChannel (bufferStartIndex, m_inputBufferL, m_waveformL);
130- copyChannel (bufferStartIndex, m_inputBufferR, m_waveformR);
116+
117+ for (size_t i = 0 ; i < AudioBufferSamples; i++)
118+ {
119+ destination[i] = source[(bufferStartIndex + i) % AudioBufferSamples];
120+ }
131121}
132122
133123
0 commit comments