#vb.net
#vb.net
Вопрос:
Я пытаюсь создать образовательное приложение для ребенка с тяжелыми нарушениями. Предполагается, что он научит ребенка складывать два числа в диапазоне от 1 до 9. Для этого я хочу заставить его воспроизводить звук, состоящий из n (число, которое нажал ребенок), умноженное на звук «one.wav». Я использую следующий код:
For i As Integer = 1 To buttonNumber
i = i 1
My.Computer.Audio.Play("one.wav")
Threading.Thread.Sleep(1000)
Next
Хотя он воспроизводит звук, количество раз очень неравномерно и не равно «buttonNumber». В чем проблема? (Обратите внимание, что я пробовал тот же код без «i = i 1».)
Редактировать:
Следующий фрагмент кода НЕ работает:
Private Sub PlayButtonAudio(buttonNumber As Integer)
Dim bytes As Byte() = IO.File.ReadAllBytes("one.wav")
For i As Integer = 1 To buttonNumber
My.Computer.Audio.Stop()
My.Computer.Audio.Play(bytes, AudioPlayMode.Background)
Threading.Thread.Sleep(playDuration)
Next
End Sub
Довольно любопытно, что он работает идеально, когда «номер кнопки» больше или равен четырем.
Комментарии:
1. SoundPlayer ->
SoundPlayer.PlaySync()
. Удалите этоThread.Sleep(1000)
. Было бы разумно указать полный путь к медиафайлу.2. Это тоже не сработало; звук воспроизводился дважды, когда он должен воспроизводиться только один раз. Все еще правильно для переменной «buttonNumber»> = 4.
3. Если это не сработало , это, вероятно, потому, что вы использовали
SoundPlayer.Play()
вместоSoundPlayer.PlaySync()
или добавили другой код, например, загрузку звукового файла внутри цикла и т. Д. В противном случае это работает , никаких сомнений в этом.
Ответ №1:
1000 миллисекунд, которые вы указали, отсчитываются от начала воспроизведения wav, поэтому вам понадобится промежуток времени, чтобы добавить длину звука. Звук начинает воспроизводиться через ОС, и ваш код продолжается во время его воспроизведения. Если вы попытаетесь воспроизвести его во второй раз, пока первый еще воспроизводится, вы столкнетесь с проблемами.
Могут быть другие методы воспроизведения звука, которые не возвращаются в ваш код, пока звук не будет завершен, но это приведет к зависанию вашего пользовательского интерфейса.
[Редактировать: если вы не сделаете это в отдельном потоке. Но для ваших целей, возможно, проще просто увеличить задержку.]
Ответ №2:
My.Computer.Audio
Компонент использует общий системный ресурс, а Play
метод — это просто оболочка вокруг функции воспроизведения звука API.
Я предполагаю, что вы хотите, чтобы звук воспроизводился только в течение максимальной продолжительности сна. Если системе требуется больше времени, чем заданная продолжительность ожидания (или значительная ее часть), чтобы загрузить WAV-файл в память, первое воспроизведение может быть неправильно обработано. Этот эффект можно смягчить, загрузив WAV в байтовый массив и используя Play
перегрузку, которая принимает байтовый массив вместо имени файла.
Поскольку вы используете общий ресурс, могут воспроизводиться другие звуки; вызов My.Computer.Audio.Stop()
отменит все, что воспроизводится в данный момент.
Const playDuration As Integer = 1000 ' milliseconds
' load the WAV file into a byte array
' this will minimize the latency caused by loading the file from disc
Dim bytes As Byte() = IO.File.ReadAllBytes("one.wav")
For i As Integer = 1 To buttonNumber
My.Computer.Audio.Stop() ' cancel any currently playing sound
My.Computer.Audio.Play(bytes, AudioPlayMode.Background)
Threading.Thread.Sleep(playDuration)
Next
My.Computer.Audio.Stop() ' cancel playing if wav file duration is longer than playDuration
Ответ №3:
Оказывается, у меня были первые три кнопки дважды в списке обработчиков. Теперь он работает отлично.