Что заставляет меня читать из nullptr - PullRequest
0 голосов
/ 06 августа 2020

Я создаю плагин с фреймворком 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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...