2

我已经按照微软网站上的教程进行操作,并创建了自己的 SoundEngine 和 Sound 类结构,以便在 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();

}

声音.cpp

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

return hr;
}

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

4

1 回答 1

2

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

换句话说,当您调用 时IXAudio2SourceVoice::Start,除了记录您要启动音频外,什么也没有发生。作为IXAudio2对象的一部分创建的另一个线程随后会看到该请求并开始处理播放请求。到那时,您的应用程序已经退出并且进程终止,除非您“暂停”。

尝试以下类似的操作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 );
}

您应该查看这些示例DirectX Tool Kit for Audio

于 2018-06-05T05:55:38.420 回答