为什么 XAudio2 只在系统暂停时才播放 .wav 文件?

Why does XAudio2 play .wav files only when the system is paused?

我已经按照 Microsoft 网站上的教程进行操作,并创建了自己的 SoundEngine 和 Sound class 结构,以便在 main 中抽象出代码,但是每当我进行诸如 batmanWav->play() 之类的调用时,它只会在我写 std::cin.get()system("PAUSE")

时播放音频

这是为什么?我将尝试将其移植到已经开发的游戏中,但我显然不希望每次播放声音时游戏都停止。

编辑:我被要求展示一些有问题的代码

int main() 
{
CoInitializeEx(nullptr, COINIT_MULTITHREADED);

Sound batman("batman.wav");
Sound alien("alien.wav");

alien.play();

batman.play();
system("PAUSE");
CoUninitialize();

}

Sound.cpp

HRESULT Sound::play()
{
HRESULT hr = S_OK;
if (FAILED(hr = pSourceVoice->Start(0)))
    return hr;

return hr;
}

我为每个 Sound 对象初始化了一个源声音,每个声音对象都引用相同的母带声音和 IXAudio2 *pXAudio2 对象。我用来加载波形文件数据的代码直接取自 MSDN 文档。

正如有人已经指出的那样,问题是您的应用程序在声音真正开始播放之前就退出了。 XAudio2 是非阻塞的 API,这意味着您必须保持内存和音频图处于活动状态,直到声音播放完毕。

换句话说,当您调用 IXAudio2SourceVoice::Start 时,除了记录您要开始播放音频外,没有任何反应。作为 IXAudio2 对象的一部分创建的另一个线程随后会看到该请求并开始处理播放请求。到那时,您的应用程序已经退出并且进程终止,除非您 'pause'.

尝试类似 XAudio2BasicSound 中的以下操作:

hr = pSourceVoice->Start( 0 );

// Let the sound play
BOOL isRunning = TRUE;
while( SUCCEEDED( hr ) && isRunning )
{
    XAUDIO2_VOICE_STATE state;
    pSourceVoice->GetState( &state );
    isRunning = ( state.BuffersQueued > 0 ) != 0;

    Sleep( 10 );
}

You should look at these samples and at DirectX Tool Kit for Audio.