如何:平移声音

本主题介绍如何设置输出到立体声主语音的单声道源语音的输出矩阵,以实现左右扬声器之间的平移。

设置平移

  1. 使用 IXAudio2MasteringVoice::GetChannelMask 检索扬声器配置。

    DWORD dwChannelMask;       
    pMasteringVoice->GetChannelMask( &dwChannelMask );       
    
  2. 创建一个数组来保存输出矩阵。 输出矩阵的最小大小是源语音中的声道数乘以输出语音中的声道数。 在这种情况下,8 元素数组将处理单声道语音输出,使其输出到任何输出格式,最大为 7.1 环绕声。

    float outputMatrix[ 8 ];
    for (int i=0; i<8; i++) outputMatrix[i] = 0;
    
  3. 根据左右扬声器之间的所需平移计算发送级别。 在此示例中,平移值的范围是从 -1 到 1,其中 -1 表示左侧扬声器的所有声音,1 表示右侧扬声器的所有声音。

    // 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. 使用上一步中计算的值设置与左侧和右侧扬声器对应的输出矩阵索引。 左右扬声器是通过查看 IXAudio2MasteringVoice::GetChannelMask 返回的通道掩码来确定的。 由于通道必须始终按照 WAVEFORMATEXTENSIBLE 参考页上指定的顺序进行编码,因此可以确定对应于单个说话人的数组索引。

    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. 使用 IXAudio2Voice::SetOutputMatrix 将输出矩阵应用于原始语音。 原始语音将是源语音或发送到子混合语音或主语音的子混合语音。 可以使用 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 );
    

XAudio2 编程指南

如何:构建基本的音频处理图

XAudio2 音量和音调控制