@@ -36,9 +36,6 @@ namespace audio
3636 meters ()
3737#if PPDHasStereoConfig
3838 , midSideEnabled(false )
39- #endif
40- #if PPDHasSidechain
41- , scBuffer()
4239#endif
4340 {
4441 {
@@ -78,6 +75,9 @@ namespace audio
7875
7976 bool ProcessorBackEnd::canAddBus (bool isInput) const
8077 {
78+ if (wrapperType == wrapperType_Standalone)
79+ return false ;
80+
8181 return PPDHasSidechain ? isInput : false ;
8282 }
8383
@@ -161,14 +161,19 @@ namespace audio
161161 void ProcessorBackEnd::processBlockBypassed (AudioBuffer& buffer, juce::MidiBuffer&)
162162 {
163163 macroProcessor ();
164- if (sus.suspendIfNeeded (buffer))
164+
165+ auto mainBus = getBus (true , 0 );
166+ auto mainBuffer = mainBus->getBusBuffer (buffer);
167+
168+ if (sus.suspendIfNeeded (mainBuffer))
165169 return ;
166- const auto numSamples = buffer .getNumSamples ();
170+ const auto numSamples = mainBuffer .getNumSamples ();
167171 if (numSamples == 0 )
168172 return ;
169- auto samples = buffer.getArrayOfWritePointers ();
170- const auto constSamples = buffer.getArrayOfReadPointers ();
171- const auto numChannels = buffer.getNumChannels ();
173+
174+ auto samples = mainBuffer.getArrayOfWritePointers ();
175+ const auto constSamples = mainBuffer.getArrayOfReadPointers ();
176+ const auto numChannels = mainBuffer.getNumChannels ();
172177
173178 dryWetMix.processBypass (samples, numChannels, numSamples);
174179#if PPDHasGainIn
@@ -177,25 +182,58 @@ namespace audio
177182 meters.processOut (constSamples, numChannels, numSamples);
178183 }
179184
180- AudioBuffer* ProcessorBackEnd::processBlockStart (AudioBuffer& buffer, juce::MidiBuffer& midi) noexcept
185+ // PROCESSOR
186+
187+ Processor::Processor () :
188+ ProcessorBackEnd ()
181189 {
182- midiLearn (midi);
190+ }
191+
192+ void Processor::prepareToPlay (double sampleRate, int maxBlockSize)
193+ {
194+ auto latency = 0 ;
195+ #if PPDHasHQ
196+ oversampler.setEnabled (params[PID ::HQ ]->getValMod () > .5f );
197+ oversampler.prepare (sampleRate, maxBlockSize);
198+ // const auto sampleRateUp = oversampler.getFsUp();
199+ // const auto sampleRateUpF = static_cast<float>(sampleRateUp);
200+ // const auto blockSizeUp = oversampler.getBlockSizeUp();
201+ latency = oversampler.getLatency ();
202+ #endif
203+ const auto sampleRateF = static_cast <float >(sampleRate);
204+
205+ dryWetMix.prepare (sampleRateF, maxBlockSize, latency);
206+
207+ meters.prepare (sampleRateF, maxBlockSize);
208+
209+ setLatencySamples (latency);
183210
211+ sus.prepareToPlay ();
212+ }
213+
214+ void Processor::processBlock (AudioBuffer& buffer, juce::MidiBuffer& midi)
215+ {
216+ const ScopedNoDenormals noDenormals;
217+
218+ midiLearn (midi);
184219 macroProcessor ();
185220
186- const auto numSamples = buffer.getNumSamples ();
221+ auto mainBus = getBus (true , 0 );
222+ auto mainBuffer = mainBus->getBusBuffer (buffer);
223+
224+ if (sus.suspendIfNeeded (mainBuffer))
225+ return ;
226+
227+ const auto numSamples = mainBuffer.getNumSamples ();
187228 if (numSamples == 0 )
188- return nullptr ;
229+ return ;
189230
190231 if (params[PID ::Power]->getValMod () < .5f )
191- {
192- processBlockBypassed (buffer, midi);
193- return nullptr ;
194- }
195-
196- const auto numChannels = buffer.getNumChannels () == 1 ? 1 : 2 ;
232+ return processBlockBypassed (buffer, midi);
197233
198- auto samples = buffer.getArrayOfWritePointers ();
234+ const auto samples = mainBuffer.getArrayOfWritePointers ();
235+ const auto constSamples = mainBuffer.getArrayOfReadPointers ();
236+ const auto numChannels = mainBuffer.getNumChannels ();
199237
200238 dryWetMix.saveDry (
201239 samples,
@@ -213,49 +251,62 @@ namespace audio
213251 , params[PID ::UnityGain]->getValMod ()
214252#endif
215253 );
254+
216255#if PPDHasGainIn
217- const auto constSamples = buffer.getArrayOfReadPointers ();
218256 meters.processIn (constSamples, numChannels, numSamples);
219257#endif
258+
220259#if PPDHasStereoConfig
221260 midSideEnabled = numChannels == 2 && params[PID ::StereoConfig]->getValMod () > .5f ;
222261 if (midSideEnabled)
223- {
224- encodeMS (samples, numSamples);
225- {
262+ encodeMS (samples, numSamples, 0 );
263+ # endif
264+
226265#if PPDHasHQ
227- return &oversampler.upsample (buffer);
266+ auto resampledBuf = &oversampler.upsample (buffer);
228267#else
229- return &buffer;
268+ auto resampledBuf = &buffer;
230269#endif
231- }
270+
271+ #if PPDHasSidechain
272+ if (wrapperType != wrapperType_Standalone)
273+ {
274+ const auto scBus = getBus (true , 1 );
275+ if (scBus != nullptr )
276+ if (scBus->isEnabled ())
277+ {
278+ const auto scBuffer = scBus->getBusBuffer (*resampledBuf);
279+
280+ processBlockCustom (
281+ resampledBuf->getArrayOfWritePointers (),
282+ resampledBuf->getNumChannels (),
283+ resampledBuf->getNumSamples (),
284+ scBuffer.getArrayOfReadPointers (),
285+ scBuffer.getNumChannels ()
286+ );
287+ }
232288 }
233289 else
234- #endif
235290 {
236- # if PPDHasHQ
237- return &oversampler. upsample (buffer);
291+
292+ }
238293#else
239- return &buffer;
294+ processBlockCustom (
295+ resampledBuf->getArrayOfWritePointers (),
296+ resampledBuf->getNumChannels (),
297+ resampledBuf->getNumSamples ()
298+ );
240299#endif
241- }
242- }
243-
244- void ProcessorBackEnd::processBlockEnd (AudioBuffer& buffer) noexcept
245- {
300+
246301#if PPDHasHQ
247- oversampler.downsample (buffer );
302+ oversampler.downsample (mainBuffer );
248303#endif
249- const auto samples = buffer.getArrayOfWritePointers ();
250- const auto constSamples = buffer.getArrayOfReadPointers ();
251- const auto numChannels = buffer.getNumChannels ();
252- const auto numSamples = buffer.getNumSamples ();
253304
254305#if PPDHasStereoConfig
255306 if (midSideEnabled)
256- decodeMS (samples, numSamples);
307+ decodeMS (samples, numSamples, 0 );
257308#endif
258-
309+
259310 dryWetMix.processOutGain (samples, numChannels, numSamples);
260311 meters.processOut (constSamples, numChannels, numSamples);
261312 dryWetMix.processMix (samples, numChannels, numSamples);
@@ -276,71 +327,22 @@ namespace audio
276327#endif
277328 }
278329
279- // PROCESSOR
280-
281- Processor::Processor () :
282- ProcessorBackEnd ()
283- {
284- }
285-
286- void Processor::prepareToPlay (double sampleRate, int maxBlockSize)
287- {
330+ void Processor::processBlockCustom (float ** samples, int numChannels, int numSamples
288331#if PPDHasSidechain
289- scBuffer.setSize (2 , maxBlockSize, false , false , false );
290- #endif
291-
292- auto latency = 0 ;
293- #if PPDHasHQ
294- oversampler.setEnabled (params[PID ::HQ ]->getValMod () > .5f );
295- oversampler.prepare (sampleRate, maxBlockSize);
296- const auto sampleRateUp = oversampler.getFsUp ();
297- const auto sampleRateUpF = static_cast <float >(sampleRateUp);
298- const auto blockSizeUp = oversampler.getBlockSizeUp ();
299- latency = oversampler.getLatency ();
332+ , const float ** samplesSC, int numChannelsSC
300333#endif
301- const auto sampleRateF = static_cast <float >(sampleRate);
302-
303- dryWetMix.prepare (sampleRateF, maxBlockSize, latency);
304-
305- meters.prepare (sampleRateF, maxBlockSize);
306-
307- setLatencySamples (latency);
308-
309- sus.prepareToPlay ();
310- }
311-
312- void Processor::processBlock (AudioBuffer& buffer, juce::MidiBuffer& midi)
334+ ) noexcept
313335 {
314- const juce::ScopedNoDenormals noDenormals;
315-
316- if (sus.suspendIfNeeded (buffer))
317- return ;
318-
319- auto buf = processBlockStart (buffer, midi);
320- if (buf == nullptr )
321- return ;
322-
323- #if PPDHasSidechain
324- // const auto scBus = getBus(true, 1);
325- // if (scBus == nullptr || !scBus->isEnabled())
326- // return;
327-
328- // scBuffer = scBus->getBusBuffer(scBuffer);
329- #endif
330-
331- processBlockCustom (
332- buf->getArrayOfWritePointers (),
333- buf->getNumChannels (),
334- buf->getNumSamples ()
335- );
336-
337- processBlockEnd (buffer);
338- }
336+ for (auto ch = 0 ; ch < numChannels; ++ch)
337+ {
338+ const auto chSC = ch % numChannelsSC;
339+ const auto smplsSC = samplesSC[chSC];
340+
341+ auto smpls = samples[ch];
339342
340- void Processor::processBlockCustom (float ** samples, int numChannels, int numSamples) noexcept
341- {
342- const auto crushGain = params[PID ::CrushGain]->getValModDenorm ();
343- crush (samples, numChannels, numSamples, crushGain);
343+ for (auto s = 0 ; s < numSamples; ++s)
344+ smpls[s] *= smplsSC[s] * 2 .f ;
345+ }
344346 }
345347
346348 void Processor::releaseResources () {}
@@ -359,4 +361,4 @@ namespace audio
359361juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter ()
360362{
361363 return new audio::Processor ();
362- }
364+ }
0 commit comments