Condividi tramite


Procedura: Panoramica di un suono

Questo argomento illustra come impostare la matrice di output di una voce di origine mono che restituisce una voce di mastering stereo per ottenere la panoramica tra gli altoparlanti sinistro e destro.

Per configurare la panoramica

  1. Recuperare la configurazione dell'altoparlante usando IXAudio2MasteringVoice::GetChannelMask.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. Creare una matrice per contenere la matrice di output. La dimensione minima della matrice di output è il numero di canali nella voce di origine volte il numero di canali nella voce di output. In questo caso, una matrice di otto elementi gestirà un output vocale mono in qualsiasi formato di output fino a 7.1 audio surround.

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. Calcolare i livelli di invio in base alla panoramica desiderata tra gli altoparlanti sinistro e destro. In questo esempio, i valori di panoramica vanno da -1 a 1 con -1 che indica tutto il suono all'altoparlante sinistro e 1 che indica tutto il suono all'altoparlante destro.

    // 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. Impostare gli indici della matrice di output corrispondenti agli altoparlanti sinistro e destro con i valori calcolati nel passaggio precedente. Gli altoparlanti a sinistra e a destra sono determinati esaminando la maschera del canale restituita da IXAudio2MasteringVoice::GetChannelMask. Poiché i canali devono sempre essere codificati nell'ordine specificato nella pagina di riferimento WAVEFORMATEXTENSIBLE , è possibile determinare l'indice della matrice corrispondente a un singolo altoparlante.

    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. Applicare la matrice di output alla voce di origine usando IXAudio2Voice::SetOutputMatrix. La voce di origine sarà una voce di origine o una voce submix che invia a una voce submix o a una voce mastering. È possibile ottenere informazioni sulle voci di origine e di destinazione, ad esempio il numero di canali, 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 );
    

Guida alla programmazione di XAudio2

Procedura: Creare un grafico di elaborazione audio di base

Controllo volume e passo XAudio2