C++ 使用XAudio2加载WAV文件

C++ 使用XAudio2加载WAV文件,c++,audio,wav,xaudio2,riff,C++,Audio,Wav,Xaudio2,Riff,我正在编写一个可以加载和播放WAV文件的程序,我正在使用XAudio2库,我在msdn.microsoft.com的帮助下开始编写,现在我几乎完全从msdn复制了代码,但仍然无法工作。我不知道问题出在哪里。当我尝试使用CreateSourceVoice播放声音时,出现XAUDIO2\u E\u无效\u调用错误。 我会感谢你的帮助。 他的是我的密码: 我的临时主要意见是: int _tmain(int argc, _TCHAR* argv[]) { TCHAR * strFileName = _T

我正在编写一个可以加载和播放WAV文件的程序,我正在使用XAudio2库,我在msdn.microsoft.com的帮助下开始编写,现在我几乎完全从msdn复制了代码,但仍然无法工作。我不知道问题出在哪里。当我尝试使用CreateSourceVoice播放声音时,出现XAUDIO2\u E\u无效\u调用错误。 我会感谢你的帮助。 他的是我的密码:

我的临时主要意见是:

int _tmain(int argc, _TCHAR* argv[])
{
TCHAR * strFileName = _TEXT("Chimes.wav");
//Creating a instance od XAufio2 Engine
IXAudio2* pXAudio2;
IXAudio2MasteringVoice* pMasteringVoice;
IXAudio2SourceVoice* pSourceVoice;
HRESULT hr;

if ( FAILED( hr = XAudio2Create( &pXAudio2, 0, XAUDIO2_DEFAULT_PROCESSOR ) ) ){
    cout << "XAudio2Create Failed!\n";
}

WAVEFORMATEXTENSIBLE wfx = { 0 };
XAUDIO2_BUFFER buffer = { 0 };

//Open the audio file with CreateFile

HANDLE hFile = CreateFile(
    strFileName,
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    0,
    NULL
    );

DWORD dwChunkPosition = 0;
DWORD dwChunkSize;


if (INVALID_HANDLE_VALUE == hFile)
    cout << "INVALID HANDLE VALUE!\n";
    //return HRESULT_FROM_WIN32(GetLastError());
if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
{
    cout << "INVALID SET FILE POINTER!\n";
    //return HRESULT_FROM_WIN32(GetLastError());
}

cout << "Locating a 'RIFF' and whole data size\n";
FindChunk(hFile, fourccRIFF, dwChunkSize, dwChunkPosition);

cout << "Checking a filetype\n";
DWORD filetype;
ReadChunkData(hFile, &filetype, sizeof(DWORD), dwChunkPosition);

if (filetype != fourccWAVE)
    cout << "This isn't WAVE file!\n";
else cout << "WAVE format!\n";

cout << "Locating a fmt and filling out WAVEFORMATEXTENSIBLE structure\n";
FindChunk(hFile, fourccFMT, dwChunkSize, dwChunkPosition);
ReadChunkData(hFile, &wfx, dwChunkSize, dwChunkPosition);

cout << "Locating a DATA\n";
FindChunk(hFile, fourccDATA, dwChunkSize, dwChunkPosition);

cout << "Reading a sound\n";
BYTE * pDataBuffer = new BYTE[dwChunkSize];
ReadChunkData(hFile, pDataBuffer, dwChunkSize, dwChunkPosition);
buffer.AudioBytes = dwChunkSize;
buffer.pAudioData = pDataBuffer;
buffer.Flags = XAUDIO2_END_OF_STREAM;

//Plaing preloaded sound;
if (FAILED(hr = pXAudio2->CreateSourceVoice(&pSourceVoice, (WAVEFORMATEX*)&wfx)))
    cout << "Playing sound Failed!\n";

system("PAUSE");
return 0;
}

您在哪里实例化您的主控语音(pMasteringVoice)?XAudio2图形需要源语音->主控语音->XAudio2

在XAudio2Create调用后添加以下内容

IXAudio2MasteringVoice* pMasteringVoice = NULL;
if ( FAILED(hr = pXAudio2->CreateMasteringVoice( &pMasteringVoice ) ) )
    return hr;

IXAudio2MasteringVoice* pMasteringVoice = NULL;
if ( FAILED(hr = pXAudio2->CreateMasteringVoice( &pMasteringVoice ) ) )
    return hr;