Определение окончания воспроизведения звука в C # - PullRequest
2 голосов
/ 08 января 2009

Вот ситуация:
Пользователь что-то ищет.

  • Звук оповещения воспроизводится, потому что на предмете, который он посмотрел, есть уведомление
  • Пользователь закрывает уведомление - приложение продолжает получать информацию
  • Пользователю отправлено сообщение, сообщающее, что информация закончила поиск
  • Приложение начинает отправку определенных атрибутов в TextToSpeech
  • Приложение обнаруживает второе уведомление, внутреннее уведомление о данных и отправляет другое предупреждение (texttospeech приостанавливается, а затем возобновляется после его завершения)
  • Текст в речь закончен, воспроизводится еще один «динь», давая понять пользователю, что он прочитал все

В настоящее время мы используем очередь для упорядоченной обработки звуков, чтобы предотвратить наложение звуков. В настоящее время мы воспроизводим звук из очереди только при вызове события SoundAdded. Это пользовательское событие, которое мы создали, чтобы добавить в очередь звук. В настоящее время для каждого вызова мероприятия будет воспроизводиться только один звук. Мы столкнулись с проблемой, когда после воспроизведения определенных звуков они «блокируют» очередь, не позволяя обрабатывать дальнейшие звуки. Мы справились с этим, всегда «разблокируя» очередь, даже если не воспроизводится звук. Тем не менее, это все еще оставляет нас с проблемой того, что очередь будет подкреплена звуками для воспроизведения.

Единственный метод, который я могу придумать, чтобы решить эту проблему, это добавить петлю, чтобы продолжать пытаться воспроизвести звук, если звук все еще ждет воспроизведения. В настоящее время основной поток обработки звуков, возможно, мне нужно было бы перенести обработку звука в отдельный поток, но я не уверен, какой будет лучший способ обработки звука.

Итак ... мой вопрос ... Есть ли хорошая звуковая библиотека, которую мы можем использовать, которая включает событие для завершения звука. Или ... что было бы лучшим способом создать такую ​​вещь?

Ответы [ 3 ]

2 голосов
/ 08 января 2009

Расширяя ответ Джона: в .NET 2.0 и выше вы можете использовать My.Computer.Audio.Play с опцией AudioPlayMode.WaitToComplete .

edit: Чтобы использовать это в контексте C #, см. Как: использовать My Namespace (Руководство по программированию в C #) от Microsoft.

2 голосов
/ 08 января 2009

Я не знаю, есть ли уже библиотека .NET, которая позволила бы вам это сделать, но я думаю, что вы можете довольно легко P / Invoke PlaySound из Windows API и использовать ее для воспроизведения ваших звуков , Пока вы не укажете флаг SND_ASYNC, он должен блокироваться до тех пор, пока не закончится воспроизведение звука, и в этот момент вы можете воспроизвести следующий звук. Как вы упомянули, вы определенно захотите сделать это в другой теме.

0 голосов
/ 08 января 2009

Если вы воспроизводите звуки синхронно (на новых потоках, которыми вы управляете), вы будете знать, когда они завершатся.

Но у вас, похоже, есть две проблемы; один знает, когда звуки заканчиваются, а другой - наращивание очереди. Если у вас есть звуки, которые можно настроить, как это повлияет на ваше приложение, если ваши пользователи выберут в качестве звука очень длинные записи (например, 10 секунд +)?

Я бы предложил использовать тот же подход, что и при отображении имен файлов в пользовательском интерфейсе. То есть, вы показываете самое новое имя файла, а не каждое (в противном случае очередь имен файлов увеличивается и ваш пользовательский интерфейс отстает). Если вы можете, вы должны либо воспроизводить звуки для событий, как и когда они происходят (позволяя перекрывать звуки), либо вы должны отбрасывать (не воспроизводить) звуки, если звук не самый последний в очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...