Я использую класс SoundPlayer
для воспроизведения WAV-файлов в моем приложении WPF. Файлы короткие и являются частью приложения и воспроизводятся в ответ на события, которые происходят в программе. Пользователь не контролирует, какой звук воспроизводится, и не может решить самостоятельно воспроизвести звук. Я также пытался использовать элемент управления WPF MediaPlayer
, но у меня были проблемы с этим элементом управления. SoundPlayer
отлично работает, но есть проблема.Альтернативы SoundPlayer
По существу, мне нужно держать очередь звуков и воспроизводить звуки один за другим, когда они стоят в очереди. В некоторых случаях я должен остановить звук, который звучит, и вместо этого воспроизвести другой звук. Таким образом, у меня есть два требования, которые оказываются взаимоисключающими с контролем SoundPlayer
:
- Мой код должен знать, когда звук закончил играть.
- звуки должны играть в фоновом режиме
Чтобы реализовать это, я создал класс под названием SoundController
. Это имеет фоновый поток, и он использует Thread
Dispatcher
для вызова вызовов метода, который я использую для воспроизведения звуков, используя BeginInvoke
. Метод вызывает событие в событии SoundController
, прежде чем он называет SoundPlayer.PlaySync
для воспроизведения звука, а затем он вызывает другое событие после возврата PlaySync
.
В моей теме пользовательского интерфейса, в точке, где мне нужно остановить звук, я вызываю метод SoundController
класса Stop
. Это вызывает метод SoundPlayer
Stop
, чтобы остановить воспроизведение звука. И вот здесь проблема. Оказывается, что SoundPlayer.Stop
НЕ останавливает звук, но он ждет, пока звук закончится, прежде чем вернуться.
Это останавливает мой графический интерфейс. Хотя я мог бы назвать это асинхронно, мой графический интерфейс не остановится, но звук также не остановится.
Как я уже сказал, WPF MediaPlayer не работал для нас, и это было слишком сложно. Есть ли другая альтернатива для воспроизведения звуков, которая даст мне возможность поднимать события, воспроизводить звук в фоновом потоке и останавливать воспроизведение?
Редактировать 06/26/2012:
Это было здесь в течение месяца, и я не получили никаких ответов. Поэтому я думаю, что нет никаких других альтернатив для управления SoundPlayer
.
Я собираюсь опубликовать новый вопрос, относящийся к проблеме под другим углом.
Я просто столкнулся с этой точной проблемой с приложением winforms, а не с WPF, но я сомневаюсь, что в этом дело. Я немного не понимаю, почему/как добавление второго рабочего потока может иметь значение здесь (или .STOP() 'работает поперечный поток, или это не правда? Почему *, который * thread это имеет значение?) Я собираюсь вернуться к этому завтра или в понедельник, чтобы попытаться обернуть вокруг себя голову, но если у вас есть время/мотивация, чтобы подробно остановиться на этом и/или положить его в скелетный код, я был бы очень благодарен :-) – DaveRandom
Проблема в том, что поток, который вызывает метод 'Play', не может прервать себя, поскольку он занят воспроизведением звука. Он не может выполнить вызов «Стоп» до тех пор, пока он не начнет воспроизводить звук, и к тому времени уже слишком поздно. Единственный способ остановить звук, который находится в середине игры, - это вызвать «Stop» из другого потока. Вот почему я добавил отдельный поток, посвященный тому, чтобы ничего не делать, кроме воспроизведения звуков. Я отредактирую свой ответ и добавлю код скелета. –
Большое спасибо за это обновление, я собираюсь поиграть с ним по утрам – DaveRandom