Почему DataAvailable перестает вызываться через 5 секунд? - PullRequest
0 голосов
/ 28 апреля 2019

Это новая область программирования на C #, в которую я углубляюсь, поэтому, пожалуйста, прости мое невежество по этому поводу. Я пытался узнать больше о цифровой обработке сигналов с помощью NAudio. Я начинаю с того, что пытаюсь создать простое консольное приложение. Используя приведенный ниже код, событие NAudio «DataAvailable» используется только в течение 5 секунд, после чего оно больше не вызывается. Когда данные сохраняются в файл .WAV, длина файла также составляет всего 5 секунд.

Я вручную назначил голосовой тест через микрофон, сказав: «Миссисипи 1, Миссисипи 2 и т. Д.» до 10 раз, чтобы убедиться, что я хотя бы пытался записывать более 5 секунд. После «Миссисипи 5» запись автоматически останавливается и вызывает событие «RecordingStopped». Внутри события «DataAvailable» я просто записываю Guids в окно вывода, чтобы убедиться, что программа все еще работает, но через 5 секунд она прекращает запись в консоль вывода.

Есть ли шаг, который я пропускаю, чтобы сказать NAudio о бесконечной записи, пока пользователь не запустит событие, которое затем заставит его остановиться?

Это код, который я пытаюсь использовать:

static void Main(string[] args)
{
    int deviceCount = WaveIn.DeviceCount;

    if (deviceCount > 0)
    {
        waveFileWriter = new WaveFileWriter(@"F:/" + Guid.NewGuid() + ".wav", new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels));

        waveInEvent = new WaveInEvent();
        waveInEvent.DeviceNumber = deviceCount - 1;
        waveInEvent.WaveFormat = new WaveFormat(44100, 24, WaveInEvent.GetCapabilities(deviceCount - 1).Channels);

        WaveInProvider waveIn = new WaveInProvider(waveInEvent);
        waveInEvent.DataAvailable += new EventHandler<WaveInEventArgs>(waveInEvent_DataAvailable);
        waveInEvent.StartRecording();
    }

    // used to keep the console window open for testing...
    Console.ReadLine();
}

private static void waveInEvent_DataAvailable(object sender, WaveInEventArgs e)
{
    if (waveFileWriter == null)
    {
        return;
    }

    Console.WriteLine(Guid.NewGuid());
}

private static void waveInEvent_RecordingStopped(Object sender, StoppedEventArgs e)
{
    Console.Write("This is getting called automatically after 5 seconds... IDK why???");
}

Я ожидал бы, что приведенный выше код будет выполняться бесконечно, пока не сработает событие, которое остановит запись, однако это не так.

Спасибо.

UPDATE:

Для ясности переименована переменная "waveIn" в "waveInProvider".

1 Ответ

0 голосов
/ 29 апреля 2019

Пожалуйста, смотрите комментарии из вышеупомянутого поста от @Mark Heath и меня. Похоже, что вы должны прочитать буфер из WaveInProvider или он заполняется и выдает исключение. Используйте "waveInProvider.Read (e.Buffer, 0, e.BytesRecorded);" внутри вашего события обратного вызова «DataAvailable», чтобы предотвратить это.

...