我在使用NAudio的PinkNoiseGenerator进行单元测试时出现问题。
当单步执行程序时,createPinkNoiseGeneratorLists函数的行为似乎与预期的一样 - 也就是说,receiverGeneratorList(见下文)中填充了PinkNoiseGenerators列表,每个列表都包含一个样本列表,至关重要的是,所有人都有不同的价值观:
单步执行此功能时会出现问题。 receiverGeneratorList仍然填充了PinkNoiseGenerators列表,但样本具有相同的值:
第二种行为是不受欢迎的。我需要在测试和程序运行时对粉红噪声发生器进行不同的估值。我已将行为缩小到以下嵌套的for循环(底部的完整代码):
for (int j = 0; j < receiverList[i].AmplitudeCurveList.Count; j++)
{
// Calculate duration of pink noise in seconds
double time = receiverList[i].AmplitudeCurveList[j].Count / (double)sampleRate;
// Instantiate new generator (list of pink noise samples) at given duration
PinkNoiseGenerator generator = new PinkNoiseGenerator(time, sampleRate, outputFileName, numberOfChannels);
// Add generator to generator list which will then be added to the list of lists of pink noise generators,
generatorList.Add(generator);
}
我无法看到代码的任何问题 - 这可能是NAudio的计时问题吗?我已经搜索了这个问题,这看起来很少见,但经历类似的人有时会得到多线程的响应 - 我自己并没有使用任何多线程,但不可否认的是,在NAudio中可能会有一些“引擎盖”
我还看了一下侧边栏中的“类似问题”,它们大多不相似。 This问题的最佳答案暗示了一个播种问题 - 我认为类似的事情可能是我的问题的责任,并理解这个概念,但我不确定如何将它应用于我的具体问题 - 我的问题可能是做粉红噪声是如何播种的?我真的不确定如何调试这样的错误。
我的系统正在运行:
Windows 7 64位
VS2013 v12.0.21005.1
NET v4.6.01055
以下是完整的测试/功能代码,如果它有助于解决问题:
以下是(删节)测试类:
[TestMethod]
public void testPinkNoise()
{
string outputFileName = @"C:\Users\Mick\Test\\Output\Test.wav";
int numberOfChannels = 1;
int sampleRate = 1000;
// Act
// Problem with identical PinkNoiseGenerators occurs here -> timing issue with NAudio?
receiverGeneratorList = scene.createPinkNoiseGeneratorLists(sampleRate, outputFileName, numberOfChannels);
}
这就是函数本身(对于记录,我知道变量名称令人困惑,而且一般来说函数需要重构以获得清晰度/可读性,还有它的曲线列表以及诸如此类的东西 - 避难所'我已经开始了:)
public List<List<PinkNoiseGenerator>> createPinkNoiseGeneratorLists(int sampleRate, string outputFileName, int numberOfChannels)
{
// Initialise list of lists of pink noise samples
List<List<PinkNoiseGenerator>> receiverGeneratorList = new List<List<PinkNoiseGenerator>>();
for (int i = 0; i < receiverList.Count; i++)
{
List<PinkNoiseGenerator> generatorList = new List<PinkNoiseGenerator>();
// For every amplitude curve within the receiver, generate a corresponding pink noise curve
for (int j = 0; j < receiverList[i].AmplitudeCurveList.Count; j++)
{
// Calculate duration of pink noise in seconds
double time = receiverList[i].AmplitudeCurveList[j].Count / (double)sampleRate;
// Instantiate new generator (list of pink noise samples) at given duration
PinkNoiseGenerator generator = new PinkNoiseGenerator(time, sampleRate, outputFileName, numberOfChannels);
// Add generator to generator list which will then be added to the list of lists of pink noise curves,
generatorList.Add(generator);
}
// Add list of pink noise curves
receiverGeneratorList.Add(generatorList);
}
return receiverGeneratorList;
}
答案 0 :(得分:4)
NAudio在内部生成一个随机数生成器,将时间作为种子值。当您跨过该函数时,两个new PinkNoiseGenerator()
调用发生得如此之快,以至于时间没有改变并且使用了相同的种子值。要验证这一点,请尝试在Thread.Sleep(1000)
电话后致电new PinkNoiseGenerator()
,看看它是否有所作为。
如果问题确实存在,您可以考虑两种选择:
PinkNoiseGenerator
的后续构造函数调用在不同的时间戳中发生