Compartilhar via


Como fazer pan a sound

Este tópico mostra como você pode definir a matriz de saída de uma voz de origem mono que é gerada para uma voz de domínio estéreo para alcançar o movimento panorâmico entre os alto-falantes esquerdo e direito.

Para configurar o movimento panorâmico

  1. Recupere a configuração do alto-falante usando IXAudio2MasteringVoice::GetChannelMask.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. Crie uma matriz para manter a matriz de saída. O tamanho mínimo da matriz de saída é o número de canais na voz de origem que vezes o número de canais na voz de saída. Nesse caso, uma matriz de oito elementos manipulará uma saída de voz mono para qualquer formato de saída de até 7,1 som surround.

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. Calcule os níveis de envio com base no movimento panorâmico desejado entre os alto-falantes esquerdo e direito. Neste exemplo, os valores de painel variarão de -1 a 1 com -1 indicando todo o som para o alto-falante esquerdo e 1 indicando todo o som para o alto-falante direito.

    // pan of -1.0 indicates all left speaker, 
    // 1.0 is all right speaker, 0.0 is split between left and right
    float left = 0.5f - pan / 2;
    float right = 0.5f + pan / 2; 
    
  4. Defina os índices de matriz de saída correspondentes aos alto-falantes à esquerda e à direita com os valores calculados na etapa anterior. Os alto-falantes à esquerda e à direita são determinados examinando a máscara de canal retornada por IXAudio2MasteringVoice::GetChannelMask. Como os canais sempre devem ser codificados na ordem especificada na página de referência WAVEFORMATEXTENSIBLE , é possível determinar o índice de matriz correspondente a um alto-falante individual.

    switch (dwChannelMask)
    {
    case SPEAKER_MONO:
        outputMatrix[0] = 1.0;
        break;
    case SPEAKER_STEREO:
    case SPEAKER_2POINT1:
    case SPEAKER_SURROUND:
        outputMatrix[0] = left;
        outputMatrix[1] = right;
        break;
    case SPEAKER_QUAD:
        outputMatrix[0] = outputMatrix[2] = left;
        outputMatrix[1] = outputMatrix[3] = right;
        break;
    case SPEAKER_4POINT1:
        outputMatrix[ 0 ] = outputMatrix[ 3 ] = left;
        outputMatrix[ 1 ] = outputMatrix[ 4 ] = right;
        break;
    case SPEAKER_5POINT1:
    case SPEAKER_7POINT1:
    case SPEAKER_5POINT1_SURROUND:
        outputMatrix[ 0 ] = outputMatrix[ 4 ] = left;
        outputMatrix[ 1 ] = outputMatrix[ 5 ] = right;
        break;
    case SPEAKER_7POINT1_SURROUND:
        outputMatrix[ 0 ] = outputMatrix[ 4 ] = outputMatrix[ 6 ] = left;
        outputMatrix[ 1 ] = outputMatrix[ 5 ] = outputMatrix[ 7 ] = right;
        break;
    }
    
  5. Aplique a matriz de saída à voz de origem usando IXAudio2Voice::SetOutputMatrix. A voz de origem será uma voz de origem ou uma voz de submixagem enviando para uma voz de submixagem ou uma voz de mestre. Você pode obter informações sobre as vozes de origem e de destino, como o número de canais, usando IXAudio2Voice::GetVoiceDetails.

    // Assuming pVoice sends to pMasteringVoice
    
    XAUDIO2_VOICE_DETAILS VoiceDetails;
    pVoice->GetVoiceDetails(&VoiceDetails);
    
    XAUDIO2_VOICE_DETAILS MasterVoiceDetails;
    pMasteringVoice->GetVoiceDetails(&MasterVoiceDetails);
    
    pVoice->SetOutputMatrix( NULL, VoiceDetails.InputChannels, MasterVoiceDetails.InputChannels, outputMatrix );
    

Guia de Programação em XAudio2

Como: Compilar um gráfico de processamento de áudio básico

XAudio2 Volume e Controle de Tom