我正在尝试按照此处列出的步骤使用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);