EDIT: оказалось, что это неинициализированная переменная, создающая хаотичное поведение. См. эту публикацию о получении дополнительных предупреждений компилятора для 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, каналом и семплом, все они выделены и назначены просто отлично. Я также подумал, что это как-то связано с использованием класса 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;
}
}
}
numChannels
вfor (int channel = 0; numChannels; channel++)
? Это, скорее всего, приведет к бесконечному циклу. - person Stephan Lechner   schedule 21.08.2017buffer[sample] = (randomGen.nextFloat() * 2.0f - 1.0f;
даже не скомпилируется из-за отсутствия закрытия)
. Или фактически предоставьте mcve. - person user7860670   schedule 21.08.2017