Функция ведет себя по-разному при переходе к при переходе - PullRequest
0 голосов
/ 01 мая 2018

У меня проблема с модульным тестированием функции, использующей PinkNoiseGenerator от NAudio.

Поведение функции createPinkNoiseGeneratorLists, по-видимому, во время пошагового выполнения программы выглядит примерно так, как и ожидалось, то есть, что receiveGeneratorList (см. Ниже) заполнен списками PinkNoiseGenerators, каждый из которых содержит список примеров, которые, решающее значение имеют все значения:

Stepping Through Stepping Through

Проблема возникает при переходе через функцию. ReceiveGeneratorList по-прежнему заполнен списками 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 .

Я также просматривал «похожие вопросы» на боковой панели, и они в основном не похожи. Этот главный ответ на вопрос намекает на проблему с затравкой - я думал, что подобное может быть виновато в моей проблеме, и понимаю концепцию, но я не уверен, как применить ее к моей конкретной проблеме - может ли моя проблема быть делать с тем, как посеян розовый шум? Я действительно не уверен, как отладить такую ​​ошибку.

Моя система работает:

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 голосов
/ 01 мая 2018

NAudio генерирует внутри себя генератор случайных чисел, принимая время в качестве начального значения. При переходе через функцию два вызова new PinkNoiseGenerator() происходят так быстро, что время не изменилось, и использовалось одно и то же начальное значение. Чтобы убедиться в этом, попробуйте позвонить Thread.Sleep(1000) после вызова new PinkNoiseGenerator() и посмотреть, если это что-то изменило.

Если это действительно проблема, вы можете рассмотреть два варианта:

  1. Установка преднамеренной задержки в коде так, чтобы последующие вызовы конструктора PinkNoiseGenerator происходили с разными временными метками
  2. Создание только одного генератора (одного случайного начального числа) и считывание всех буферов из него.
...