Freigeben über


Vorgehensweise: Schwenken eines Sounds

In diesem Thema erfahren Sie, wie Sie die Ausgabematrix einer Mono-Quellstimme festlegen können, die an eine Stereomasterstimme ausgegeben wird, um eine Verschiebung zwischen dem linken und rechten Lautsprecher zu erreichen.

So richten Sie die Verschiebung ein

  1. Rufen Sie die Sprecherkonfiguration mit IXAudio2MasteringVoice::GetChannelMask ab.

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. Erstellen Sie ein Array, das die Ausgabematrix enthält. Die Mindestgröße der Ausgabematrix ist die Anzahl der Kanäle in der Quellstimme mal die Anzahl der Kanäle in der Ausgabestimme. In diesem Fall verarbeitet ein Array mit acht Elementen eine Mono-Sprachausgabe in ein beliebiges Ausgabeformat bis zu 7.1-Surround-Sound.

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. Berechnen Sie die Sendeebenen basierend auf der gewünschten Verschiebung zwischen dem linken und rechten Lautsprecher. In diesem Beispiel liegen die Schwenkwerte zwischen -1 und 1, wobei -1 den gesamten Sound für den linken Lautsprecher und 1 den gesamten Sound zum rechten Lautsprecher angibt.

    // 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. Legen Sie die Ausgabematrixindizes für den linken und rechten Lautsprecher mit den werten fest, die im vorherigen Schritt berechnet wurden. Die linken und rechten Lautsprecher werden durch Die Von IXAudio2MasteringVoice::GetChannelMask zurückgegebene Kanalmaske bestimmt. Da die Kanäle immer in der auf der WAVEFORMATEXTENSIBLE-Referenzseite angegebenen Reihenfolge codiert werden müssen, ist es möglich, den Arrayindex zu bestimmen, der einem einzelnen Sprecher entspricht.

    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. Wenden Sie die Ausgabematrix mithilfe von IXAudio2Voice::SetOutputMatrix auf die ursprüngliche Stimme an. Die ursprüngliche Stimme ist entweder eine Quellstimme oder eine Submixstimme, die entweder an eine Submixstimme oder eine Masterstimme sendet. Mithilfe von IXAudio2Voice::GetVoiceDetails können Sie Informationen zu den Ursprungs- und Zielstimme abrufen, z. B. die Anzahl der Kanäle.

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

XAudio2-Programmieranleitung

So wird's gemacht: Erstellen eines grundlegenden Audioverarbeitungsdiagramms

XAudio2-Lautstärke- und Tonhöhensteuerung