我正在尝试按照此处列出的步骤使用 XAudio2 和 C++ 播放基本音效:http: //msdn.microsoft.com/en-us/library/windows/desktop/ee415762%28v=vs.85%29。 aspx
在我看来,好像 XAudio2 当前正在正确初始化并且正在创建主控声音。然后我填充一个 WAVEFORMATEX 结构和一个 XAUDIO2_BUFFER 结构。
目前,我坚持使用 CreateSourceVoice() 方法。它返回 HRESULT 0x88960003,MSDN 说这是 XAUDIO2_E_XAPO_CREATION_FAILED 结果。然而,我无法弄清楚是什么导致它失败。有没有办法从 XAudio2 方法生成更有用的错误消息,这些错误消息可能对调试有用?这种方法失败的常见原因是什么?我无法找到有关此问题的任何详细信息。
这是我初始化 XAudio2 的方法:
HRESULT hr;
if (FAILED(hr = XAudio2Create(&xAudio, 0, XAUDIO2_DEFAULT_PROCESSOR)))
{
return hr;
}
if (FAILED(hr = xAudio->CreateMasteringVoice(&masteringVoice)))
{
return hr;
}
return S_OK;
这是我填充结构的方式:
HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
return HRESULT_FROM_WIN32(GetLastError());
}
if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
{
return HRESULT_FROM_WIN32(GetLastError());
}
DWORD dwChunkSize;
DWORD dwChunkPosition;
FindChunk(hFile, fourccRIFF, dwChunkSize, dwChunkPosition);
DWORD fileType;
ReadChunkData(hFile, &fileType, sizeof(DWORD), dwChunkPosition);
if (fileType != fourccWAVE)
{
return S_FALSE;
}
FindChunk(hFile, fourccFMT, dwChunkSize, dwChunkPosition);
ReadChunkData(hFile, wfx, dwChunkSize, dwChunkPosition);
FindChunk(hFile, fourccDATA, dwChunkSize, dwChunkPosition);
BYTE* dataBuffer = new BYTE[dwChunkSize];
ReadChunkData(hFile, dataBuffer, dwChunkSize, dwChunkPosition);
buffer->AudioBytes = dwChunkSize;
buffer->pAudioData = dataBuffer;
buffer->Flags = XAUDIO2_END_OF_STREAM;
return S_OK;
然后我调用 CreateSourceVoice(),但调用后 sourceVoice 为 NULL:
DXHelpers::XAudioManager::GetManager()->GetXAudio()->CreateSourceVoice(&sourceVoice, (WAVEFORMATEX*)&wfx);