System.Media.SoundPlayer Выборочная игра

У меня есть небольшое приложение, целью которого является то, что когда пользователь нажимает клавишу, происходит несколько вещей

  1. Создает новый экземпляр объекта для записи нажатия клавиш
  2. Проверяет словарь, захватывает экземпляр класса System.Media.Soundplayer
  3. Изменяет задний цвет раздела на экране
  4. Воспроизводит, асинхронно, WAV-файл в SoundPlayer

Экземпляры Dictionary и SoundPlayer создаются при загрузке формы, и все экземпляры SoundPlayer синхронно загружают () файлы WAV перед их добавлением в словарь.

Событие KeyDown формы выглядит примерно так:

//do stuff up here, get the type, etc etc
//players is Dictionary<EnumFoo, SoundPlayer>

SoundPlayer sound = players[type];
sound.Play();

this.KeyUp += (sUp, eUp) =>
{
    DateTime endTime = DateTime.Now;
    foo.Duration = endTime - startTime;
    sound.Stop();
    this.resetColors();
};

Вот моя проблема: кажется, что он воспроизводит только короткие звуки. Некоторые из них имеют продолжительность ~30 секунд, а другие - менее 5. Если я ставлю точку останова где-нибудь после создания экземпляра SoundPlayer, то даже длинные звуки воспроизводятся правильно.

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

Есть идеи? Мне никогда не приходилось возиться с любым из классов средств массовой информации раньше.

1 ответ

Ой, только понял, почему это происходит. Вид трехступенчатого ответа

  1. Плохое предположение, что, пока я удерживал клавишу, было запущено только одно событие KeyDown. Это не точно. Это будет стрелять несколько раз.
  2. Мне указали на неправильные аудиофайлы, в которых была часть молчания, чтобы предсказать шум.
  3. Долгий день и плохое тестирование. Сам код в порядке (по крайней мере, работающий для одноразового приложения, для которого он мне нужен), это было просто плохое тестирование с моей стороны.
Другие вопросы по тегам