Integrate changes into Oscillator

This commit is contained in:
sakertooth
2023-08-27 19:34:16 -04:00
parent e01b1fca45
commit 7245b1abc4
12 changed files with 67 additions and 47 deletions

View File

@@ -28,6 +28,7 @@
#include "LfoController.h"
#include "AudioEngine.h"
#include "SampleLoader.h"
#include "Song.h"
@@ -48,7 +49,7 @@ LfoController::LfoController( Model * _parent ) :
m_phaseOffset( 0 ),
m_currentPhase( 0 ),
m_sampleFunction( &Oscillator::sinSample ),
m_userDefSampleBuffer( new SampleBuffer )
m_userDefSampleBuffer(std::make_shared<SampleBuffer2>())
{
setSampleExact( true );
connect( &m_waveModel, SIGNAL(dataChanged()),
@@ -74,7 +75,6 @@ LfoController::LfoController( Model * _parent ) :
LfoController::~LfoController()
{
sharedObject::unref( m_userDefSampleBuffer );
m_baseModel.disconnect( this );
m_speedModel.disconnect( this );
m_amountModel.disconnect( this );
@@ -107,7 +107,7 @@ void LfoController::updateValueBuffer()
{
const float currentSample = m_sampleFunction != nullptr
? m_sampleFunction( phase )
: m_userDefSampleBuffer->userWaveSample( phase );
: Oscillator::userWaveSample(m_userDefSampleBuffer.get(), phase);
f = std::clamp(m_baseModel.value() + (*amountPtr * currentSample / 2.0f), 0.0f, 1.0f);
@@ -211,7 +211,10 @@ void LfoController::loadSettings( const QDomElement & _this )
m_phaseModel.loadSettings( _this, "phase" );
m_waveModel.loadSettings( _this, "wave" );
m_multiplierModel.loadSettings( _this, "multiplier" );
m_userDefSampleBuffer->setAudioFile( _this.attribute("userwavefile" ) );
auto buffer = gui::SampleLoader::createBufferFromFile(_this.attribute("userwavefile"));
// TODO C++20: Deprecated, use std::atomic<std::shared_ptr> instead
std::atomic_store(&m_userDefSampleBuffer, std::shared_ptr<const SampleBuffer2>(std::move(buffer)));
updateSampleFunction();
}

View File

@@ -182,19 +182,20 @@ void Oscillator::generateFromFFT(int bands, sample_t* table)
normalize(s_sampleBuffer.data(), table, OscillatorConstants::WAVETABLE_LENGTH, 2*OscillatorConstants::WAVETABLE_LENGTH + 1);
}
void Oscillator::generateAntiAliasUserWaveTable(SampleBuffer *sampleBuffer)
std::unique_ptr<OscillatorConstants::waveform_t> Oscillator::generateAntiAliasUserWaveTable(const SampleBuffer2* sampleBuffer)
{
if (sampleBuffer->m_userAntiAliasWaveTable == nullptr) {return;}
auto userAntiAliasWaveTable = std::make_unique<OscillatorConstants::waveform_t>();
for (int i = 0; i < OscillatorConstants::WAVE_TABLES_PER_WAVEFORM_COUNT; ++i)
{
for (int i = 0; i < OscillatorConstants::WAVETABLE_LENGTH; ++i)
{
s_sampleBuffer[i] = sampleBuffer->userWaveSample((float)i / (float)OscillatorConstants::WAVETABLE_LENGTH);
s_sampleBuffer[i] = Oscillator::userWaveSample(sampleBuffer, (float)i / (float)OscillatorConstants::WAVETABLE_LENGTH);
}
fftwf_execute(s_fftPlan);
Oscillator::generateFromFFT(OscillatorConstants::MAX_FREQ / freqFromWaveTableBand(i), (*(sampleBuffer->m_userAntiAliasWaveTable))[i].data());
Oscillator::generateFromFFT(OscillatorConstants::MAX_FREQ / freqFromWaveTableBand(i), (*(userAntiAliasWaveTable))[i].data());
}
return userAntiAliasWaveTable;
}
@@ -807,13 +808,13 @@ template<>
inline sample_t Oscillator::getSample<Oscillator::WaveShape::UserDefined>(
const float _sample )
{
if (m_useWaveTable && !m_isModulator)
if (m_useWaveTable && m_userAntiAliasWaveTable && !m_isModulator)
{
return wtSample(m_userWave->m_userAntiAliasWaveTable, _sample);
return wtSample(m_userAntiAliasWaveTable.get(), _sample);
}
else
{
return userWaveSample(_sample);
return userWaveSample(m_userWave.get(), _sample);
}
}

View File

@@ -361,7 +361,6 @@ void SampleBuffer::update(bool keepSettings)
{
m_userAntiAliasWaveTable = std::make_unique<OscillatorConstants::waveform_t>();
}
Oscillator::generateAntiAliasUserWaveTable(this);
if (fileLoadError)
{

View File

@@ -33,6 +33,7 @@ SET(LMMS_SRCS
gui/PluginBrowser.cpp
gui/ProjectNotes.cpp
gui/RowTableView.cpp
gui/SampleLoader.cpp
gui/SampleTrackWindow.cpp
gui/SendButtonIndicator.cpp
gui/SideBar.cpp

View File

@@ -31,6 +31,7 @@
#include "Knob.h"
#include "TempoSyncKnob.h"
#include "PixmapButton.h"
#include "SampleLoader.h"
namespace lmms::gui
{
@@ -210,9 +211,13 @@ LfoControllerDialog::~LfoControllerDialog()
void LfoControllerDialog::askUserDefWave()
{
SampleBuffer * sampleBuffer = dynamic_cast<LfoController*>(this->model())->
m_userDefSampleBuffer;
QString fileName = sampleBuffer->openAndSetWaveformFile();
auto sampleBuffer = dynamic_cast<LfoController*>(this->model())->m_userDefSampleBuffer;
QString fileName = SampleLoader::openWaveformFile();
auto buffer = SampleLoader::createBufferFromFile(fileName);
// TODO C++20: Deprecated, use std::atomic<std::shared_ptr> instead
std::atomic_store(&sampleBuffer, std::shared_ptr<const SampleBuffer2>(std::move(buffer)));
if( fileName.isEmpty() == false )
{
// TODO:

View File

@@ -86,11 +86,11 @@ QString SampleLoader::openWaveformFile(const QString& previousFile)
previousFile.isEmpty() ? ConfigManager::inst()->factorySamplesDir() + "waveforms/10saw.flac" : previousFile);
}
std::unique_ptr<SampleBuffer> SampleLoader::createBufferFromFile(const QString& filePath)
std::unique_ptr<SampleBuffer2> SampleLoader::createBufferFromFile(const QString& filePath)
{
try
{
return std::make_unique<SampleBuffer>(filePath);
return std::make_unique<SampleBuffer2>(filePath);
}
catch (const std::runtime_error& error)
{
@@ -99,11 +99,11 @@ std::unique_ptr<SampleBuffer> SampleLoader::createBufferFromFile(const QString&
}
}
std::unique_ptr<SampleBuffer> SampleLoader::createBufferFromBase64(const QString& base64, int sampleRate)
std::unique_ptr<SampleBuffer2> SampleLoader::createBufferFromBase64(const QString& base64, int sampleRate)
{
try
{
return std::make_unique<SampleBuffer>(base64.toUtf8().toBase64(), sampleRate);
return std::make_unique<SampleBuffer2>(base64.toUtf8().toBase64(), sampleRate);
}
catch (const std::runtime_error& error)
{