我已经按照微软网站上的教程,创建了我自己的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文档中获取的。
答案 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
您应该查看这些samples和DirectX Tool Kit for Audio。