Ответ 1
обновление:
Я не могу найти способ определить, какое максимальное количество источников поддерживает устройство, но я думаю, что нашел, как определить максимальный контекст (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-драйверы, как правило, допускают бесконечное количество источников. Ну, не совсем бесконечно, в конце концов вы в конечном итоге выйдете из CPU или RAM.
Большинство аппаратных OpenAL-драйверов поддерживают только столько источников, сколько аппаратное обеспечение имеет каналы. В настоящее время, по крайней мере, 16, возможно, 32 или более, но может быть целых 256. Возможно, есть звуковые карты, которые поддерживают больше, но 256 - это самый большой из всех, над чем я когда-либо смотрел.
В Windows DirectSound драйверы произвольно ограничены 31 (почему не 32?) источниками. DirectSound устарел, поэтому я не знаю, распространяется ли это на Vista и Windows 7.
iPhone поддерживает 32 источника.
Я видел один аппаратный драйвер, который был под управлением программного обеспечения. Это означает, что каждый источник будет снабжен аппаратным каналом, пока не закончится. Затем он будет смешивать некоторые звуки в программном обеспечении, прежде чем отправлять его с аппаратного обеспечения. Это дает лучшее из обоих миров, близких к бесконечным источникам, в то же время используя как можно больше аппаратного ускорения.
На практике, если вы используете драйвер на основе оборудования, просто продолжайте создавать их до тех пор, пока не завершится сбой alGenSources. Я слышал, что это не работает на iPhone. Там есть некоторые программные OpenAL-драйверы, которые будут аварийно завершены до того, как alGenSources завершится с ошибкой.
На самом деле должен быть API для проверки максимального количества источников и количества источников, которые ускоряются аппаратными средствами. Возможно, есть расширения.