M
Hi an alle,
ich habe folgendes Problem.
Ich habe Wave Dateien als Ressourcen gespeichert und diese möchte ich abspielen.
So wie ich es momentan habe funktioniert es unter XP super allerdings stottert die Ausgabe unter Vista.
Hier mal der Code wie ich den Sound abspiele.
bool CWaveOut::Open()
{
if(waveOutOpen(&m_hWaveOut, WAVE_MAPPER, m_wfx, (DWORD)waveOutProc, NULL, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
return false;
return true;
}
bool CWaveOut::PrepareWaveHdr()
{
DWORD* pRes = (DWORD*)m_lpRes;
DWORD dwRiff = *pRes++;
DWORD dwLength = *pRes++;
DWORD dwType = *pRes++;
if(dwRiff != mmioFOURCC('R', 'I', 'F', 'F'))
return false;
if(dwType != mmioFOURCC('W', 'A', 'V', 'E'))
return false;
DWORD * pResEnd = (DWORD *)((BYTE *)pRes + dwLength-4);
while( pRes < pResEnd )
{
dwType = *pRes++;
dwLength = *pRes++;
switch(dwType)
{
case mmioFOURCC('f', 'm', 't', ' '):
if( !m_wfx )
{
if( dwLength < sizeof(WAVEFORMAT) )
return false;
m_wfx = (WAVEFORMATEX *)pRes;
/*if( m_wfx )
return true;*/
}
break;
case mmioFOURCC('d', 'a', 't', 'a'):
m_lpvData = (LPVOID)pRes;
m_dwWaveSize = dwLength;
if(m_wfx)
return true;
break;
}
}
return true;
}
bool CWaveOut::Play(DWORD dwStart, DWORD dwEnd)
{
if(IsPlaying())
{
Stop();
return false;
}
//Load();
m_dwStart = (dwStart == -1) ? 0 : dwStart * m_wfx->nBlockAlign;
m_dwEnd = (dwEnd == -1) ? m_wfx->nSamplesPerSec * m_wfx->nBlockAlign : __min((m_wfx->nSamplesPerSec * m_wfx->nBlockAlign), dwEnd) * m_wfx->nBlockAlign;
m_nWaveHdrIndex = 2;
for(int i = 0; i < 3; i++)
{
if(!AddNewHdr(m_hWaveOut))
return false;
}
return true;
}
bool CWaveOut::AddNewHdr(HWAVEOUT hWaveOut)
{
MMRESULT mmr;
m_nWaveHdrIndex = (m_nWaveHdrIndex == 2) ? 0 : m_nWaveHdrIndex + 1;
m_whdr[m_nWaveHdrIndex].lpData = (LPSTR)m_lpvData + m_dwStart;
m_whdr[m_nWaveHdrIndex].dwBufferLength = GetBufferLength();
m_whdr[m_nWaveHdrIndex].dwFlags = 0;
m_whdr[m_nWaveHdrIndex].dwUser = (DWORD)(void*)this;
if((mmr = waveOutPrepareHeader(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
return false;
if((mmr = waveOutWrite(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR))) != MMSYSERR_NOERROR)
{
waveOutUnprepareHeader(hWaveOut, &m_whdr[m_nWaveHdrIndex], sizeof(WAVEHDR));
m_whdr[m_nWaveHdrIndex].lpData = NULL;
m_whdr[m_nWaveHdrIndex].dwBufferLength = 0;
m_whdr[m_nWaveHdrIndex].dwFlags = 0;
m_whdr[m_nWaveHdrIndex].dwUser = NULL;
m_nWaveHdrIndex--;
return false;
}
m_dwStart += GetBufferLength();
return true;
}
Warum läuft das so unter XP unter Vista aber nicht?
Wird die Windows media Lib unter Vista anders behandelt als unter XP?
Gruß