Войти
ПрограммированиеФорумЗвук

OpenAL задержка перед проигрыванием

#0
16:47, 9 дек. 2011

Доброго времени суток, не так давно создавал тему про интеграцию эмулятора NES - итак я нашел таки годный эмулятор для NES прикрутил вывод через opengl итд.

Так как я использую OpenAL во всем проекте то и звук эмулятора тоже решил выводить так.

Эмулятор работает просто вызываешь аля Tick с определенной частотой и в колбеки сыплются готовые фреймы видео и аудио - все какбы просто - с видео проблем нет. Проблемы с аудио.

Проблемы в том, что openal начинает проигрывать звук гдето по ощущениям через 0.5 - 0.3 секунды!!! после alSourcePlay

Так как эмулятор был заточен под DSound - запуск игры происходил так

1)Вычислялся размер буфера из каналов самплрейтов итд + какие-то магические константы
2)Создается dsound buffer  этого размера
3)обнуляется и запускается как луп - все как обычно
4)далее начинает вызвваться Tick в Idle
5)при вызове колбека у dsound buffer делается lock - эмулятор туда сам пишет потом вызывается колбек для анлока - там соответственно у dsound buffer делается unlock

усё

т.е. на момент получения первого звукового куска dsound буфер уже во всю крутится - и все выглядит как бы хорошо


Проблема заключается в том что в опенал мы сами должны писать соответственно я делаю так

1)Вычислялся размер буфера из каналов самплрейтов итд + какие-то магические константы
2)Создаю массив этого размера
3)в колбек передаю этот массив эмулятору - он туда пишет
4) в анлок колбеке - загоняю этот массив как буфер опенал в очередь
5) после помещения в очередь самого первого буфера - делаю alSourcePlay

Т.е когда первый кусок звука приходит - openal ещё не крутится - сначала я думал проблема в этом.

НО, создав темповый буфер, залил туда тишину и запустил плей - проверял состояние - на момент прихода первого куска - состояние было уже плей - все как положено - какбы все также как с dsound.

Но задержка осталась - т.е. все мои эксперименты вообще не сильно влияли - т.е. есть какой то нюанс.

Или openal начинает играть только после того как накопит скока то данных - или хз.

Как выйти из этой ситуации я не знаю

Нашел пару форумов(забугровых) именно по этой теме - оба из-которых закончились тем - что люди ушли от использования oal впринципе, блин, но ведь должен быть выход.

ЗЫ
юзаю oal soft
(на хардваре у меня другие глюки, которые гораздо страшнее)

а вообще опенал достал - этими самыми нюансамы


#1
17:48, 9 дек. 2011

Попробуй SDL_audio - http://sdl.beuc.net/sdl.wiki/SDL_Audio

#2
8:19, 10 дек. 2011

fsmoke
> Проблемы в том, что openal начинает проигрывать звук гдето по ощущениям через
> 0.5 - 0.3 секунды!!! после alSourcePlay
Абсолютно нереально.
Если сыплются фреймы, используй очередь буферов.

#3
22:40, 10 дек. 2011

SNVampyre
> Абсолютно нереально.
да вы правы, разобрался - оказывается я передавал на заполнение эмулятору слишком большой буфер - а он у себя синхронизируется сам - и соответственно на начало игры ещё небыло достаточно звука чтобы забить весь буфер - соответственно он брал и заполнял буфер вначале ноликами - отсюда и задержка - уменьшил буфер в 4 раза - задержка почти пропала.
НО чтобы задержку убрать совсем(хотя и так сойдет впринципе)  нужно уменьшить буфер совсем до 200-300 байт - а опенал не дает - если я делаю такие маленькие буферочки и пихаю их в опенал - он начинает сбиваться/заикаться

#4
22:25, 23 дек. 2011

fsmoke
Может попробовать уменьшить частоту дискретизации до 22 килогерц
Где можно mono выставить, вместо stereo

А можно ли использовать формат IMA ADPCM
формат легкий для декодирования!
Незнаю OpenAL поддерживает его или нет.

#5
2:57, 24 дек. 2011

Andconst
> А можно ли использовать формат IMA ADPCM
> формат легкий для декодирования!
Смысла нет. Для проигрывания все-равно нужно декодировать, а adpcm и жмет плохо и шума больше.

#6
15:14, 24 дек. 2011

Andconst
> Может попробовать уменьшить частоту дискретизации до 22 килогерц
RPGman
> Смысла нет. Для проигрывания все-равно нужно декодировать, а adpcm и жмет плохо
> и шума больше.

да я решил уже все - тему забыл закрыть.

Короче все оказалось просто как всегда. Это вообщем то моя ошибка - не допер я просто :)). Я скачал порт этого эмулятора под линукс - который в 10 раз проще оказался, кстати. И там они юзали альзу ессесно и запись буферов звука в устройство вывода была очень похожа на то как я пишу в опенал. Я начал смотреть как они вычисляют размер буфера - и от того что я увидел мне стало стыдно :)))))

Короче самплрейт = 44100, количество кадров в секунду 60. Соответственно размер буфера будет (44100*размер_сампла*количество_каналов)/ 60 - вообщем то очевидная вещь :))))))))), т.е. нужно было просто самлрейт поделить на фреймрейт - это и будет размер буфера!! Я просто сгораю от стыда :))

один Tick эмулятора - дает ровно 1 кадр видео + 1 буфер звука под этот кадр, того размера который я привел - на этом ВСЁ!! - никаких заиканий никаких задержек - все идеально :)))

ЗЫ
опенал оказался непричем - просто я сидел в кабине :)))))

ПрограммированиеФорумЗвук

Тема в архиве.