Есть ли более быстрый способ воспроизвести звук, чем SoundPlayer в C #?

Я пытаюсь воспроизводить звук печати каждый раз при нажатии клавиши, используя класс SoundPlayer (для имитации звуков пишущей машинки).

public void MyKeyDown(object sender, KeyEventArgs)
{
    player = new System.Media.SoundPlayer(@"f:\sounds\2.wav");
    player.Play();
}

Он отлично работает ... до тех пор, пока вы набираете около 20 слов в минуту. Если быстрее, чем это, звуки не воспроизводятся полностью или даже не перестают воспроизводиться полностью, пока вы не замедлитесь

2.wav - это звуковой файл размером 8 Кбайт с длительностью 0,1 секунды, поэтому, исходя только из продолжительности звука, файл можно было воспроизвести полностью 600 раз в минуту (достаточно для скорости набора около 90 слов в минуту).

Есть ли более быстрый способ воспроизвести звуковой файл или проблема в другом месте?


person Sylverdrag    schedule 02.06.2019    source источник
comment
Никто не набирает стабильно. SoundPlayer очень упрощен, у него нет возможности перекрывать или микшировать звуки. Взгляните, например, на библиотеку NAudio.   -  person Hans Passant    schedule 02.06.2019
comment
Было бы быстрее получить единственный экземпляр плеера? И просто каждый раз вызывать игру?   -  person the.Doc    schedule 02.06.2019
comment
@ the.Doc Пробовал оба способа и без разницы.   -  person Sylverdrag    schedule 02.06.2019
comment
@HansPassant Я только что попробовал воспроизвести с помощью NAudio и кода из учебника. Работает немного лучше, но через короткое время вылетает, несмотря на то, что находится внутри блока try. Я посмотрю, смогу ли я заставить его работать, и задам вопрос получше, если не смогу.   -  person Sylverdrag    schedule 02.06.2019


Ответы (1)


Таким образом вы будете создавать новый экземпляр SoundPlayer при каждом KeyDown, который затем будет каждый раз перезагружать один и тот же сэмпл с диска. Класс SoundPlayer имеет конструктор, который принимает в качестве аргумента расположение звукового файла. В этом случае вы можете повторно использовать экземпляр SoundPlayer, и файл будет кэширован в памяти. Я могу представить, что это намного быстрее.

Что-то вроде этого должно помочь:

private SoundPlayer soundPlayer;

// Call this on App Startup / Initialization...
private void InitializeSoundPlayer() 
{
  this.soundPlayer = new SoundPlayer("sound.wav");
}

public void MyKeyDown(object sender, KeyEventArgs)
{
    this.soundPlayer.Play();
}

В моем случае это работало более плавно.

person feal    schedule 02.06.2019
comment
Я сделал это сначала, практической разницы нет. - person Sylverdrag; 03.06.2019