Приветствую разработчиков. Делаю движок и встал вопрос работа со звуком. Хотел узнать мнение других разработчиков.
Необходимо играть как просто звуки, так и музыку. Задача играть разные типы стрим и просто в памяти данные. Я создаю треки - отдельные проигрыватели под нужные форматы.
Нужно использовать каждый трек как для стрима так и просто из памяти.
для каждого проигрывателя генерирую один 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%.
Как правильно реализовать звуковой менеджер, чтобы можно было играть как звуки из памяти так и файлы из стрима.
Было бы хорошо, если будут примеры на С++ применительно к ios\android. Ресерчил разные вариант, но оптимального решения не нашел. Смотрел также тут: http://www.gamedev.ru/code/articles/OpenAL, но все равно не получается. Кто как реализовывает у себя?
antoncrimea
> Как правильно реализовать звуковой менеджер, чтобы можно было играть как звуки
> из памяти так и файлы из стрима.
Сделать абстрактный стрим, с которым и будет работать ваш аудио менеджер:
class stream { public: virtual size_t read(uint8_t* buffer, size_t size) = 0; };
Реализовать стрим_в_памфти, стрим_в_файле, любой_иной_стрим.
andreyu
спасибо за новодку, уже так реализовано было. был именно затык как воспроизводить. сейчас уже решил все вопросы.
Тема в архиве.