Convert std::shared_ptr<Sample> to Sample

This conversion does not apply to Patman as there seems to be issues
with it causing heap-use-after-free issues, such as with
PatmanInstrument::unloadCurrentPatch
This commit is contained in:
sakertooth
2023-09-27 17:20:59 -04:00
parent 8689a68ad5
commit 900e52cc1a
8 changed files with 53 additions and 54 deletions

View File

@@ -77,7 +77,6 @@ Plugin::Descriptor PLUGIN_EXPORT audiofileprocessor_plugin_descriptor =
AudioFileProcessor::AudioFileProcessor( InstrumentTrack * _instrument_track ) :
Instrument( _instrument_track, &audiofileprocessor_plugin_descriptor ),
m_sample(std::make_shared<Sample>()),
m_ampModel( 100, 0, 500, 1, this, tr( "Amplify" ) ),
m_startPointModel( 0, 0, 1, 0.0000001f, this, tr( "Start of sample" ) ),
m_endPointModel( 1, 0, 1, 0.0000001f, this, tr( "End of sample" ) ),
@@ -125,18 +124,18 @@ void AudioFileProcessor::playNote( NotePlayHandle * _n,
// played.
if( m_stutterModel.value() == true && _n->frequency() < 20.0 )
{
m_nextPlayStartPoint = m_sample->startFrame();
m_nextPlayStartPoint = m_sample.startFrame();
m_nextPlayBackwards = false;
return;
}
if( !_n->m_pluginData )
{
if (m_stutterModel.value() == true && m_nextPlayStartPoint >= m_sample->endFrame())
if (m_stutterModel.value() == true && m_nextPlayStartPoint >= m_sample.endFrame())
{
// Restart playing the note if in stutter mode, not in loop mode,
// and we're at the end of the sample.
m_nextPlayStartPoint = m_sample->startFrame();
m_nextPlayStartPoint = m_sample.startFrame();
m_nextPlayBackwards = false;
}
// set interpolation mode for libsamplerate
@@ -165,7 +164,7 @@ void AudioFileProcessor::playNote( NotePlayHandle * _n,
if( ! _n->isFinished() )
{
if (m_sample->play(_working_buffer + offset,
if (m_sample.play(_working_buffer + offset,
static_cast<Sample::PlaybackState*>(_n->m_pluginData),
frames, _n->frequency(),
static_cast<Sample::Loop>(m_loopModel.value())))
@@ -203,10 +202,10 @@ void AudioFileProcessor::deleteNotePluginData( NotePlayHandle * _n )
void AudioFileProcessor::saveSettings(QDomDocument& doc, QDomElement& elem)
{
elem.setAttribute("src", m_sample->sampleFile());
if (m_sample->sampleFile().isEmpty())
elem.setAttribute("src", m_sample.sampleFile());
if (m_sample.sampleFile().isEmpty())
{
elem.setAttribute("sampledata", m_sample->toBase64());
elem.setAttribute("sampledata", m_sample.toBase64());
}
m_reverseModel.saveSettings(doc, elem, "reversed");
m_loopModel.saveSettings(doc, elem, "looped");
@@ -227,16 +226,16 @@ void AudioFileProcessor::loadSettings(const QDomElement& elem)
{
setAudioFile(elem.attribute("src"), false);
QString absolutePath = PathUtil::toAbsolute(m_sample->sampleFile());
QString absolutePath = PathUtil::toAbsolute(m_sample.sampleFile());
if (!QFileInfo(absolutePath).exists())
{
QString message = tr("Sample not found: %1").arg(m_sample->sampleFile());
QString message = tr("Sample not found: %1").arg(m_sample.sampleFile());
Engine::getSong()->collectError(message);
}
}
else if (!elem.attribute("sampledata").isEmpty())
{
m_sample = std::make_shared<Sample>(gui::SampleLoader::createBufferFromBase64(elem.attribute("srcdata")));
m_sample = Sample(gui::SampleLoader::createBufferFromBase64(elem.attribute("srcdata")));
}
m_loopModel.loadSettings(elem, "looped");
@@ -295,7 +294,7 @@ int AudioFileProcessor::getBeatLen( NotePlayHandle * _n ) const
const float freq_factor = baseFreq / _n->frequency() *
Engine::audioEngine()->processingSampleRate() / Engine::audioEngine()->baseSampleRate();
return static_cast<int>(floorf((m_sample->endFrame() - m_sample->startFrame()) * freq_factor));
return static_cast<int>(floorf((m_sample.endFrame() - m_sample.startFrame()) * freq_factor));
}
@@ -316,15 +315,15 @@ void AudioFileProcessor::setAudioFile( const QString & _audio_file,
// is current channel-name equal to previous-filename??
if( _rename &&
( instrumentTrack()->name() ==
QFileInfo(m_sample->sampleFile()).fileName() ||
m_sample->sampleFile().isEmpty()))
QFileInfo(m_sample.sampleFile()).fileName() ||
m_sample.sampleFile().isEmpty()))
{
// then set it to new one
instrumentTrack()->setName( PathUtil::cleanName( _audio_file ) );
}
// else we don't touch the track-name, because the user named it self
m_sample = std::make_shared<Sample>(gui::SampleLoader::createBufferFromFile(_audio_file));
m_sample = Sample(gui::SampleLoader::createBufferFromFile(_audio_file));
loopPointChanged();
emit sampleUpdated();
}
@@ -334,8 +333,8 @@ void AudioFileProcessor::setAudioFile( const QString & _audio_file,
void AudioFileProcessor::reverseModelChanged()
{
m_sample->setReversed(m_reverseModel.value());
m_nextPlayStartPoint = m_sample->startFrame();
m_sample.setReversed(m_reverseModel.value());
m_nextPlayStartPoint = m_sample.startFrame();
m_nextPlayBackwards = false;
emit sampleUpdated();
}
@@ -345,14 +344,14 @@ void AudioFileProcessor::reverseModelChanged()
void AudioFileProcessor::ampModelChanged()
{
m_sample->setAmplification(m_ampModel.value() / 100.0f);
m_sample.setAmplification(m_ampModel.value() / 100.0f);
emit sampleUpdated();
}
void AudioFileProcessor::stutterModelChanged()
{
m_nextPlayStartPoint = m_sample->startFrame();
m_nextPlayStartPoint = m_sample.startFrame();
m_nextPlayBackwards = false;
}
@@ -421,14 +420,14 @@ void AudioFileProcessor::loopPointChanged()
void AudioFileProcessor::pointChanged()
{
const auto f_start = static_cast<f_cnt_t>(m_startPointModel.value() * m_sample->sampleSize());
const auto f_end = static_cast<f_cnt_t>(m_endPointModel.value() * m_sample->sampleSize());
const auto f_loop = static_cast<f_cnt_t>(m_loopPointModel.value() * m_sample->sampleSize());
const auto f_start = static_cast<f_cnt_t>(m_startPointModel.value() * m_sample.sampleSize());
const auto f_end = static_cast<f_cnt_t>(m_endPointModel.value() * m_sample.sampleSize());
const auto f_loop = static_cast<f_cnt_t>(m_loopPointModel.value() * m_sample.sampleSize());
m_nextPlayStartPoint = f_start;
m_nextPlayBackwards = false;
m_sample->setAllPointFrames(f_start, f_end, f_loop, f_end);
m_sample.setAllPointFrames(f_start, f_end, f_loop, f_end);
emit dataChanged();
}
@@ -596,7 +595,7 @@ void AudioFileProcessorView::newWaveView()
delete m_waveView;
m_waveView = 0;
}
m_waveView = new AudioFileProcessorWaveView(this, 245, 75, castModel<AudioFileProcessor>()->m_sample.get());
m_waveView = new AudioFileProcessorWaveView(this, 245, 75, &castModel<AudioFileProcessor>()->m_sample);
m_waveView->move( 2, 172 );
m_waveView->setKnobs(
dynamic_cast<AudioFileProcessorWaveView::knob *>( m_startKnob ),
@@ -643,7 +642,7 @@ void AudioFileProcessorView::paintEvent( QPaintEvent * )
QString file_name = "";
int idx = a->m_sample->sampleFile().length();
int idx = a->m_sample.sampleFile().length();
p.setFont( pointSize<8>( font() ) );
@@ -654,7 +653,7 @@ void AudioFileProcessorView::paintEvent( QPaintEvent * )
while( idx > 0 &&
fm.size( Qt::TextSingleLine, file_name + "..." ).width() < 210 )
{
file_name = a->m_sample->sampleFile()[--idx] + file_name;
file_name = a->m_sample.sampleFile()[--idx] + file_name;
}
if( idx > 0 )
@@ -671,7 +670,6 @@ void AudioFileProcessorView::paintEvent( QPaintEvent * )
void AudioFileProcessorView::sampleUpdated()
{
m_waveView->m_sample = castModel<AudioFileProcessor>()->m_sample.get();
m_waveView->updateSampleRange();
m_waveView->update();
update();

View File

@@ -97,7 +97,7 @@ signals:
void sampleUpdated();
private:
std::shared_ptr<Sample> m_sample;
Sample m_sample;
FloatModel m_ampModel;
FloatModel m_startPointModel;