#c #openal
#c #openal
Вопрос:
Я не могу гарантировать это, проверяя, прекратился ли звук в моей программе, потому что звуки обрабатываются в другом потоке, не так ли?
Итак, проблема возникает, когда я хочу быть на 100% уверен, что после прекращения воспроизведения звука сразу после него начнется другой звук без возможности какой-либо задержки.
Второй звук будет циклическим, поэтому я не могу просто склеить два звука вместе.
Как я могу это сделать?
Ответ №1:
Я не знаю ни одной функции в OpenAL, которая позволила бы вам делать это напрямую, например, блокируя или уведомляя вас, поэтому воспроизведение без пропусков таким образом, как вы сказали, было бы возможно. Любое решение типа «переход в режим ожидания в течение первого звука, затем запустите второй» обречено на неудачу, потому что режим сна ненадежен. Повторная проверка того, прекратил ли источник воспроизведение, также не сработает, потому что в то время, когда вы видите, что источник завершен, уже есть слышимый разрыв.
Однако вы можете заставить это работать косвенно, использовав alSourceQueueBuffers
один раз с первым звуком и один раз со вторым (циклическим) звуком.
Начните воспроизведение исходного кода.
Затем регулярно вызывайте alGetSourcei(source, AL_BUFFERS_PROCESSED, amp;num_done)
. Вам не нужно вызывать это постоянно, просто чаще, чем продолжительность вашего звучания цикла.
Если это говорит вам о том, что буфер завершен, отмените его. Это первый звук, который сделан, а второй воспроизводится прямо сейчас. Теперь снова быстро поставьте в очередь буфер, содержащий второй звук, и продолжайте ставить в очередь / отменять постановку в очередь до тех пор, пока вы хотите, чтобы звук зацикливался.
Комментарии:
1. я попытался выполнить поиск в документах, но не могу найти ссылку на то, как отменить очередь буфера, любая помощь?
2.
alSourceUnqueueBuffers
, глава 4.3.53. ну что ж, поиск в Windows, по-видимому, просто отстой, извините.
4. в любом случае, я не совсем понимаю этот метод, зачем мне нужно дважды вызывать alSourceQueueBuffers () в одном источнике? atm я просто выполняю alSourceQueueBuffers() один раз с массивом, в котором есть два идентификатора буфера. кроме того, нет ли вероятности, что я неправильно воспроизведу звук, если моя игра будет лагать? потому что вы полагаетесь на «быстрое» выполнение чего-либо. вы полагаетесь на это зацикливание, на котором я удостоверюсь, что звук повторяется? вместо использования AL_LOOPING ?
5. Когда вы воспроизводите источник из буфера, он в конечном итоге достигает конца, а затем наступает тишина. Вы хотели воспроизвести другой звук немедленно, т.е. без паузы между ними. Единственный надежный способ сделать это — поставить в очередь по крайней мере два буфера. Когда закончится первый звук (который вы можете запросить), OpenAL беспрепятственно продолжит воспроизведение второго. Таким образом, тишины нет, и у вас есть время поставить в очередь другой буфер, пока воспроизводится второй (и вы можете повторять это столько, сколько захотите).