2010-05-20 8 views
16

Existe-t-il une API qui vous permet de définir le nombre maximum de "sources" OpenAL autorisées par le matériel sonore sous-jacent?OpenAL - détermine les sources maximales

La recherche sur Internet, j'ai trouvé 2 recommandations:

  • continuer à générer des sources OpenAL jusqu'à ce que vous obtenez une erreur. Cependant, il y a une note dans FreeSL (wrapper OpenAL) indiquant que c'est "très mauvais et peut même planter la bibliothèque"
  • supposons que vous avez seulement 16; Pourquoi quelqu'un aurait-il besoin de plus? (!)

La deuxième recommandation est même adoptée par FreeSL.

Alors, existe-t-il une API commune pour définir le nombre de "voix" simultanées supportées?

Merci pour votre temps,

Bill

+0

Est-ce que OpenAL ne fournit pas autant de sources que nécessaire, événement s'il sera rendu par soft? Le contexte OpenAL n'a qu'un indice (donné au moment de la création) sur le nombre de sources que votre application peut avoir. Je pense que vous devriez laisser cela configurable par besoin de performance. – Arpegius

Répondre

10

mise à jour:

Je ne peux pas trouver un moyen de déterminer quel est le nombre maximum de sources d'un appareil prend en charge, mais je pense que je J'ai trouvé comment déterminer le maximum de support d'un contexte (ALC_MONO_SOURCES). Il s'ensuit qu'un contexte prend en charge le même numéro que son périphérique parent.

//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; 
    } 
} 

Cela renvoie 255 sur Ubuntu 10.4 en utilisant le pilote de stock OpenAL.


La réponse longue est bien un peu ...

pilotes OpenAL à base de logiciels permettent généralement un nombre infini de sources. Eh bien, pas vraiment infini, vous finirez par perdre le CPU ou la RAM.

La plupart des pilotes OpenAL basés sur le matériel prennent uniquement en charge autant de sources que le matériel a des canaux. Moderne, c'est au moins 16, probablement 32 ou plus, mais peut aller jusqu'à 256. Il y a probablement des cartes son qui supportent plus mais 256 est la plus grande que j'ai jamais regardée.

Sous Windows Les pilotes basés sur DirectSound sont arbitrairement limités à 31 sources (pourquoi pas 32?). DirectSound a été déprécié, donc je ne sais pas si cela s'applique encore à Vista et Windows 7.

L'iPhone prend en charge 32 sources.

J'ai vu un pilote basé sur le matériel qui a été sauvegardé par logiciel. Ce qui signifie qu'il donnerait à chaque source un canal matériel jusqu'à ce qu'ils soient épuisés. Ensuite, il serait mélanger certains des sons dans le logiciel avant de l'expédier sur le matériel. Cela donne le meilleur des deux mondes, près de sources infinies, tout en utilisant le plus possible l'accélération matérielle.

En pratique, si vous utilisez un pilote matériel, continuez à les créer jusqu'à ce que alGenSources échoue. J'ai entendu dire que cela ne fonctionne pas sur l'iPhone. Il y a quelques pilotes OpenAL basés sur un logiciel qui vont planter avant qu'AlGenSources échoue.

Il devrait vraiment y avoir une API pour vérifier le nombre maximum de sources et le nombre de sources accélérées matériellement. Peut-être qu'il y a dans les extensions.

+2

mon X-FI peut lire 1024 source en même temps. – uray

+2

Bonne réponse, mais tristement gentil :(En 2012, est-ce toujours le meilleur –

+1

Le X-FI était une excellente carte – bobobobo

4

vous pouvez interroger la source maximale par:

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

mais ce n'est pas standard ou dans la spécification de OpenAL 1.1 (sera probablement ajouté à 1,2), certains pilotes (mise en œuvre OpenAL) peut répondre à cette question et d'autres pas, donc si vous êtes chanceux, vous obtiendrez la réponse, mais sinon, il n'y a pas d'autre solution que d'appeler alGenSources() jusqu'à ce qu'elle renvoie une erreur. Vous remarquerez que certaines implémentations se comportent différemment, AFAIK par exemple sur Apple iPhone ils pourraient créer 256 sources max, mais vous ne pouvez pas lire 256 sources simultanément (limité à 64), donc la source max n'est pas toujours la même chose que le jeu simultané max.

+0

'ALC_STEREO_SOURCES' et' ALC_MONO_SOURCES' sont des paramètres pour demander des capacités par la création de contexte - pas pour l'interrogation Plus d'informations à ce sujet [dans ce livre] (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 fait ce qui a été proposé dans cette réponse fonctionne bien (sur ma machine au moins) – Tara

+0

Peut-être, mais c'est plutôt un coup de chance –

8

Le nombre de sources que vous pouvez créer via alGenSources() n'a rien à voir avec le nombre de sources autorisées à jouer simultanément.

Sur l'iPad 4 (le seul appareil que je l'ai testé), le nombre maximum de voix que vous pouvez avoir jouer simultanément est . Si vous essayez de lire un son 33ème, vous obtenez une erreur à alSourcePlay()

AL ERROR: -1 - AL_INVALID (general error)

Et le son qui ne fonctionne pas jeu. Mais la source peut exister, elle peut bouger et avoir les différents paramètres définis pour elle. il ne fonctionnera pas tant que l'un des 32 autres sons ne sera pas joué.

J'ai réussi à créer jusqu'à 2048 sources sur un iPad 4, en utilisant simplement une boucle. Cela ne signifie pas que je peux jouer 2048 sons simultanément. Donc, ma réponse est: tester vous-même la plate-forme matérielle et le code dans le SFX simultané max.

+0

Note si vous avez 32 sons jouant, et vous 'alSourceStop()', puis 'alSourcePlay()' immédiatement après, vous obtenez toujours l'erreur -1. Le nombre maximum de sons que vous devriez jouer simultanément sur iOS est de 31. – bobobobo

Questions connexes