0

我正在研究 Microsoft XAudio2 的 X3Daudio 示例代码,并且对将源语音与子混音和母带语音并行发送感到困惑。

if( FAILED( hr = g_audioState.pXAudio2->CreateMasteringVoice( &g_audioState.pMasteringVoice ) ) )
{
    SAFE_RELEASE( g_audioState.pXAudio2 );
    return hr;
}
if( FAILED( hr = g_audioState.pXAudio2->CreateSubmixVoice( &g_audioState.pSubmixVoice, 1,
                                                           nSampleRate, 0, 0,
                                                           nullptr, &effectChain ) ) )
{
    SAFE_RELEASE( g_audioState.pXAudio2 );
    SAFE_RELEASE( g_audioState.pReverbEffect );
    return hr;
}

//最后第二个参数nullptr->没有指向子混合语音的sendlist指针,我的理解是,这个子混合语音没有输出。

XAUDIO2_SEND_DESCRIPTOR sendDescriptors[2];
sendDescriptors[0].Flags = XAUDIO2_SEND_USEFILTER; // LPF direct-path
sendDescriptors[0].pOutputVoice = g_audioState.pMasteringVoice;
sendDescriptors[1].Flags = XAUDIO2_SEND_USEFILTER; // LPF reverb-path -- omit for better performance at the cost of less realistic occlusion
sendDescriptors[1].pOutputVoice = g_audioState.pSubmixVoice;
const XAUDIO2_VOICE_SENDS sendList = { 2, sendDescriptors };

// create the source voice
V_RETURN( g_audioState.pXAudio2->CreateSourceVoice( &g_audioState.pSourceVoice, pwfx, 0,
                                                    2.0f, nullptr, &sendList ) );

源声音会将声音发送到主声音和子混合声音。子混音会在声音上添加混响效果。但是我看不到子混音声音在哪里发送后处理和混响效果,使声音能够通过母带声音输出到扬声器。

如果您在创建时未指定发送列表,则子混音默认将其声音数据发送到主语音。为什么在这个示例中,我们还需要同时将源语音发送到母带语音?演示输出声音始终带有混响效果。我没有看到示例可执行文件中有禁用混响效果的选项。

我感到很困惑。

4

1 回答 1

0

如果您不提供发送列表,则语音会自动连接到主控语音。根据MSDN

pSendList [in, optional]
    Pointer to a list of XAUDIO2_VOICE_SENDS structures that describe
    the set of destination voices for the submix voice. If pSendList is
    NULL, the send list will default to a single output to the first
    mastering voice created.

但是,如果您提供了发送列表,那么除非您在发送列表中指定,否则语音的输出不会发送到主控语音。因此,为什么源语音专门发送到主控语音和子混音语音。

对子混音声音进行混响的原因是优化。它允许所有受混响影响的源语音进行处理,包括过滤和源速率转换为子混音语音,然后通常昂贵的效果(在这种情况下是环境混响)可以运行一次,而不是每个源语音。此外,子混合语音被制成单声道而不是多声道,因此任何立体声或多声道源在效果处理之前也被下混到子混合语音中。第三,这允许您将一些声音发送到主声音,而不是从混响中排除的子混音(通常是 HUD 和界面声音)。

请注意,最新版本的 XAudio2 示例可以在GitHub上找到。您可能还想看看DirectX Tool Kit for Audio

于 2016-02-01T21:27:23.343 回答