Partager via


Procédure : panoramique d’un son

Cette rubrique vous montre comment définir la matrice de sortie d’une voix mono source qui génère une voix de mastering stéréo afin d’obtenir un panoramique entre les haut-parleurs gauche et droit.

Pour configurer le panoramique

  1. Récupérez la configuration de l’orateur à l’aide de IXAudio2MasteringVoice::GetChannelMask.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. Créez un tableau pour contenir la matrice de sortie. La taille minimale de la matrice de sortie est le nombre de canaux dans la voix source multiplié par le nombre de canaux dans la voix de sortie. Dans ce cas, un tableau de huit éléments gère une sortie de voix mono dans n’importe quel format de sortie jusqu’au son surround 7.1.

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. Calculez les niveaux d’envoi en fonction du panoramique souhaité entre les haut-parleurs gauche et droit. Dans cet exemple, les valeurs panoramiques vont de -1 à 1, -1 indiquant tout le son à l’orateur gauche et 1 indiquant tout le son à l’orateur droit.

    // 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. Définissez les index de matrice de sortie correspondant aux haut-parleurs de gauche et de droite avec les valeurs calculées à l’étape précédente. Les haut-parleurs gauche et droit sont déterminés en examinant le masque de canal retourné par IXAudio2MasteringVoice::GetChannelMask. Étant donné que les canaux doivent toujours être encodés dans l’ordre spécifié dans la page de référence WAVEFORMATEXTENSIBLE , il est possible de déterminer l’index de tableau correspondant à un orateur individuel.

    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. Appliquez la matrice de sortie à la voix d’origine à l’aide de IXAudio2Voice::SetOutputMatrix. La voix d’origine sera soit une voix source, soit une voix de sous-mixage envoyée à une voix de sous-mixage ou à une voix de mastering. Vous pouvez obtenir des informations sur les voix d’origine et de destination, comme leur nombre de canaux, à l’aide de 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 );
    

Guide de programmation XAudio2

Procédure : créer un graphique de traitement audio de base

Contrôle de volume et de tangage XAudio2