77#include " DistrhoPlugin.hpp"
88#include " extra/RingBuffer.hpp"
99
10+ #include < cassert>
11+
1012#include " rnnoise.h"
1113
1214START_NAMESPACE_DISTRHO
@@ -22,9 +24,9 @@ class ReNooicePlugin : public Plugin
2224 float * const bufferIn = new float [denoiseFrameSize];
2325 float * const bufferOut = new float [denoiseFrameSize];
2426
25- HeapRingBuffer ringBufferIn;
2627 HeapRingBuffer ringBufferOut;
2728
29+ uint32_t bufferInPos = 0 ;
2830 bool processing = false ;
2931
3032 enum Parameters {
@@ -141,35 +143,18 @@ class ReNooicePlugin : public Plugin
141143
142144 void activate () override
143145 {
144- const uint32_t ringBufferSize = denoiseFrameSize * 3 * sizeof (float );
145- ringBufferIn.createBuffer (ringBufferSize);
146+ const uint32_t ringBufferSize = denoiseFrameSize * 2 * sizeof (float );
146147 ringBufferOut.createBuffer (ringBufferSize);
147- processing = false ;
148148 parameters[kParamCurVAD ] = parameters[kParamMaxVAD ] = 0 .f ;
149+ processing = false ;
150+ bufferInPos = 0 ;
149151 }
150152
151153 void deactivate () override
152154 {
153- ringBufferIn.deleteBuffer ();
154155 ringBufferOut.deleteBuffer ();
155156 }
156157
157- void runDenoise ()
158- {
159- // extract input data from ringbuffer
160- ringBufferIn.readCustomData (bufferIn, denoiseFrameSize * sizeof (float ));
161-
162- // run denoise
163- parameters[kParamCurVAD ] = rnnoise_process_frame (denoise, bufferOut, bufferIn);
164-
165- if (parameters[kParamCurVAD ] > parameters[kParamMaxVAD ])
166- parameters[kParamMaxVAD ] = parameters[kParamCurVAD ];
167-
168- // write denoise output into ringbuffer
169- ringBufferOut.writeCustomData (bufferOut, denoiseFrameSize * sizeof (float ));
170- ringBufferOut.commitWrite ();
171- }
172-
173158 /* *
174159 Run/process function for plugins without MIDI input.
175160 @note Some parameters might be null if there are no audio inputs or outputs.
@@ -181,22 +166,36 @@ class ReNooicePlugin : public Plugin
181166
182167 for (uint32_t offset = 0 ; offset != frames;)
183168 {
184- const uint32_t framesCycle = std::min (denoiseFrameSize, frames - offset);
169+ const uint32_t framesCycle = std::min (denoiseFrameSize - bufferInPos, frames - offset);
170+
171+ // copy input data into buffer
172+ std::memcpy (bufferIn + bufferInPos, input + offset, framesCycle * sizeof (float ));
185173
186- // write input data into ringbuffer
187- ringBufferIn.writeCustomData (input + offset, framesCycle * sizeof (float ));
188- ringBufferIn.commitWrite ();
174+ bufferInPos += framesCycle;
175+ assert (bufferInPos <= denoiseFrameSize);
176+
177+ // run denoise once input buffer is full
178+ if (bufferInPos == denoiseFrameSize)
179+ {
180+ bufferInPos = 0 ;
189181
190- if (ringBufferIn.getReadableDataSize () / sizeof (float ) >= denoiseFrameSize)
191- runDenoise ();
182+ parameters[kParamCurVAD ] = rnnoise_process_frame (denoise, bufferOut, bufferIn);
183+
184+ if (parameters[kParamCurVAD ] > parameters[kParamMaxVAD ])
185+ parameters[kParamMaxVAD ] = parameters[kParamCurVAD ];
186+
187+ // write denoise output into ringbuffer
188+ ringBufferOut.writeCustomData (bufferOut, denoiseFrameSize * sizeof (float ));
189+ ringBufferOut.commitWrite ();
190+ }
192191
193192 if (processing)
194193 {
195194 ringBufferOut.readCustomData (output + offset, framesCycle * sizeof (float ));
196195 }
197196 else
198197 {
199- std::memset (output + offset, 0 , sizeof (float ) * framesCycle );
198+ std::memset (output + offset, 0 , framesCycle * sizeof (float ));
200199
201200 if (ringBufferOut.getReadableDataSize () / sizeof (float ) >= denoiseFrameSize)
202201 processing = true ;
0 commit comments