2010-05-20 14 views
16

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

Buscar en la Internet, me encontré con 2 recomendaciones:

  • seguir generando fuentes de OpenAL hasta que se produce un error. Sin embargo, hay una nota en FreeSL (contenedor OpenAL) que indica que esto es "muy malo e incluso puede bloquear la biblioteca"
  • supongamos que solo tiene 16; ¿Por qué alguien necesitaría más? (!)

La segunda recomendación incluso es adoptada por FreeSL.

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

Gracias por su tiempo,

Bill

+0

¿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

Respuesta

10

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.

+2

mi X-FI puede reproducir fuente 1024 al mismo tiempo. – uray

+2

Buena respuesta, pero amable triste :(A partir de 2012, ¿esto sigue siendo lo mejor? –

+1

La X-FI fue una gran tarjeta – bobobobo

4

puede consultar la máxima fuente de:

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 será añadido en 1.2), algún conductor (aplicación OpenAL) puede 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 al alGenSources() hasta que regrese el error.

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

+0

'ALC_STEREO_SOURCES' y' ALC_MONO_SOURCES' son parámetros para solicitar capacidades por creación de contexto - no para consultar Más sobre este tema [en este libro] (https://books.google.pl/books?id=xtrEvAdSOWEC&pg=PT345&lpg=PT345&dq=alcCreateContext+ALC_MONO_SOURCES&source=bl&ots=f9HL4eMzUy&sig=y7EzhnmRA0P_BJDz4bH69CPMbUo&hl=pl&sa=X&ei=PHMUVbX4EtPUap-ogqAB&ved= 0CDUQ6AEwAw # v = onepage & q = alcCreateContext% 20ALC_MONO_SOURCES & f = false) –

+0

@KrzysztofPrzygoda: En realidad, lo que se propuso en esta respuesta funciona bien (en mi máquina al menos). – Tara

+0

Quizás, pero esto es más bien un golpe de suerte –

8

El número de fuentes que puede crear través alGenSources() no tiene nada que ver con el número de fuentes permite jugar simultáneamente.

En el iPad 4 (el único dispositivo que he probado), el número máximo de voces que puede tener tocando a la vez es . Si intenta reproducir un sonido 33, se produce un error en alSourcePlay()

AL ERROR: -1 - AL_INVALID (general error)

Y el sonido no juego. Pero la fuente puede existir, puede moverse y tener las diversas configuraciones establecidas para ella. 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, simplemente 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 máximo de SFX simultáneamente usted mismo.

+0

Nota si tiene 32 sonidos sonando, y usted 'alSourceStop()', luego 'alSourcePlay()' inmediatamente después, usted todavía obtiene el -1 error. Entonces el _actua l_ número máximo de sonidos que debería haber jugado simultáneamente en iOS es 31. – bobobobo

Cuestiones relacionadas