Asignación de canales predeterminada de XAudio2
Un cliente XAudio2 tiene control total de la asignación de los canales de una voz a los canales de cada una de sus voces de destino. Controla la asignación mediante el uso del método IXAudio2Voice::SetOutputMatrix . Sin embargo, en algunas circunstancias, XAudio2 simplifica esta tarea configurando automáticamente una matriz de envío predeterminada. Para ello, usa la máscara de canal, si existe, asociada a los canales de audio de una voz. Una máscara de canal es una combinación de SPEAKER_xxx máscaras de bits tal y como se define en X3DAudio.h y en otro lugar. XAudio2 requiere que las máscaras de canal sean 0 o tengan el mismo número de bits establecido que el número de canales.
En la tabla siguiente se muestran los requisitos de máscara de canal y los valores predeterminados de los formatos admitidos por XAudio2.
Formato | Requisito de máscara de canal | Máscara predeterminada | Miembro de estructura correspondiente |
---|---|---|---|
PCM | El archivo puede contener una máscara de canal | La máscara de canal es 0 o falta | WAVEFORMATEXTENSIBLE.dwChannelMask o none (WAVEFORMATEX) |
ADPCM | El archivo no contiene una máscara de canal | Máscara de canal predeterminada siempre se usa | None (ADPCMWAVEFORMAT) |
Para las voces de submezcla y maestro, y para las voces de origen sin una máscara de canal o una máscara de canal de 0, XAudio2 asume las posiciones predeterminadas del hablante según la tabla siguiente.
Canales | Posiciones implícitas del canal |
---|---|
1 | Siempre se asigna a FrontLeft y FrontRight a escala completa en ambos altavoces (caso especial para sonidos mono) |
2 | FrontLeft, FrontRight (configuración estéreo básica) |
3 | FrontLeft, FrontRight, LowFrequency (configuración 2.1) |
4 | FrontLeft, FrontRight, BackLeft, BackRight (cuadrática) |
5 | FrontLeft, FrontRight, FrontCenter, SideLeft, SideRight (configuración 5.0) |
6 | FrontLeft, FrontRight, FrontCenter, LowFrequency, SideLeft, SideRight (configuración 5.1) (consulte los comentarios siguientes) |
7 | FrontLeft, FrontRight, FrontCenter, LowFrequency, SideLeft, SideRight, BackCenter (configuración 6.1) |
8 | FrontLeft, FrontRight, FrontCenter, LowFrequency, BackLeft, BackRight, SideLeft, SideRight (configuración 7.1) |
9 o más | Sin posiciones implícitas (asignación uno a uno) |
Si un par de voz determinado en el gráfico de audio no tiene posiciones de altavoz asociadas a su voz de origen o de destino (una voz tiene más de ocho canales), ninguna voz se puede reproducir hasta que la voz de origen tenga un conjunto de matrices de envío explícitamente mediante el método IXAudio2Voice::SetOutputMatrix . Al llamar al método IXAudio2SourceVoice::Start para cualquiera de las voces, se producirá un error hasta que lo haga.
Si la voz de origen y la voz de destino tienen diferentes números de posiciones del hablante y no se ha llamado a IXAudio2Voice::SetOutputMatrix en la voz de origen, XAudio2 envía cada canal de origen al altavoz de destino más cercano (o altavoces) disponible, proporcionalmente a lo cerca que están al hablante previsto. Hay dos casos especiales en los que el comportamiento predeterminado es diferente.
- Si el audio de origen es mono y se coloca en SPEAKER_FRONT_CENTER o no tiene ninguna posición definida, siempre se envía a SPEAKER_FRONT_LEFT y SPEAKER_FRONT_RIGHT si existen en el audio de salida. Si no existen, vuelve al caso normal.
- Si el origen y el destino son de 6 canales y se colocan en cualquiera de las configuraciones de altavoz estándar 5.1 (Left+Right+Center+Sub+BackL+BackR o Left+Right+Center+Sub+SideR), los canales se asignan de uno a uno. En otras palabras, SideLeft/Right y BackLeft/Right se tratan de forma equivalente. Esto se debe a que ha habido confusión histórica en torno a estas configuraciones. Por lo tanto, la intención asumida siempre es asignar una a una.
Temas relacionados