Как воспроизвести звук в Visual Basic дважды

#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:

Оказывается, у меня были первые три кнопки дважды в списке обработчиков. Теперь он работает отлично.