Я создаю плагин с фреймворком JUCE и читаю из nullptr. Я думаю, что проблема вызвана тем, что не назначен указатель на параметры. Надеюсь, это просто какая-то ошибка basi c c ++ с назначением std :: atomi c *.
AddressSanitizer:DEADLYSIGNAL
=================================================================
==24856==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x563d890b145a bp 0x7f489ff03840 sp 0x7f489ff03810 T10)
==24856==The signal is caused by a READ memory access.
==24856==Hint: address points to the zero page.
#0 0x563d890b145a in SynthVoice::renderNextBlock(juce::AudioBuffer<float>&, int, int)
Код:
#pragma once
#include <JuceHeader.h>
#include "ProcessorBase.h"
#include "SynthSound.h"
#include "SynthVoice.h"
class OscillatorProcessor : public ProcessorBase
{
public:
OscillatorProcessor(int osc_id)
{
id = osc_id;
synth.clearVoices();
for (int i = 0; i < 5; i++)
synth.addVoice(new SynthVoice());
synth.clearSounds();
synth.addSound(new SynthSound());
}
void prepareToPlay (double sampleRate, int samplesPerBlock) override
{
lastSampleRate = sampleRate;
synth.setCurrentPlaybackSampleRate(lastSampleRate);
}
void processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) override
{
for (int i = 0; i < synth.getNumVoices(); i++)
{
//if myVoice sucessfully casts as a SynthVoice*, get the voice and set the params
if ((voice = dynamic_cast<SynthVoice*>(synth.getVoice(i))))
{
voice->setSampleRate(lastSampleRate);
voice->setWavetable(wavetable, id);
voice->setADSRParameters(att, dec, sus, rel);
voice->setGain(gain);
voice->setTableRange(first_sample, last_sample);
voice->setTuning(tune);
}
synth.renderNextBlock(buffer, midiMessages, 0, buffer.getNumSamples()); <---- ERROR
}
}
void setWavetable(float (*waveform)[1080])
{
wavetable = waveform;
}
void setParameters (std::atomic<float>* attack, std::atomic<float>* decay,
std::atomic<float>* sustain, std::atomic<float>* release,
std::atomic<float>* gain_value, std::atomic<float>* tuning,
std::atomic<float>* start_sample ,std::atomic<float>* stop_sample)
{
att = attack;
dec = decay;
sus = sustain;
rel = release;
gain = gain_value;
tune = tuning;
first_sample = start_sample;
last_sample = stop_sample;
}
void reset() override
{
}
private:
double lastSampleRate;
Synthesiser synth;
SynthVoice* voice;
int id;
std::atomic<float>* att = nullptr;
std::atomic<float>* dec = nullptr;
std::atomic<float>*sus = nullptr;
std::atomic<float>* rel = nullptr;
std::atomic<float>* gain = nullptr;
std::atomic<float>* first_sample = nullptr;
std::atomic<float>* last_sample = nullptr;
std::atomic<float>* tune = nullptr;
float (*wavetable)[1080];
};
в pluginProcessor.h : (опущено, неактуально)
private:
//==========================================================================
OscillatorProcessor proc0 {0};
OscillatorProcessor proc1 {1};
В PluginProcessor. cpp: (опущено, неактуально)
void GeoHeadAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
{
ignoreUnused(samplesPerBlock);
lastSampleRate = sampleRate;
createWaveformTemplates();
setParameters();
proc0.prepareToPlay(sampleRate, lastSampleRate);
proc1.prepareToPlay(sampleRate, lastSampleRate);
proc0.setParameters(parameters.getRawParameterValue("ATTACK_ID"),
parameters.getRawParameterValue("DECAY_ID"),
parameters.getRawParameterValue("SUSTAIN_ID"),
parameters.getRawParameterValue("RELEASE_ID"),
parameters.getRawParameterValue("GAIN_ID"),
parameters.getRawParameterValue("TUNE_ID"),
parameters.getRawParameterValue("LEFT_BOUND_ID"),
parameters.getRawParameterValue("RIGHT_BOUND_ID")
// getRawParameterValue Returns a pointer to a floating point representation of a particular parameter which a realtime process can read to find out its current value.
);
proc1.setParameters(parameters.getRawParameterValue("ATTACK_ID_1"),
parameters.getRawParameterValue("DECAY_ID_1"),
parameters.getRawParameterValue("SUSTAIN_ID_1"),
parameters.getRawParameterValue("RELEASE_ID_1"),
parameters.getRawParameterValue("GAIN_ID_1"),
parameters.getRawParameterValue("TUNE_ID_1"),
parameters.getRawParameterValue("LEFT_BOUND_ID_1"),
parameters.getRawParameterValue("RIGHT_BOUND_ID_1")
);
proc0.setWavetable(waveforms);
proc1.setWavetable(waveforms);
}
void GeoHeadAudioProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& midiMessages)
{
juce::ScopedNoDenormals noDenormals;
//auto totalNumInputChannels = getTotalNumInputChannels();
//auto totalNumOutputChannels = getTotalNumOutputChannels();
buffer.clear();
proc0.processBlock(buffer, midiMessages);
proc1.processBlock(buffer, midiMessages);
}