Присвоение локальных переменных заставляет Audio останавливать обработку в JUCE

РЕДАКТИРОВАТЬ: Это оказалось неинициализированной переменной, создающей хаотическое поведение. Смотрите этот пост о получении большего количества предупреждений компилятора для JUCE

Я пытался создать простой синтезатор и быстро столкнулся с абсурдной проблемой, когда просто пытался присвоить значение недавно объявленной переменной. Пройдя вместе с простым руководством по синтезу синусов, я столкнулся с проблемой. Это основной код моего getNextAudioBlock() функция, когда он производит белый шум. Обратите внимание, что четыре целых числа объявлены и назначены повсюду:

const int numChannels = bufferToFill.buffer->getNumChannels();
const int numSamples = bufferToFill.numSamples;
for (int channel = 0; channel < numChannels; channel++){
    float* const buffer = bufferToFill.buffer -> getWritePointer(channel, bufferToFill.startSample);
    for (int sample; sample < numSamples; sample++){
        buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f);
    }
}

Однако, как только я пытаюсь добавить еще один int, я больше не получаю звук. Просто добавив строку int unusedVariable = 0; где-нибудь в getNextAudioBlock() функционировать, но до buffer[sample] назначение немедленно возвращается из функции и поэтому не производит аудио.

Если я просто объявляю новую переменную (int unusedVariable;) тогда это все еще работает. Только определенная часть присваивания вызывает ошибку. Кроме того, если я объявляю переменную как глобальный член, то назначение в функции работает просто отлично.

Чтобы повторить, это работает:

buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f;

Это работает:

int unusedVariable;
buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f;

Но это не так:

int unusedVariable = 0;
buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f;

Моя единственная идея заключалась в том, что выделение новой памяти в аудиопотоке вызывает ошибку, но я видел объявление и назначение, выполненное в других онлайн-источниках и даже в моей точно такой же функции с numChannels, numSamples, channel и sample, которые все выделены и назначены просто отлично. Я также считал, что это связано с использованием класса Random, но я получаю ту же проблему, даже когда он генерирует синусоидальные волны.

РЕДАКТИРОВАТЬ: Вот точный код, скопированный из проекта. Прямо здесь nextSample объявлено глобально, так как буфер не заполняется, когда он объявлен локально

  void MainContentComponent::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill)
  {
    const int numChannels = bufferToFill.buffer->getNumChannels();
    const int numSamples = bufferToFill.numSamples;
    for (int channel = 0; channel < numChannels; channel++){
        float* const buffer = bufferToFill.buffer -> getWritePointer (channel, bufferToFill.startSample);
        for (int sample; sample < numSamples; sample++){
            // nextSample = (randomGen.nextFloat() * 2.0f - 1.0f); // For Randomly generated White Noise
            nextSample = (float) std::sin (currentAngle);
            currentAngle += angleDelta;
            buffer[sample] = nextSample * volumeLevel;
        }
    }
  }

1 ответ

Решение

Я создал новый проект AudioApplication в Projucer и вставил этот блок кода в getNextAudioBlock() метод (добавление разумных переменных-членов, когда вы ссылаетесь на них здесь).

Компилятор сразу указал на проблему - переменная цикла sample ниже не инициализируется (и C++ не будет инициализировать его по умолчанию для вас), поэтому, если память, используемая этой переменной, содержала значение, которое меньше размера буфера, вы сгенерируете немного аудио; если нет, то буфер, переданный в эту функцию, не изменяется, потому что цикл никогда не запускается.

    for (int sample; sample < numSamples; sample++){
        nextSample = (randomGen.nextFloat() * 2.0f - 1.0f); // For Randomly generated White Noise
        //nextSample = (float) std::sin (currentAngle);
        //currentAngle += angleDelta;
        buffer[sample] = nextSample * volumeLevel;
    }

посмотреть, если изменить это на for (int sample=0; не исправить вещи для вас.

Другие вопросы по тегам