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

时间:2018-06-02 21:30:03

标签: c++ audio directx xaudio2

我已经按照微软网站上的教程,创建了我自己的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();

}

Sound.cpp

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

return hr;
}

对于每个Sound对象,我初始化了一个源语音,每个语音都引用了相同的母带语音和IXAudio2 *pXAudio2对象。我用来加载wave文件数据的代码是直接从MSDN文档中获取的。

1 个答案:

答案 0 :(得分:1)

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

换句话说,当您调用import pytest import re def parse_area(string): """Parse the string '1,500 sqft' into the integer 1500""" m = re.search(r'[\d,]+(?= sqft)', string) return int(m[0].replace(',', '')) if m else None def test_parse_area(): assert parse_area('1,500 sqft') == 1500 def test_parse_area_null_case(): assert parse_area('no area here') == None if __name__ == "__main__": pytest.main([__file__]) 时,除了记录您要启动音频之外没有任何其他事情发生。作为'NoneType' not subscriptable对象的一部分创建的另一个线程然后查看请求并开始处理回放请求。到那时,除非你'暂停',否则你的申请已经退出并且流程终止。

尝试IXAudio2SourceVoice::Start中的以下内容:

IXAudio2
  

您应该查看这些samplesDirectX Tool Kit for Audio