编辑:结果证明这是一个未初始化的变量,造成了混乱的行为。有关为JUCE获取更多编译器警告的信息,请参阅this post
我试图创建一个基本的合成器,当我只是尝试为新声明的变量赋值时,我很快就遇到了一个荒谬的问题。
继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;
我唯一的想法是在Audio线程上分配新内存导致错误,但我已经看到在其他在线资源中完成声明和分配,甚至在我的完全相同的函数中,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;
}
}
}
答案 0 :(得分:1)
我在Projucer中创建了一个新的AudioApplication项目,并将这段代码粘贴到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;
是否无法解决问题。