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

OpenAL. Воспроизведение потокового звука

Страницы: 1 2 3 Следующая »
#0
10:27, 20 мая 2008

Прошу прояснить непонятный мне аспек работы с буферами OpenAL.

Допустим у меня есть большой звуковой файл (2 - 10 мб). Я хочу загрузить его в движок и проиграть. Как я выяснил изстатьи Введение в OpenAL, и проигрывание музыкального формата OGG/Vorbis средства библиотеки alut, входящей в состав OpenAL не позволят загрузить большой wav файл, потому что она использует только один буфер.

Пусть тогда это будет ogg файл и я пытаюсь загрузить его средствами библиотек ogg/vorbis. Как я понял из примера для большого файла мы создаем несколько буферов, и ставим их в очеред для какого-то определенного источника звука.

Во собственно вопрос:

Так как мы и когда грузим файл целиком и когда по частям используем буферы, то мы загружаем с диска в память данные звука (насколько я понял). При чем же тогда здесь потоковое воспроизведение, если большой файл мы целиком загрузили и читаем из памяти, подкачки с диска не осуществляется, верно?


#1
12:13, 20 мая 2008

Почему весь? Будет у тебя, например, четыре буффера по надцать килобайт, в памяти будет надцать*4 килобайт звука :) остальное подгружаешь

#2
12:19, 20 мая 2008

Спец
>остальное подгружаешь

Как? Я не понял. То есть мне нужно при загрузке большого файла как-то не грузить его целиком по началу, а потом уже когда идет проигрывание остальное грузить? И это ручками делать самому?

#3
13:21, 20 мая 2008

Osiris

Посмотри функцию alSourceQueueBuffers. С ее помощью добавляешь в очередь источника буферы. Далее опрашиваешь источник для получения значения AL_BUFFERS_PROCESSED. Если оно больше 0, то вызываешь alSourceUnqueueBuffers с соотв. числом, которая возвращает отыгравшие буферы. Заливаешь в них данные и опять ставишь в очередь.

#4
13:30, 20 мая 2008

Ghost2
Да это я понял, но ведь буферы содержат в себе кусок уже загруженного трека. Значит для экономии памяти я должен создавать оставшиеся буферы этого трека по ходу проигрывания звука? Тогда я понимаю это будет потоковое воспроизведение. Иначе, если я загрузил весь трек кусковыми буферами - они жрут у меня память?

Насколкьо это быстро и сложно считывать с диска части трека для воспроизведения? Не зря же все-таки придумали в OpenAL буферы небольшого размера? Или я и тут ошибаюсь.

Расскажите вообще как кто работает с большими треками.

#5
15:16, 20 мая 2008

А мне название темы понравилось: «OpenAL. Воспроизведение потового звука» :)

Извините за оффтоп...

#6
17:39, 20 мая 2008

DimanNN
:))))))) Да, прикольно. Исправил.

#7
17:52, 20 мая 2008

Так, я кажется понял, как делать. Будут впосросы, отпишусь.

#8
12:43, 21 мая 2008

Вот собственно появился вопрос:

Как читать потоково стерео звуковые файлы? Как хранятся в стерео файле две звуковые дорожки? Можно ли примеры по чтению моно и стерео файлов.

Заранее спасибо.

#9
11:05, 22 мая 2008

Вопрос актуален. Как читать два канала звука?

#10
16:33, 22 мая 2008

Osiris
подкину мысль:
обязательно лить файл по-частям с харда во время воспроизведения? А если скорости не хватит, чтобы в след. секунду считать часть файла с харда и сразу воспроизвести? Это тогда подкачка с упреждением нужна? Т.е. нехилый доп. код? А не проще забить на лайф-подкачку, и грузить 10мб целиком сразу? И кода меньше, и расход памяти (думаю, 50мб где-то декомпрессированный ogg будет занимать) не такой большой в наше время, когда у геймеров по 4 гига ОЗУ в наличии :D

#11
20:39, 22 мая 2008

Yj

Я похожим образом делаю. Заливаю огг сразу в память целиком, и уже потом из него по частям разжимаю звук в ал буффера. Типа потоковое воспроизведение из буффера в памяти. :)

#12
20:42, 22 мая 2008

Osiris

>Вопрос актуален. Как читать два канала звука?

Гм, в вышеуказанной  статье в примерах кода фигурирует понятие стереозвука... например там есть определение формата данных для ал буффера

  buffer.Format = (mInfo->channels == 1) ? AL_FORMAT_MONO16 
               : AL_FORMAT_STEREO16;
#13
10:14, 23 мая 2008

Yj
tie_fighter
Спасибо, ребята!

Теперь по отдельности:
>обязательно лить файл по-частям с харда во время воспроизведения? А если скорости не хватит, чтобы в след. секунду считать >часть файла с харда и сразу воспроизвести? Это тогда подкачка с упреждением нужна?

Нет, всего лишь два буфера - один проигрывается, второй читается.

>А не проще забить на лайф-подкачку, и грузить 10мб целиком сразу? И кода меньше, и расход памяти (думаю, 50мб где-то >декомпрессированный ogg будет занимать) не такой большой в наше время, когда у геймеров по 4 гига ОЗУ в наличии :D

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

tie_fighter
>Гм, в вышеуказанной статье в примерах кода фигурирует понятие стереозвука

Да, есть. Я просто не мог понять, как же от это делает и делает ли вообще. Теперь понял, что за моно-стерео в случае OGG отвечает vorbis.

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

#14
16:34, 23 мая 2008

Вопросы:

1. Как в OpenAL задавать громкость звука?
2. Нужно ли при использовании левосторонней системы координат D3D каким либо образом преобразовывать вектора для OpenAL?
3. Есть ли ограничение по числу буферов и сколько?

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумЗвук

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