简体   繁体   中英

IXAudio2 - 0xC0000005: Access violation writing location 0x00000000

I'm having a strange problem with my DirectX XAudio2 program. Everything should work fine, but I'm getting 0xC0000005: Access violation error here:

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

Here is 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:

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

SDKwavefile is in use.

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 . Add some diagnostics to check for null. If you find null then dig deeper to understand why it is so.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM