局部变量赋值导致Audio在JUCE中停止处理
Assignment of local variables causes Audio to stop processing in JUCE
编辑:这原来是一个未初始化的变量,造成了混乱的行为。请参阅 关于获取更多 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,我就再也听不到声音了。只需简单地在 getNextAudioBlock()
函数中的任何位置添加行 int unusedVariable = 0;
但在 buffer[sample]
赋值之前 returns 从函数中立即添加,因此它不会产生音频。
如果我简单地声明新变量 (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 都已分配并分配得很好。我还认为它与使用随机class有关,但即使它生成正弦波我也会遇到同样的问题。
编辑:这是从项目中复制的确切代码。在这里 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;
}
}
}
我在 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;
是否不能为您解决问题。
编辑:这原来是一个未初始化的变量,造成了混乱的行为。请参阅
我试图创建一个基本的合成器,但我很快 运行 遇到了一个荒谬的问题,只是试图为新声明的变量赋值。
跟随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,我就再也听不到声音了。只需简单地在 getNextAudioBlock()
函数中的任何位置添加行 int unusedVariable = 0;
但在 buffer[sample]
赋值之前 returns 从函数中立即添加,因此它不会产生音频。
如果我简单地声明新变量 (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 都已分配并分配得很好。我还认为它与使用随机class有关,但即使它生成正弦波我也会遇到同样的问题。
编辑:这是从项目中复制的确切代码。在这里 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;
}
}
}
我在 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;
是否不能为您解决问题。