Обновление:
Я не могу найти способ определить, какое максимальное количество источников поддерживает устройство, но я думаю, что нашел способ определения максимального количества поддерживаемых контекстом (ALC_MONO_SOURCES
). Из этого следует, что контекст поддерживает тот же номер, что и его родительское устройство.
//error checking omitted for brevity
ALCdevice* device = alcOpenDevice(NULL);
ALCcontext* context = alcCreateContext(device,NULL);
ALCint size;
alcGetIntegerv( device, ALC_ATTRIBUTES_SIZE, 1, &size);
std::vector<ALCint> attrs(size);
alcGetIntegerv( device, ALC_ALL_ATTRIBUTES, size, &attrs[0] );
for(size_t i=0; i<attrs.size(); ++i)
{
if( attrs[i] == ALC_MONO_SOURCES )
{
std::cout << "max mono sources: " << attrs[i+1] << std::endl;
}
}
Возвращает 255 в Ubuntu 10.4 с использованием стандартного драйвера OpenAL.
Длинный ответ хорошо вроде ...
Программные драйверы OpenAL обычно допускают неограниченное количество источников. Ну, на самом деле не бесконечно, в конце концов вы будете максимально использовать либо процессор, либо RAM.
Большинство аппаратных драйверов OpenAL поддерживают столько источников, сколько аппаратных каналов. На сегодняшний день это по крайней мере 16, вероятно, 32 или больше, но может достигать 256. Возможно, есть звуковые карты, которые поддерживают больше, но 256 - это самая большая из тех, что я когда-либо видел.
В Windows DirectSound драйверы произвольно ограничены 31 (почему не 32?) Источниками. DirectSound устарел, поэтому я не знаю, относится ли это к Vista и Windows 7.
iPhone поддерживает 32 источника.
Я видел один аппаратный драйвер с программной поддержкой. Это означает, что каждый источник получит аппаратный канал, пока они не закончатся. Затем он будет смешивать некоторые звуки в программном обеспечении, прежде чем отправлять его с аппаратного обеспечения. Это дает лучшее из обоих миров, близких к бесконечным источникам, при этом используя максимально возможное аппаратное ускорение.
На практике, если вы используете аппаратный драйвер, просто продолжайте создавать его, пока alGenSources не выйдет из строя. Я слышал, это не работает на iPhone. Есть некоторые программные драйверы OpenAL, которые будут аварийно завершать работу до сбоя alGenSources.
На самом деле должен быть API для проверки максимального количества источников и количества источников с аппаратным ускорением. Может быть, есть в расширениях.