Various items before 1.5.1
- fixed passthrough when capturing - added declicking fades when bypassing input passthrough, playback, and recording - layout tweaks for extra small windows - waveform scrollbar improvements, visible edge drag handles, and allows dragging from anywhere - minor visual tweaks - license header mods, and LICENSE file consolidation
This commit is contained in:
@ -1,19 +1,7 @@
|
||||
/*
|
||||
// SPDX-License-Identifier: GPLv3-or-later WITH Appstore-exception
|
||||
// Copyright (C) 2017 Xenakios
|
||||
// Copyright (C) 2020 Jesse Chappell
|
||||
|
||||
Copyright (C) 2017 Xenakios
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of version 3 of the GNU General Public License
|
||||
as published by the Free Software Foundation.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License (version 3) for more details.
|
||||
|
||||
www.gnu.org/licenses
|
||||
|
||||
*/
|
||||
|
||||
#include "PluginProcessor.h"
|
||||
#include "PluginEditor.h"
|
||||
@ -61,11 +49,19 @@ inline AudioParameterFloat* make_floatpar(String id, String name, float minv, fl
|
||||
return new AudioParameterFloat(id, name, NormalisableRange<float>(minv, maxv, step, skew), defv);
|
||||
}
|
||||
|
||||
#if JUCE_IOS
|
||||
#define ALTBUS_ACTIVE true
|
||||
#else
|
||||
#define ALTBUS_ACTIVE false
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
PaulstretchpluginAudioProcessor::PaulstretchpluginAudioProcessor(bool is_stand_alone_offline)
|
||||
: AudioProcessor(PaulstretchpluginAudioProcessor::BusesProperties().withInput("Main In", AudioChannelSet::stereo(), true).withOutput ("Main Out", AudioChannelSet::stereo(), true)),
|
||||
: AudioProcessor(PaulstretchpluginAudioProcessor::BusesProperties().withInput("Main In", AudioChannelSet::stereo(), true).withOutput ("Main Out", AudioChannelSet::stereo(), true).withInput ("Aux 1 In", AudioChannelSet::stereo(), ALTBUS_ACTIVE).withInput ("Aux 2 In", AudioChannelSet::stereo(), ALTBUS_ACTIVE).withInput ("Aux 3 In", AudioChannelSet::stereo(), ALTBUS_ACTIVE).withOutput ("Aux 1 Out", AudioChannelSet::stereo(), ALTBUS_ACTIVE).withOutput ("Aux 2 Out", AudioChannelSet::stereo(), ALTBUS_ACTIVE).withOutput ("Aux 3 Out", AudioChannelSet::stereo(), ALTBUS_ACTIVE)),
|
||||
m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_alone_offline)
|
||||
{
|
||||
DBG("Attempt proc const");
|
||||
|
||||
m_filechoose_callback = [this](const FileChooser& chooser)
|
||||
{
|
||||
URL resu = chooser.getURLResult();
|
||||
@ -91,13 +87,18 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_
|
||||
m_free_filter_envelope->AddNode({ 0.0,0.75 });
|
||||
m_free_filter_envelope->AddNode({ 1.0,0.75 });
|
||||
m_free_filter_envelope->set_reset_nodes(m_free_filter_envelope->get_all_nodes());
|
||||
|
||||
DBG("recbuffer");
|
||||
|
||||
m_recbuffer.setSize(2, 48000);
|
||||
m_recbuffer.clear();
|
||||
if (m_afm->getNumKnownFormats()==0)
|
||||
m_afm->registerBasicFormats();
|
||||
if (m_is_stand_alone_offline == false)
|
||||
m_thumb = std::make_unique<AudioThumbnail>(512, *m_afm, *m_thumbcache);
|
||||
|
||||
|
||||
DBG("making bool pars");
|
||||
|
||||
m_sm_enab_pars[0] = new AudioParameterBool("enab_specmodule0", "Enable harmonics", false);
|
||||
m_sm_enab_pars[1] = new AudioParameterBool("enab_specmodule1", "Enable tonal vs noise", false);
|
||||
m_sm_enab_pars[2] = new AudioParameterBool("enab_specmodule2", "Enable frequency shift", true);
|
||||
@ -108,12 +109,17 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_
|
||||
m_sm_enab_pars[7] = new AudioParameterBool("enab_specmodule7", "Enable free filter", true);
|
||||
m_sm_enab_pars[8] = new AudioParameterBool("enab_specmodule8", "Enable compressor", false);
|
||||
|
||||
DBG("making stretch source");
|
||||
|
||||
m_stretch_source = std::make_unique<StretchAudioSource>(2, m_afm,m_sm_enab_pars);
|
||||
|
||||
m_stretch_source->setOnsetDetection(0.0);
|
||||
m_stretch_source->setLoopingEnabled(true);
|
||||
m_stretch_source->setFFTWindowingType(1);
|
||||
|
||||
DBG("About to add parameters");
|
||||
|
||||
|
||||
addParameter(make_floatpar("mainvolume0", "Main volume", -24.0, 12.0, -3.0, 0.1, 1.0));
|
||||
addParameter(make_floatpar("stretchamount0", "Stretch amount", 0.1, 1024.0, 2.0, 0.1, 0.25));
|
||||
addParameter(make_floatpar("fftsize0", "FFT size", 0.0, 1.0, 0.7, 0.01, 1.0));
|
||||
@ -216,11 +222,12 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_
|
||||
|
||||
if (!m_is_stand_alone_offline) {
|
||||
setPreBufferAmount(2);
|
||||
startTimer(1, 50);
|
||||
startTimer(1, 40);
|
||||
}
|
||||
|
||||
m_show_technical_info = m_propsfile->m_props_file->getBoolValue("showtechnicalinfo", false);
|
||||
|
||||
|
||||
DBG("Constructed PS plugin");
|
||||
}
|
||||
|
||||
PaulstretchpluginAudioProcessor::~PaulstretchpluginAudioProcessor()
|
||||
@ -764,7 +771,7 @@ void PaulstretchpluginAudioProcessor::prepareToPlay(double sampleRate, int sampl
|
||||
m_adsr.setSampleRate(sampleRate);
|
||||
m_cur_sr = sampleRate;
|
||||
m_curmaxblocksize = samplesPerBlock;
|
||||
m_input_buffer.setSize(getMainBusNumInputChannels(), samplesPerBlock);
|
||||
m_input_buffer.setSize(getTotalNumInputChannels(), samplesPerBlock);
|
||||
*getBoolParameter(cpi_rewind) = false;
|
||||
m_lastrewind = false;
|
||||
int numoutchans = *m_outchansparam;
|
||||
@ -794,6 +801,8 @@ void PaulstretchpluginAudioProcessor::prepareToPlay(double sampleRate, int sampl
|
||||
{
|
||||
m_buffering_source->prepareToPlay(samplesPerBlock, getSampleRateChecked());
|
||||
}
|
||||
|
||||
m_standalone = juce::PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_Standalone;
|
||||
}
|
||||
|
||||
void PaulstretchpluginAudioProcessor::releaseResources()
|
||||
@ -808,10 +817,14 @@ bool PaulstretchpluginAudioProcessor::isBusesLayoutSupported (const BusesLayout&
|
||||
ignoreUnused (layouts);
|
||||
return true;
|
||||
#else
|
||||
|
||||
// support anything
|
||||
return true;
|
||||
|
||||
// This is the place where you check if the layout is supported.
|
||||
// In this template code we only support mono or stereo.
|
||||
if (layouts.getMainOutputChannelSet() != AudioChannelSet::mono()
|
||||
&& layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
|
||||
if ( /* layouts.getMainOutputChannelSet() != AudioChannelSet::mono() && */
|
||||
layouts.getMainOutputChannelSet() != AudioChannelSet::stereo())
|
||||
return false;
|
||||
|
||||
// This checks if the input layout matches the output layout
|
||||
@ -825,21 +838,42 @@ bool PaulstretchpluginAudioProcessor::isBusesLayoutSupported (const BusesLayout&
|
||||
}
|
||||
#endif
|
||||
|
||||
void copyAudioBufferWrappingPosition(const AudioBuffer<float>& src, AudioBuffer<float>& dest, int destbufpos, int maxdestpos)
|
||||
static void copyAudioBufferWrappingPosition(const AudioBuffer<float>& src, int numSamples, AudioBuffer<float>& dest, int destbufpos, int maxdestpos, float fademode)
|
||||
{
|
||||
int useNumSamples = jmin(numSamples, src.getNumSamples());
|
||||
|
||||
for (int i = 0; i < dest.getNumChannels(); ++i)
|
||||
{
|
||||
int channel_to_copy = i % src.getNumChannels();
|
||||
if (destbufpos + src.getNumSamples() > maxdestpos)
|
||||
if (destbufpos + useNumSamples > maxdestpos)
|
||||
{
|
||||
int wrappos = (destbufpos + src.getNumSamples()) % maxdestpos;
|
||||
int partial_len = src.getNumSamples() - wrappos;
|
||||
dest.copyFrom(channel_to_copy, destbufpos, src, channel_to_copy, 0, partial_len);
|
||||
dest.copyFrom(channel_to_copy, partial_len, src, channel_to_copy, 0, wrappos);
|
||||
int wrappos = (destbufpos + useNumSamples) % maxdestpos;
|
||||
int partial_len = useNumSamples - wrappos;
|
||||
|
||||
if (fademode == 0.0f) {
|
||||
dest.copyFrom(i, destbufpos, src, channel_to_copy, 0, partial_len);
|
||||
dest.copyFrom(i, partial_len, src, channel_to_copy, 0, wrappos);
|
||||
} else {
|
||||
//DBG("recfade wrap: " << fademode);
|
||||
if (fademode > 0.0f) {
|
||||
// fade in
|
||||
dest.copyFromWithRamp(i, destbufpos, src.getReadPointer(channel_to_copy), partial_len, fademode > 0.0f ? 0.0f : 1.0f, fademode > 0.0f ? 1.0f : 0.0f);
|
||||
dest.copyFrom(i, partial_len, src, channel_to_copy, 0, wrappos);
|
||||
} else {
|
||||
// fade out
|
||||
dest.copyFrom(i, destbufpos, src, channel_to_copy, 0, partial_len);
|
||||
dest.copyFromWithRamp(i, partial_len, src.getReadPointer(channel_to_copy), wrappos, fademode > 0.0f ? 0.0f : 1.0f, fademode > 0.0f ? 1.0f : 0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dest.copyFrom(channel_to_copy, destbufpos, src, channel_to_copy, 0, src.getNumSamples());
|
||||
if (fademode == 0.0f) {
|
||||
dest.copyFrom(i, destbufpos, src, channel_to_copy, 0, useNumSamples);
|
||||
} else {
|
||||
//DBG("recfade: " << fademode);
|
||||
dest.copyFromWithRamp(i, destbufpos, src.getReadPointer(channel_to_copy), useNumSamples, fademode > 0.0f ? 0.0f : 1.0f, fademode > 0.0f ? 1.0f : 0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -856,44 +890,110 @@ void PaulstretchpluginAudioProcessor::processBlock (AudioSampleBuffer& buffer, M
|
||||
ScopedLock locker(m_cs);
|
||||
const int totalNumInputChannels = getTotalNumInputChannels();
|
||||
const int totalNumOutputChannels = getTotalNumOutputChannels();
|
||||
AudioPlayHead* phead = getPlayHead();
|
||||
bool passthruEnabled = getParameter(cpi_passthrough) > 0.5f;
|
||||
|
||||
AudioPlayHead* phead = getPlayHead();
|
||||
bool seektostart = false;
|
||||
if (phead != nullptr)
|
||||
{
|
||||
phead->getCurrentPosition(m_playposinfo);
|
||||
|
||||
if (m_playposinfo.isPlaying && m_playposinfo.ppqPosition == 0.0 || m_playposinfo.timeInSamples == 0) {
|
||||
seektostart = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
else {
|
||||
m_playposinfo.isPlaying = false;
|
||||
}
|
||||
|
||||
ScopedNoDenormals noDenormals;
|
||||
double srtemp = getSampleRate();
|
||||
if (srtemp != m_cur_sr)
|
||||
m_cur_sr = srtemp;
|
||||
m_prebufsmoother.setSlope(0.9, srtemp / buffer.getNumSamples());
|
||||
m_smoothed_prebuffer_ready = m_prebufsmoother.process(m_buffering_source->getPercentReady());
|
||||
|
||||
|
||||
if (buffer.getNumSamples() > m_input_buffer.getNumSamples()) {
|
||||
// just in case
|
||||
m_input_buffer.setSize(totalNumInputChannels, buffer.getNumSamples(), false, false, true);
|
||||
}
|
||||
|
||||
|
||||
for (int i = 0; i < totalNumInputChannels; ++i)
|
||||
m_input_buffer.copyFrom(i, 0, buffer, i, 0, buffer.getNumSamples());
|
||||
for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
|
||||
buffer.clear (i, 0, buffer.getNumSamples());
|
||||
|
||||
float fadepassthru = 0.0f;
|
||||
if (!passthruEnabled) {
|
||||
if (m_lastpassthru != passthruEnabled) {
|
||||
// ramp it down
|
||||
fadepassthru = -1.0f;
|
||||
for (int i = 0; i < totalNumInputChannels; ++i)
|
||||
buffer.applyGainRamp(i, 0, buffer.getNumSamples(), 1.0f, 0.0f);
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < totalNumInputChannels; ++i)
|
||||
buffer.clear (i, 0, buffer.getNumSamples());
|
||||
}
|
||||
}
|
||||
else if (passthruEnabled != m_lastpassthru) {
|
||||
// ramp it up
|
||||
fadepassthru = 1.0f;
|
||||
for (int i = 0; i < totalNumInputChannels; ++i)
|
||||
buffer.applyGainRamp(i, 0, buffer.getNumSamples(), 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
m_lastpassthru = passthruEnabled;
|
||||
|
||||
float recfade = 0.0f;
|
||||
if (m_is_recording != m_is_recording_pending) {
|
||||
recfade = m_is_recording_pending ? 1.0f : -1.0f;
|
||||
m_is_recording = m_is_recording_pending;
|
||||
}
|
||||
|
||||
|
||||
if (m_previewcomponent != nullptr)
|
||||
{
|
||||
m_previewcomponent->processBlock(getSampleRate(), buffer);
|
||||
return;
|
||||
}
|
||||
if (m_prebuffering_inited == false)
|
||||
|
||||
if (m_prebuffering_inited == false)
|
||||
return;
|
||||
if (m_is_recording == true)
|
||||
|
||||
if (m_is_recording == true || recfade != 0.0f)
|
||||
{
|
||||
if (m_playposinfo.isPlaying == false && m_capture_when_host_plays == true)
|
||||
if (m_playposinfo.isPlaying == false && m_capture_when_host_plays == true && !m_standalone) {
|
||||
if (!m_is_recording)
|
||||
m_is_recording_finished = true;
|
||||
return;
|
||||
}
|
||||
|
||||
int recbuflenframes = m_max_reclen * getSampleRate();
|
||||
copyAudioBufferWrappingPosition(buffer, m_recbuffer, m_rec_pos, recbuflenframes);
|
||||
m_thumb->addBlock(m_rec_pos, buffer, 0, buffer.getNumSamples());
|
||||
copyAudioBufferWrappingPosition(m_input_buffer, buffer.getNumSamples(), m_recbuffer, m_rec_pos, recbuflenframes, recfade);
|
||||
m_thumb->addBlock(m_rec_pos, m_input_buffer, 0, buffer.getNumSamples());
|
||||
m_rec_pos = (m_rec_pos + buffer.getNumSamples()) % recbuflenframes;
|
||||
m_rec_count += buffer.getNumSamples();
|
||||
|
||||
if (!m_is_recording) {
|
||||
// to signal that it may be written, etc
|
||||
m_is_recording_finished = true;
|
||||
}
|
||||
|
||||
if (m_rec_count<recbuflenframes)
|
||||
m_recorded_range = { 0, m_rec_count };
|
||||
if (m_mute_while_capturing == true)
|
||||
buffer.clear();
|
||||
if (m_mute_while_capturing == true && passthruEnabled) {
|
||||
if (recfade < 0.0f) {
|
||||
buffer.applyGainRamp(0, buffer.getNumSamples(), 1.0f, 0.0f);
|
||||
}
|
||||
else if (recfade > 0.0f) {
|
||||
buffer.applyGainRamp(0, buffer.getNumSamples(), 0.0f, 1.0f);
|
||||
}
|
||||
else {
|
||||
buffer.clear();
|
||||
}
|
||||
}
|
||||
|
||||
if (m_mute_processed_while_capturing == true)
|
||||
return;
|
||||
@ -904,17 +1004,30 @@ void PaulstretchpluginAudioProcessor::processBlock (AudioSampleBuffer& buffer, M
|
||||
double t1 = *getFloatParameter(cpi_soundend);
|
||||
sanitizeTimeRange(t0, t1);
|
||||
m_stretch_source->setPlayRange({ t0,t1 });
|
||||
|
||||
float fadeproc = 0.0f;
|
||||
|
||||
if (m_last_host_playing == false && m_playposinfo.isPlaying)
|
||||
{
|
||||
m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart));
|
||||
if (m_play_when_host_plays) {
|
||||
// should we even do this ever?
|
||||
if (seektostart)
|
||||
m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart));
|
||||
fadeproc = 1.0f; // fadein
|
||||
}
|
||||
m_last_host_playing = true;
|
||||
}
|
||||
else if (m_last_host_playing == true && m_playposinfo.isPlaying == false)
|
||||
{
|
||||
m_last_host_playing = false;
|
||||
if (m_play_when_host_plays) {
|
||||
fadeproc = -1.0f; // fadeout
|
||||
}
|
||||
}
|
||||
if (m_play_when_host_plays == true && m_playposinfo.isPlaying == false)
|
||||
|
||||
if (m_play_when_host_plays == true && m_playposinfo.isPlaying == false && !m_standalone && fadeproc == 0.0f)
|
||||
return;
|
||||
|
||||
m_free_filter_envelope->m_transform_x_shift = *getFloatParameter(cpi_freefilter_shiftx);
|
||||
m_free_filter_envelope->m_transform_y_shift = *getFloatParameter(cpi_freefilter_shifty);
|
||||
m_free_filter_envelope->m_transform_y_scale = *getFloatParameter(cpi_freefilter_scaley);
|
||||
@ -995,13 +1108,31 @@ void PaulstretchpluginAudioProcessor::processBlock (AudioSampleBuffer& buffer, M
|
||||
{
|
||||
m_buffering_source->getNextAudioBlock(aif);
|
||||
}
|
||||
if ( getParameter(cpi_passthrough) > 0.5f)
|
||||
|
||||
// fade processing if necessary
|
||||
if (fadeproc != 0.0f) {
|
||||
buffer.applyGainRamp(0, buffer.getNumSamples(), fadeproc > 0.0f ? 0.0f : 1.0f, fadeproc > 0.0f ? 1.0f : 0.0f);
|
||||
}
|
||||
|
||||
if (fadepassthru != 0.0f
|
||||
|| (passthruEnabled && (!m_is_recording || !m_mute_while_capturing))
|
||||
|| (recfade != 0.0f && m_mute_while_capturing))
|
||||
{
|
||||
if (recfade != 0.0f && m_mute_while_capturing) {
|
||||
// DBG("Invert recfade");
|
||||
fadepassthru = -recfade;
|
||||
}
|
||||
|
||||
for (int i = 0; i < totalNumInputChannels; ++i)
|
||||
{
|
||||
buffer.addFrom(i, 0, m_input_buffer, i, 0, buffer.getNumSamples());
|
||||
if (fadepassthru != 0.0f) {
|
||||
buffer.addFromWithRamp(i, 0, m_input_buffer.getReadPointer(i), buffer.getNumSamples(), fadepassthru > 0.0f ? 0.0f : 1.0f, fadepassthru > 0.0f ? 1.0f : 0.0f);
|
||||
}
|
||||
else
|
||||
buffer.addFrom(i, 0, m_input_buffer, i, 0, buffer.getNumSamples());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool abnordetected = false;
|
||||
for (int i = 0; i < buffer.getNumChannels(); ++i)
|
||||
{
|
||||
@ -1078,22 +1209,23 @@ void PaulstretchpluginAudioProcessor::setRecordingEnabled(bool b)
|
||||
m_recbuffer.clear();
|
||||
m_rec_pos = 0;
|
||||
m_thumb->reset(m_recbuffer.getNumChannels(), getSampleRateChecked(), lenbufframes);
|
||||
m_is_recording = true;
|
||||
m_recorded_range = Range<int>();
|
||||
m_rec_count = 0;
|
||||
m_is_recording_pending = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_is_recording == true)
|
||||
{
|
||||
finishRecording(lenbufframes);
|
||||
}
|
||||
if (m_is_recording == true) {
|
||||
|
||||
m_is_recording_finished = false; // will be marked true when the recording is truly done
|
||||
m_is_recording_pending = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double PaulstretchpluginAudioProcessor::getRecordingPositionPercent()
|
||||
{
|
||||
if (m_is_recording==false)
|
||||
if (m_is_recording_pending==false)
|
||||
return 0.0;
|
||||
return 1.0 / m_recbuffer.getNumSamples()*m_rec_pos;
|
||||
}
|
||||
@ -1117,9 +1249,14 @@ String PaulstretchpluginAudioProcessor::setAudioFile(const URL & url)
|
||||
}
|
||||
if (m_thumb)
|
||||
m_thumb->setSource(new FileInputSource(file));
|
||||
ScopedLock locker(m_cs);
|
||||
m_stretch_source->setAudioFile(url);
|
||||
//Range<double> currange{ *getFloatParameter(cpi_soundstart),*getFloatParameter(cpi_soundend) };
|
||||
|
||||
|
||||
// lets not lock
|
||||
//ScopedLock locker(m_cs);
|
||||
|
||||
m_stretch_source->setAudioFile(url);
|
||||
|
||||
//Range<double> currange{ *getFloatParameter(cpi_soundstart),*getFloatParameter(cpi_soundend) };
|
||||
//if (currange.contains(m_stretch_source->getInfilePositionPercent())==false)
|
||||
m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart));
|
||||
m_current_file = url;
|
||||
@ -1160,16 +1297,25 @@ void PaulstretchpluginAudioProcessor::timerCallback(int id)
|
||||
m_max_reclen = *getFloatParameter(cpi_max_capture_len);
|
||||
//Logger::writeToLog("Changing max capture len to " + String(m_max_reclen));
|
||||
}
|
||||
if (capture == true && m_is_recording == false)
|
||||
if (capture == true && m_is_recording_pending == false)
|
||||
{
|
||||
setRecordingEnabled(true);
|
||||
return;
|
||||
}
|
||||
if (capture == false && m_is_recording == true)
|
||||
if (capture == false && m_is_recording_pending == true)
|
||||
{
|
||||
setRecordingEnabled(false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_is_recording_finished) {
|
||||
DBG("Recording is actually done, commit the finish");
|
||||
int lenbufframes = getSampleRateChecked()*m_max_reclen;
|
||||
finishRecording(lenbufframes);
|
||||
m_is_recording_finished = false;
|
||||
}
|
||||
|
||||
|
||||
if (m_cur_num_out_chans != *m_outchansparam)
|
||||
{
|
||||
jassert(m_curmaxblocksize > 0);
|
||||
@ -1224,7 +1370,8 @@ pointer_sized_int PaulstretchpluginAudioProcessor::handleVstManufacturerSpecific
|
||||
|
||||
void PaulstretchpluginAudioProcessor::finishRecording(int lenrecording)
|
||||
{
|
||||
m_is_recording = false;
|
||||
m_is_recording_finished = false;
|
||||
m_is_recording_pending = false;
|
||||
m_current_file = URL();
|
||||
m_stretch_source->setAudioBufferAsInputSource(&m_recbuffer, getSampleRateChecked(), lenrecording);
|
||||
*getFloatParameter(cpi_soundstart) = 0.0f;
|
||||
|
Reference in New Issue
Block a user