Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenAL и стриминг музыки

OpenAL и стриминг музыки

Поделиться
antoncrimeaПостоялецwww2 июня 201715:02#0
Приветствую разработчиков. Делаю движок и встал вопрос работа со звуком. Хотел узнать мнение других разработчиков.

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

Нужно использовать каждый трек как для стрима так и просто из памяти.

для каждого проигрывателя генерирую один source и 2 buffers

alGenSources(1, &track->source)
alGenBuffers(2, track->samples)

приходят данные - удаляю буферы если они используются

ALint bufCount;
ALuint bufferId;
alGetSourcei(track->source, AL_BUFFERS_QUEUED, &bufCount);
   
while (bufCount > 0)
{
      alSourceUnqueueBuffers(track->source, 1, &bufferId);
}

если стрим добавляю снова буферы

alSourceQueueBuffers(track->source, TRACK_BUFCOUNT, track->samples)

если не стрим

alBufferData(track->samples[0], alChanBuffer, data, size, alFreqBuffer);
alSourcei(track->source, AL_BUFFER, track->samples[0]);

потом в цикле обновляю данные. Но работает не так как хочется

ALint buffered = 0;
alGetSourcei(track->source, AL_BUFFERS_QUEUED, &buffered);

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

В потоке обновляю - каждые 100мс. Если чаще то загрузка на телефоне с 15% до 100%.

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

antoncrimeaПостоялецwww2 июня 201715:04#1
Было бы хорошо, если будут примеры на С++ применительно к ios\android. Ресерчил разные вариант, но оптимального решения не нашел. Смотрел также тут: http://www.gamedev.ru/code/articles/OpenAL, но все равно не получается. Кто как реализовывает у себя?
andreyuПостоялецwww2 июня 201717:11#2
antoncrimea
> Как правильно реализовать звуковой менеджер, чтобы можно было играть как звуки
> из памяти так и файлы из стрима.
Сделать абстрактный стрим, с которым и будет работать ваш аудио менеджер:
class stream
{
public:
   virtual size_t read(uint8_t* buffer, size_t size) = 0;
};

Реализовать стрим_в_памфти, стрим_в_файле, любой_иной_стрим.

antoncrimeaПостоялецwww5 июня 201712:24#3
andreyu
спасибо за новодку, уже так реализовано было. был именно затык как воспроизводить. сейчас уже решил все вопросы.

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

2001—2017 © GameDev.ru — Разработка игр