简体   繁体   English

IXAudio2-0xC0000005:访问冲突写入位置0x00000000

[英]IXAudio2 - 0xC0000005: Access violation writing location 0x00000000

I'm having a strange problem with my DirectX XAudio2 program. 我的DirectX XAudio2程序遇到一个奇怪的问题。 Everything should work fine, but I'm getting 0xC0000005: Access violation error here: 一切正常,但我得到0xC0000005:访问冲突错误在这里:

if(FAILED(hr = xAudio2Engine->CreateSourceVoice(&pAudioTrack->mAudioSource, lWaveFileFormat)))

Here is XAudio2Manager.cpp: 这是XAudio2Manager.cpp:

#include "XAudio2Manager.h"
#include <exception>

class XAudio2InitException: public std::exception
{
    virtual const char* what() const throw()
    {
        return "XAudio2 Initialiation failed";
    }
} XAudio2ex;

template <class T> void SafeRelease(T **ppT)
{
    if(*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

cAudioTrack::cAudioTrack()
{
    mIsPlaying = false;
}

//cAudioTrack::~cAudioTrack();
//{

//}

void cAudioTrack::Play()
{
    if(!mIsPlaying)
    {
        mAudioSource->Start();
        mIsPlaying = true;
    }
}

void cAudioTrack::Pause()
{
    if(mIsPlaying)
    {
        mAudioSource->Stop();
        mIsPlaying = false;
    }
}

void cAudioTrack::Reset()
{
    mAudioSource->FlushSourceBuffers();
    mAudioSource->SubmitSourceBuffer(&buffer);
    mIsPlaying = false;
}

cXAudio2Manager::cXAudio2Manager()
{
    xAudio2Engine = NULL;
    masterVoice = NULL;

    HRESULT hr = S_OK;

    // Create audio engine
    if(SUCCEEDED(hr))
    {
        hr = XAudio2Create(&xAudio2Engine);
    }

    // Create mastering voice
    if(SUCCEEDED(hr))
    {
        hr = xAudio2Engine->CreateMasteringVoice(&masterVoice,
            XAUDIO2_DEFAULT_CHANNELS, XAUDIO2_DEFAULT_SAMPLERATE,
            0,0, NULL);
    }

    // If failed, throw exception
    if(!SUCCEEDED(hr))
    {
        throw XAudio2ex;
    }
}

bool cXAudio2Manager::LoadPCMFile(LPWSTR filename, cAudioTrack *pAudioTrack, bool pLooping)
{
    HRESULT hr = S_OK;

    // Read wave file
    CWaveFile lWaveFile;

    if(FAILED(hr = lWaveFile.Open(const_cast<LPWSTR>(filename), nullptr, WAVEFILE_READ)))
    {
        return false;
    }

    // Get file format
    WAVEFORMATEX* lWaveFileFormat = lWaveFile.GetFormat();

    // Calculate bytes and samples 
    DWORD lWaveFileSize = lWaveFile.GetSize();

    // Read sample data from wave file in to memory
    BYTE* lWaveData = new BYTE[lWaveFileSize];
    if(FAILED(hr = lWaveFile.Read(lWaveData, lWaveFileSize, &lWaveFileSize)))
    {
        if (lWaveData)
            delete[] lWaveData;
        return false;
    }  

    if(FAILED(hr = xAudio2Engine->CreateSourceVoice(&pAudioTrack->mAudioSource, lWaveFileFormat)))
    {
        if(lWaveData)
            delete [] lWaveData;
        return false;
    }

    XAUDIO2_BUFFER buffer = {0};
    pAudioTrack->buffer = buffer;
    pAudioTrack->buffer.pAudioData = lWaveData;
    pAudioTrack->buffer.Flags = XAUDIO2_END_OF_STREAM;
    pAudioTrack->buffer.AudioBytes = lWaveFileSize;
    if(pLooping)
    {
        pAudioTrack->buffer.LoopCount = XAUDIO2_LOOP_INFINITE;
    }

    if(FAILED(hr = pAudioTrack->mAudioSource->SubmitSourceBuffer(&pAudioTrack->buffer)))
    {
        pAudioTrack->mAudioSource->DestroyVoice();
        if(lWaveData)
            delete [] lWaveData;
        return false;
    }

    return true;
}

Wave file loading function is called in Game.cpp: Wave文件加载功能在Game.cpp中被调用:

AudMa->LoadPCMFile(L"running.wav", mpCharacter->runningSound, true); 

SDKwavefile is in use. SDKwavefile正在使用中。

Please help! 请帮忙!

That smells awfully like a null pointer. 闻起来像一个空指针。 The line in question is: 有问题的行是:

xAudio2Engine->CreateSourceVoice(&pAudioTrack->mAudioSource, lWaveFileFormat)

So the obvious possibilities for being null are xAudio2Engine and pAudioTrack . 因此,可能为null的明显可能性是xAudio2EnginepAudioTrack Add some diagnostics to check for null. 添加一些诊断以检查是否为空。 If you find null then dig deeper to understand why it is so. 如果您发现null,请更深入地了解为什么会这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 0xC0000005:访问冲突读取位置0x00000000 - 0xC0000005: Access violation reading location 0x00000000 0xC0000005:访问冲突执行位置0x00000000 - 0xC0000005: Access violation executing location 0x00000000 0xC0000005:访问冲突读取位置0x00000000 - 0xC0000005: Access violation reading location 0x00000000 在0xC0000005中的0x6ececafa出现未处理的异常:访问冲突写入位置0x00000000 - Unhandled Exception as at 0x6ececafa in 0xC0000005 : Access violation writing location 0x00000000 C ++:0xC0000005:访问冲突写入位置0x00000000 - C++: 0xC0000005: Access violation writing location 0x00000000 : 0xC0000005: 访问冲突写入位置 0x00000000 C++ 与内联汇编 - : 0xC0000005: Access violation writing location 0x00000000 C++ with inline assembly Project4.exe中0x00998876处的首次机会异常:0xC0000005:访问冲突写入位置0x00000000 - First-chance exception at 0x00998876 in Project4.exe: 0xC0000005: Access violation writing location 0x00000000 在 Project0_opengl.exe 中的 0x00000000 处抛出异常:0xC0000005:访问冲突执行位置 0x00000000 - Exception thrown at 0x00000000 in Project0_opengl.exe: 0xC0000005: Access violation executing location 0x00000000 在 CobwebDiagram.exe 中的 0x00000000 处引发异常:0xC0000005:访问冲突执行位置 0x00000000 - Exception thrown at 0x00000000 in CobwebDiagram.exe: 0xC0000005: Access violation executing location 0x00000000 MyString.exe中0x0FC9E559(ucrtbased.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00000000 - Unhandled exception at 0x0FC9E559 (ucrtbased.dll) in MyString.exe: 0xC0000005: Access violation writing location 0x00000000
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM