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

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

#0
15:02, 2 июня 2017

Приветствую разработчиков. Делаю движок и встал вопрос работа со звуком. Хотел узнать мнение других разработчиков.

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

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

для каждого проигрывателя генерирую один 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%.

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


#1
15:04, 2 июня 2017

Было бы хорошо, если будут примеры на С++ применительно к ios\android. Ресерчил разные вариант, но оптимального решения не нашел. Смотрел также тут: http://www.gamedev.ru/code/articles/OpenAL, но все равно не получается. Кто как реализовывает у себя?

#2
17:11, 2 июня 2017

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

class stream
{
public:
   virtual size_t read(uint8_t* buffer, size_t size) = 0;
};

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

#3
12:24, 5 июня 2017

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

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

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