Присвоение локальных переменных заставляет 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;
не исправить вещи для вас.