IXAudio2 - 0xC0000005:访问冲突写入位置0x00000000
IXAudio2 - 0xC0000005: Access violation writing location 0x00000000
我的DirectX XAudio2程序遇到了一个奇怪的问题。一切应该正常工作,但我得到0xC0000005:这里的访问冲突错误:
if(FAILED(hr = xAudio2Engine->CreateSourceVoice(&pAudioTrack->mAudioSource, lWaveFileFormat)))
这是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 文件加载函数.cpp:
AudMa->LoadPCMFile(L"running.wav", mpCharacter->runningSound, true);
SDKwavefile 正在使用中。
请帮忙!
这闻起来很像空指针。有问题的行是:
xAudio2Engine->CreateSourceVoice(&pAudioTrack->mAudioSource, lWaveFileFormat)
因此,为空的明显可能性是xAudio2Engine
和pAudioTrack
。添加一些诊断以检查空。如果您发现 null,请深入挖掘以了解为什么会这样。
相关文章:
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- OPENCV.3.0错误:0xc0000005:访问违规读取位置0x00000000
- 在为矩阵分配值时访问冲突写入位置0x00000000
- 访问违规写作位置0x00000000在阅读/写入向量时
- OpenGL:glDrawArrays()引发异常(nvoglv32.dll)读取位置0x00000000时发生访问冲突
- NVIDIA 在 <work.exe>0xC0000005 中0x002a2da2未处理的异常:访问违规读取位置0x00000000
- 访问冲突写入位置0x00000000.C++/SFML游戏
- 0xC0000005:访问违规读取位置0x00000000
- IXAudio2 - 0xC0000005:访问冲突写入位置0x00000000
- 0xC0000005:访问冲突读取位置0x00000000哈希函数
- 填充数组(写入位置0x00000000的访问冲突)
- DirectX11 网格加载 - 由于纹理而出错(使用 SDKmesh.h)?访问违规读取位置0x00000000
- C++:0xC0000005:访问违规写入位置0x00000000
- 未处理的异常 - 访问冲突读取位置0x00000000
- 访问冲突写入位置0x00000000.内存集函数问题
- 0xC0000005:访问违规读取位置0x00000000
- 访问二叉搜索树中的违规读取位置0x00000000
- 未处理的异常:写入位置0x00000000时发生访问冲突
- 0xC0000005中0x6ececafa处出现未处理的异常:写入位置0x00000000的访问冲突
- c++写入位置0x00000000时发生访问冲突