System.Media.SoundPlayer Выборочная игра
У меня есть небольшое приложение, целью которого является то, что когда пользователь нажимает клавишу, происходит несколько вещей
- Создает новый экземпляр объекта для записи нажатия клавиш
- Проверяет словарь, захватывает экземпляр класса System.Media.Soundplayer
- Изменяет задний цвет раздела на экране
- Воспроизводит, асинхронно, 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 ответ
Ой, только понял, почему это происходит. Вид трехступенчатого ответа
- Плохое предположение, что, пока я удерживал клавишу, было запущено только одно событие KeyDown. Это не точно. Это будет стрелять несколько раз.
- Мне указали на неправильные аудиофайлы, в которых была часть молчания, чтобы предсказать шум.
- Долгий день и плохое тестирование. Сам код в порядке (по крайней мере, работающий для одноразового приложения, для которого он мне нужен), это было просто плохое тестирование с моей стороны.