1

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

0 回答 0