#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();