踩到

时间:2018-05-01 13:15:55

标签: c# .net visual-studio unit-testing naudio

我在使用NAudio的PinkNoiseGenerator进行单元测试时出现问题。

当单步执行程序时,createPinkNoiseGeneratorLists函数的行为似乎与预期的一样 - 也就是说,receiverGeneratorList(见下文)中填充了PinkNoiseGenerators列表,每个列表都包含一个样本列表,至关重要的是,所有人都有不同的价值观:

Stepping Through Stepping Through

单步执行此功能时会出现问题。 receiverGeneratorList仍然填充了PinkNoiseGenerators列表,但样本具有相同的值:

Stepping Over Stepping Over

第二种行为是不受欢迎的。我需要在测试和程序运行时对粉红噪声发生器进行不同的估值。我已将行为缩小到以下嵌套的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;
}

1 个答案:

答案 0 :(得分:4)

NAudio在内部生成一个随机数生成器,将时间作为种子值。当您跨过该函数时,两个new PinkNoiseGenerator()调用发生得如此之快,以至于时间没有改变并且使用了相同的种子值。要验证这一点,请尝试在Thread.Sleep(1000)电话后致电new PinkNoiseGenerator(),看看它是否有所作为。

如果问题确实存在,您可以考虑两种选择:

  1. 在代码中设置故意延迟,以便PinkNoiseGenerator的后续构造函数调用在不同的时间戳中发生
  2. 只创建一个Generator(一个随机种子),并从中读取所有缓冲区。