XAudio2
Verfasst: 06.02.2013, 23:05
Hallo liebe ZFX Community :)
Seit zwei Tagen versuche ich eine Windows Sound Datei vom Typ wav abzuspielen. Der Sound ist hörbar doch ended er in undefinierbares Gerausche und dann stürzt das Programm ab. Fehlertyp: Speicherzugriffsverletzung d.h. XAudio2 greift bzw. schreibt auf nicht referenzierten Speicher. Aus dem Web hab ich folgende Codefragmente gefunden und wie folgt "umgecoded":
Die Klasse die die Sounds verwaltet (Prototyp in Entwicklung)
XAudio2 Gerät bereit machen:
Sound Datei vom Typ wav laden
Abspielen des Sounds über
Diese Funktionen befinden sich in einer dll und werden von "aussen" aufgerufen mit folgenden Befehlen
Ich vermute den Fehler in der Ladefunktion die den XAUDIO2_BUFFER nicht richtig füllt. Vielleicht hat jemand hier damit mehr Erfahrung und könnte Tipps geben :).
Seit zwei Tagen versuche ich eine Windows Sound Datei vom Typ wav abzuspielen. Der Sound ist hörbar doch ended er in undefinierbares Gerausche und dann stürzt das Programm ab. Fehlertyp: Speicherzugriffsverletzung d.h. XAudio2 greift bzw. schreibt auf nicht referenzierten Speicher. Aus dem Web hab ich folgende Codefragmente gefunden und wie folgt "umgecoded":
Die Klasse die die Sounds verwaltet (Prototyp in Entwicklung)
Code: Alles auswählen
/**
* Class definition for a DI input device, implementing the
* interface InputDevice
*/
class DS : public SoundDevice {
public:
DS(HINSTANCE hInst);
~DS(void);
// initialize the stuff
HRESULT Init(HWND hWnd);
// interface functions
void Release(void);
bool IsRunning(void) { return m_bRunning; }
HRESULT LoadSound(const char*, UINT*);
void PlaySound(void);
private:
IXAudio2* m_pEngine;
IXAudio2SourceVoice* m_pSource;
IXAudio2MasteringVoice* m_pMaster;
WAVEFORMATEX m_wf;
XAUDIO2_BUFFER m_xa;
BYTE* m_pWaveData;
// write to log file
void Log(char *, ...);
}; // class DS
/*----------------------------------------------------------------*/
Code: Alles auswählen
HRESULT DS::Init(HWND hWnd) {
HRESULT hr=_FAIL;
//must call this for COM
CoInitializeEx( NULL, COINIT_MULTITHREADED );
//create the engine
if( hr = FAILED( XAudio2Create( &m_pEngine ) ) )
{
CoUninitialize();
return _FAIL;
}
//create the mastering voice
if( hr = FAILED( m_pEngine->CreateMasteringVoice( &m_pMaster ) ) )
{
m_pEngine->Release();
CoUninitialize();
return _FAIL;
}
m_bRunning = true;
Log("initialized (online and ready)");
return _OK;
}
/*----------------------------------------------------------------*/
Code: Alles auswählen
HRESULT DS::LoadSound(const char* szFile, UINT* puiID) {
HRESULT hr=_FAIL;
if(szFile == NULL)
return _FAIL;
std::ifstream inFile(szFile, std::ios::binary | std::ios::in);
if(inFile.bad())
return _FAIL;
DWORD dwChunkId = 0, dwFileSize = 0, dwChunkSize = 0, dwExtra = 0;
//look for 'RIFF' chunk identifier
inFile.seekg(0, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&dwChunkId), sizeof(dwChunkId));
if(dwChunkId != 'FFIR')
{
inFile.close();
return _FAIL;
}
inFile.seekg(4, std::ios::beg); //get file size
inFile.read(reinterpret_cast<char*>(&dwFileSize), sizeof(dwFileSize));
if(dwFileSize <= 16)
{
inFile.close();
return _FAIL;
}
inFile.seekg(8, std::ios::beg); //get file format
inFile.read(reinterpret_cast<char*>(&dwExtra), sizeof(dwExtra));
if(dwExtra != 'EVAW')
{
inFile.close();
return _FAIL;
}
//look for 'fmt ' chunk id
bool bFilledFormat = false;
for(unsigned int i = 12; i < dwFileSize; )
{
inFile.seekg(i, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&dwChunkId), sizeof(dwChunkId));
inFile.seekg(i + 4, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&dwChunkSize), sizeof(dwChunkSize));
if(dwChunkId == ' tmf')
{
//I don't know what I was thinking with the following code, but I
//never did solve it back 6 months, and didn't touch it since; oh well... :S
//switch(dwChunkSize)
//{
//case sizeof(WAVEFORMATEX):
// {
// inFile.seekg(i + 8, std::ios::beg);
// inFile.read(reinterpret_cast<char*>(&m_wf), sizeof(m_wf));
// }
// break;
//case sizeof(WAVEFORMATEXTENSIBLE):
// {
// WAVEFORMATEXTENSIBLE wfe;
// inFile.seekg(i + 8, std::ios::beg);
// inFile.read(reinterpret_cast<char*>(&wfe), sizeof(wfe));
// m_wf = wfe.Format;
// }
// break;
//default:
// inFile.close();
// return;
//}
inFile.seekg(i + 8, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&m_wf), sizeof(m_wf));
bFilledFormat = true;
break;
}
dwChunkSize += 8; //add offsets of the chunk id, and chunk size data entries
dwChunkSize += 1;
dwChunkSize &= 0xfffffffe; //guarantees WORD padding alignment
i += dwChunkSize;
}
if(!bFilledFormat)
{
inFile.close();
return _FAIL;
}
//look for 'data' chunk id
bool bFilledData = false;
for(unsigned int i = 12; i < dwFileSize; )
{
inFile.seekg(i, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&dwChunkId), sizeof(dwChunkId));
inFile.seekg(i + 4, std::ios::beg);
inFile.read(reinterpret_cast<char*>(&dwChunkSize), sizeof(dwChunkSize));
if(dwChunkId == 'atad')
{
m_pWaveData = new BYTE[dwChunkSize];
inFile.seekg(i + 8, std::ios::beg);
inFile.read(reinterpret_cast<char*>(m_pWaveData), dwChunkSize);
m_xa.AudioBytes = dwChunkSize;
m_xa.pAudioData = m_pWaveData;
m_xa.PlayBegin = 0;
m_xa.PlayLength = 0;
bFilledData = true;
break;
}
dwChunkSize += 8; //add offsets of the chunk id, and chunk size data entries
dwChunkSize += 1;
dwChunkSize &= 0xfffffffe; //guarantees WORD padding alignment
i += dwChunkSize;
}
if(!bFilledData)
{
inFile.close();
return _FAIL;
}
inFile.close();
return hr;
}
/*----------------------------------------------------------------*/
Code: Alles auswählen
void DS::PlaySound(void){
//create the source voice, based on loaded wave format
if( FAILED( m_pEngine->CreateSourceVoice( &m_pSource, &m_wf ) ) )
{
m_pEngine->Release();
CoUninitialize();
}
//play the sound
m_pSource->SubmitSourceBuffer( &m_xa );
//start consuming audio in the source voice
m_pSource->Start();
}
/*----------------------------------------------------------------*/
Code: Alles auswählen
// create a sound object
g_pSound = new Sound(g_hInst);
// create an sound device object
if (FAILED( g_pSound->CreateDevice() )) return E_FAIL;
// get a pointer on that device
g_pSoundDevice = g_pSound->GetDevice();
if(g_pSoundDevice == NULL) return E_FAIL;
// init sound device
if (FAILED( g_pSoundDevice->Init(g_hWnd))) {
fprintf(pLog, "error: Init() failed in ProgramStartup()\n");
return E_FAIL;
}
hr = g_pSoundDevice->LoadSound("wav.wav", &uitest);
g_pSoundDevice->PlaySoundW();