Задержка метода чтения потока NAudio

#c# #.net #naudio

#c# #.net #naudio

Вопрос:

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

задержка в 2-3 звуковых сигнала, затем 3-й или 4-й приходит быстрее.

Может кто-нибудь, пожалуйста, объяснить, почему? И как мне избавиться от задержки?

Я использовал фрагменты из блогов Марка Хита и кода NAudio на github..

Это основной код консоли:

 var waveSine = new BeepStream(waveWhite.WaveFormat);
var sineChannel = new WaveChannel32(waveSine) { PadWithZeroes = false };

List<WaveChannel32> inputs = new List<WaveChannel32>();
inputs.Add(sineChannel);

var mixer = new MixingWaveProvider32(inputs);

var output = new WaveOut();
output.Init(mixer);
output.Play();
output.Volume = 0.5f;

while (true)
{
    Thread.Sleep(1000);
    waveSine.Beep(1000, 150);
}

  

Это код звукового сигнала (он в основном выводит 0 с, но при вызове звукового сигнала он выталкивает кэшированные синусоидальные выборки):
(примечание 1: не производственный код, поэтому, пожалуйста, игнорируйте очевидные несоответствия) (примечание 1: на самом деле существует как минимум 2 канала — один всегда воспроизводится, поэтому мне пришлось сделать второй — канал звукового сигнала — также всегда воспроизводящийся. Я бы с удовольствием написал SamplesProviders вместо этого, но не смог найти хороший пример)

 public class BeepStream : WaveStream
...
public override int Read(byte[] buffer, int offset, int count)
{
    int totalBytesRead = 0;
    int beepBytesRead = 0;

    while (totalBytesRead < count)
    {
        if(playingNow == null)
        {
            // silence
            buffer[totalBytesRead] = 0;
            totalBytesRead  = 1;// bytesRead;
        }
        else
        {
            // beep
            buffer[totalBytesRead] = playingNow[beepBytesRead  ];
            totalBytesRead  = 1;// bytesRead;

            if (beepBytesRead >= playingNow.Length)
                playingNow = null;
        }
    }

    return totalBytesRead;
}

  

Данные наблюдения всегда приходят со счетом 52920. Что это за магическое число? Могу ли я уменьшить ее? Формат волны — float 44100, если это поможет..

Ответ №1:

Нашел решение, просто попробовав все.

Использование эксклюзивного вывода WASAPI:

 var output = new WasapiOut(NAudio.CoreAudioApi.AudioClientShareMode.Exclusive, 3);
output.Init(mixer);
output.Play();