actualización:
no puedo encontrar una manera de determinar cuál es el número máximo de fuentes de un dispositivo compatible, pero creo que He encontrado cómo determinar el máximo que admite un contexto (ALC_MONO_SOURCES
). De esto se desprendería que un contexto admite el mismo número que su dispositivo principal.
//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;
}
}
Esto devuelve 255 en Ubuntu 10.4 utilizando el controlador OpenAL original.
La respuesta larga es bien poco ... OpenAL conductores basados
software en general permiten que un número infinito de fuentes. Bueno, en realidad no es infinito, con el tiempo se agotará la CPU o la RAM.
La mayoría de los controladores OpenAL basados en hardware solo admiten tantas fuentes como el hardware tenga canales. Modernamente es al menos 16, probablemente 32 o más, pero puede llegar a ser 256. Probablemente haya tarjetas de sonido que admitan más, pero 256 es la más grande que he visto en mi vida.
En Windows, los controladores basados en DirectSound están arbitrariamente limitados a 31 (¿por qué no 32?) Fuentes. DirectSound ha quedado en desuso, así que no sé si esto todavía se aplica a Vista y Windows 7.
El iPhone admite 32 fuentes.
He visto un controlador basado en hardware con respaldo de software. Lo que significa que le daría a cada fuente un canal de hardware hasta que se agoten. Luego, mezclaría algunos de los sonidos en el software antes de enviarlo fuera del hardware. Esto le da lo mejor de ambos mundos, cerca de fuentes infinitas, mientras sigue usando la mayor aceleración de hardware posible.
En la práctica, si utiliza un controlador basado en hardware, simplemente siga creando hasta que alGenSources falle. He oído que esto no funciona en el iPhone. Hay algunos controladores OpenAL basados en software que fallarán antes de que alGenSources falle.
Realmente debería haber una API para verificar la cantidad máxima de fuentes y la cantidad de fuentes que son aceleradas por hardware. Tal vez hay en las extensiones.
¿No es OpenAL proporcionar tantas fuentes como sea necesario, evento si se procesará por soft? El contexto OpenAL tiene solo una pista (dada en el momento de la creación) sobre cuántas fuentes puede tener su aplicación. Creo que deberías dejar esto configurable según la necesidad de rendimiento. – Arpegius