首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用XAudio2加载WAV文件

用XAudio2加载WAV文件
EN

Stack Overflow用户
提问于 2014-04-14 17:49:28
回答 1查看 2.1K关注 0票数 0

我正在写一个程序,我可以加载和播放WAV文件,我正在使用XAudio2库,我在msdn.microsoft.com的帮助下开始编写它,现在我几乎完全复制了msdn的代码,它仍然不能工作。我不知道问题出在哪里。当我尝试用CreateSourceVoice播放声音时,我遇到了XAUDIO2_E_INVALID_CALL错误。我将非常感谢你的帮助。这是我的代码:

我的临时main:

代码语言:javascript
复制
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;
}

以及在WAV文件中查找块的函数:

代码语言:javascript
复制
HRESULT FindChunk(HANDLE hFile, DWORD fourcc, DWORD & dwChunkSize, DWORD & dwChunkDataPosition)
{
HRESULT hr = S_OK;
if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0, NULL, FILE_BEGIN))
    return HRESULT_FROM_WIN32(GetLastError());

DWORD dwChunkType;
DWORD dwChunkDataSize;
DWORD dwRIFFDataSize = 0;
DWORD dwFileType;
DWORD bytesRead = 0;
DWORD dwOffset = 0;

while (hr == S_OK)
{
    DWORD dwRead;
    if (0 == ReadFile(hFile, &dwChunkType, sizeof(DWORD), &dwRead, NULL))
        hr = HRESULT_FROM_WIN32(GetLastError());

    if (0 == ReadFile(hFile, &dwChunkDataSize, sizeof(DWORD), &dwRead, NULL))
        hr = HRESULT_FROM_WIN32(GetLastError());

    switch (dwChunkType)
    {
    case fourccRIFF:
        dwRIFFDataSize = dwChunkDataSize;
        dwChunkDataSize = 4;
        if (0 == ReadFile(hFile, &dwFileType, sizeof(DWORD), &dwRead, NULL))
            hr = HRESULT_FROM_WIN32(GetLastError());
        break;

    default:
        if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, dwChunkDataSize, NULL, FILE_CURRENT))
            return HRESULT_FROM_WIN32(GetLastError());
    }

    dwOffset += sizeof(DWORD)* 2;

    if (dwChunkType == fourcc)
    {
        dwChunkSize = dwChunkDataSize;
        dwChunkDataPosition = dwOffset;
        return S_OK;
    }

    dwOffset += dwChunkDataSize;

    if (bytesRead >= dwRIFFDataSize) return S_FALSE;

}

return S_OK;

}

HRESULT ReadChunkData(HANDLE hFile, void * buffer, DWORD buffersize, DWORD bufferoffset)
{
    HRESULT hr = S_OK;
if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, bufferoffset, NULL, FILE_BEGIN))
    return HRESULT_FROM_WIN32(GetLastError());
DWORD dwRead;
if (0 == ReadFile(hFile, buffer, buffersize, &dwRead, NULL))
    hr = HRESULT_FROM_WIN32(GetLastError());
return hr;
}
EN

回答 1

Stack Overflow用户

发布于 2014-05-01 06:36:05

你在哪里实例化你的主音(pMasteringVoice)?XAudio2图期望源语音->掌握语音-> XAudio2。

在您的XAudio2Create调用之后添加以下内容

代码语言:javascript
复制
IXAudio2MasteringVoice* pMasteringVoice = NULL;
if ( FAILED(hr = pXAudio2->CreateMasteringVoice( &pMasteringVoice ) ) )
    return hr;

http://msdn.microsoft.com/en-us/library/windows/desktop/ee415779(v=vs.85).aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23056955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档