win sirve que para open microsoft library c++ audio openal

c++ - sirve - OpenAL-determinar las fuentes máximas



para que sirve openal open audio library (3)

¿Existe una API que le permita definir la cantidad máxima de "fuentes" de OpenAL permitidas por el hardware de sonido subyacente?

Buscando en internet, encontré 2 recomendaciones:

  • sigue generando fuentes OpenAL hasta que obtengas un error. Sin embargo, hay una nota en FreeSL (envoltorio OpenAL) que indica que esto es "muy malo e incluso puede bloquear la biblioteca"
  • Supongamos que solo tienes 16; ¿Por qué alguien alguna vez requeriría más? (!)

FreeSL incluso adopta la segunda recomendación.

Entonces, ¿hay una API común para definir el número de "voces" simultáneas admitidas?

Gracias por tu tiempo,

Cuenta


La cantidad de fuentes que puede crear a través de alGenSources() no tiene nada que ver con la cantidad de fuentes que se pueden reproducir simultáneamente .

En el iPad 4 (el único dispositivo que he probado), el número máximo de voces que puedes tocar al mismo tiempo es de 32 . Si intentas reproducir un sonido 33, obtienes un error en alSourcePlay()

AL ERROR: -1 - AL_INVALID (error general)

Y el sonido no se reproduce . Pero la fuente puede existir, puede moverse y tener configuradas las distintas configuraciones. simplemente no se reproducirá hasta que uno de los otros 32 sonidos de reproducción termine de reproducirse.

He creado con éxito hasta 2048 fuentes en un iPad 4, solo usando un bucle. Eso no significa que pueda reproducir 2048 sonidos simultáneamente.

Así que mi respuesta es: pruebe la plataforma de hardware y codifique el SFX simultáneo máximo usted mismo.


Puede consultar la fuente máxima por:

ALCint nummono, numstereo; alcGetIntegerv(device, ALC_MONO_SOURCES, 1, &nummono); alcGetIntegerv(device, ALC_STEREO_SOURCES, 1, &numstereo);

pero esto no es estándar o en la especificación de openAL 1.1 (probablemente se agregará en 1.2), algunos controladores (implementación de openAL) pueden responder a esta consulta y otros no, así que si tiene suerte, obtendrá la respuesta, pero si no , no hay otra solución que llamar a alGenSources() hasta que devuelva el error.

y debe notar que, algunas implementaciones se comportan de manera diferente, AFAIK, por ejemplo, en un iPhone de Apple podrían crear 256 fuentes como máximo, pero no puede reproducir 256 fuentes simultáneamente (limitado a 64), por lo que la fuente máxima no siempre es lo mismo que max juego concurrente.


actualizar:

No puedo encontrar una manera de determinar qué cantidad máxima de fuentes admite un dispositivo, pero creo que he encontrado cómo determinar la cantidad máxima de soporte de un contexto ( ALC_MONO_SOURCES ). Se seguirí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 usando el controlador OpenAL de valores.

La respuesta larga es bien un poco ...

Los controladores OpenAL basados ​​en software generalmente permiten un número infinito de fuentes. Bueno, en realidad no es infinito, con el tiempo maximizarás la CPU o la RAM al final.

La mayoría de los controladores OpenAL basados ​​en hardware solo admiten tantas fuentes como el hardware tenga canales. Modernamente, eso es al menos 16, probablemente 32 o más, pero puede llegar a 256. Probablemente hay tarjetas de sonido que admiten más, pero 256 es la más grande que he visto.

En Windows, los controladores basados ​​en DirectSound están limitados arbitrariamente a 31 (¿por qué no 32?) Fuentes. DirectSound ha quedado en desuso, por lo que no sé si esto todavía se aplica a Vista y Windows 7.

El iPhone soporta 32 fuentes.

He visto un controlador basado en hardware que fue respaldado por software. Lo que significa que le daría a cada fuente un canal de hardware hasta que se agotaran. Luego mezclaría algunos de los sonidos en el software antes de enviarlo fuera del hardware. Esto proporciona lo mejor de ambos mundos, casi infinitas fuentes, y al mismo tiempo usa la mayor aceleración de hardware posible.

En la práctica, si está utilizando un controlador basado en hardware, siga creandolos hasta que falle alGenSources. He oído que esto no funciona en el iPhone. Hay algunos controladores OpenAL basados ​​en software que se bloquearán antes de que falle alGenSources.

Realmente debería haber una API para verificar el número máximo de fuentes y la cantidad de fuentes que son aceleradas por hardware. Tal vez hay en las extensiones.