Как воспроизвести звук сразу после окончания другого звука?

#c #openal

#c #openal

Вопрос:

Я не могу гарантировать это, проверяя, прекратился ли звук в моей программе, потому что звуки обрабатываются в другом потоке, не так ли?

Итак, проблема возникает, когда я хочу быть на 100% уверен, что после прекращения воспроизведения звука сразу после него начнется другой звук без возможности какой-либо задержки.

Второй звук будет циклическим, поэтому я не могу просто склеить два звука вместе.

Как я могу это сделать?

Ответ №1:

Я не знаю ни одной функции в OpenAL, которая позволила бы вам делать это напрямую, например, блокируя или уведомляя вас, поэтому воспроизведение без пропусков таким образом, как вы сказали, было бы возможно. Любое решение типа «переход в режим ожидания в течение первого звука, затем запустите второй» обречено на неудачу, потому что режим сна ненадежен. Повторная проверка того, прекратил ли источник воспроизведение, также не сработает, потому что в то время, когда вы видите, что источник завершен, уже есть слышимый разрыв.

Однако вы можете заставить это работать косвенно, использовав alSourceQueueBuffers один раз с первым звуком и один раз со вторым (циклическим) звуком.

Начните воспроизведение исходного кода.

Затем регулярно вызывайте alGetSourcei(source, AL_BUFFERS_PROCESSED, amp;num_done) . Вам не нужно вызывать это постоянно, просто чаще, чем продолжительность вашего звучания цикла.

Если это говорит вам о том, что буфер завершен, отмените его. Это первый звук, который сделан, а второй воспроизводится прямо сейчас. Теперь снова быстро поставьте в очередь буфер, содержащий второй звук, и продолжайте ставить в очередь / отменять постановку в очередь до тех пор, пока вы хотите, чтобы звук зацикливался.

Комментарии:

1. я попытался выполнить поиск в документах, но не могу найти ссылку на то, как отменить очередь буфера, любая помощь?

2. alSourceUnqueueBuffers , глава 4.3.5

3. ну что ж, поиск в Windows, по-видимому, просто отстой, извините.

4. в любом случае, я не совсем понимаю этот метод, зачем мне нужно дважды вызывать alSourceQueueBuffers () в одном источнике? atm я просто выполняю alSourceQueueBuffers() один раз с массивом, в котором есть два идентификатора буфера. кроме того, нет ли вероятности, что я неправильно воспроизведу звук, если моя игра будет лагать? потому что вы полагаетесь на «быстрое» выполнение чего-либо. вы полагаетесь на это зацикливание, на котором я удостоверюсь, что звук повторяется? вместо использования AL_LOOPING ?

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