P
Hallo erstmal,
ich hab da mal ne frage ich hab jetzt angefangen mich in direct sound einzuarbeite und ma n kleines script geschrieben. Geht auch alles gut compiliert und so aber wenn ich dann die funktion CreateSoundBuffer() aufrufe um mir einen secondary buffer zu erstellen kommt meine fehlermeldung das dat net geklappt hat. woran könnte das liegen?
Hier der code:
//Datei: DirectSound.h
#include <dsound.h>
#define SND0 0
//---------------------------
#define ANZ_SOUNDS_GESAMT 1
bool xxxDSound_Initialisieren(HWND hwnd);
void xxxDSound_Beenden(void);
bool xxxDSound_Buffer_erzeugen(const char* filename,
LPDIRECTSOUNDBUFFER* lpDSB);
bool xxxDSound_Wave_laden(const char* filename, WAVEFORMATEX* wf,
DWORD* pdwLaenge, PBYTE* ppbyWDat);
bool xxxDSound_Wave_Format(HMMIO hmmio, WAVEFORMATEX* wf);
bool xxxDSound_Wave_Daten(HMMIO hmmio, DWORD* pdwLaenge, PBYTE* ppbyWDat);
bool xxxDSound_Spielen(LPDIRECTSOUNDBUFFER lpDSB, int pan, int vol);
bool xxxDSound_Schleife(LPDIRECTSOUNDBUFFER lpDSB, int pan, int vol, bool play);
// =============================================================================
//Datei: DirectSound.cpp
#include <stdio.h>
#include <windows.h>
#include <mmsystem.h>
#include "DirectSound.h"
#include "xxxGlobal.h"
LPDIRECTSOUND lpDS;
LPDIRECTSOUNDBUFFER lpDSB[ANZ_SOUNDS_GESAMT];
extern HWND hwnd;
bool xxxDSound_Initialisieren(HWND hwnd)
{
HRESULT dsrval;
char buffer[12];
dsrval = DirectSoundCreate(NULL, &lpDS, NULL);
if(FAILED(dsrval))
{
MSG(hwnd ,"DSound ERROR: DirectSoundCreate()");
xxxDSound_Beenden();
return false;
}
dsrval = lpDS->SetCooperativeLevel(hwnd, DSSCL_NORMAL);
if(FAILED(dsrval))
{
MSG(hwnd ,"DSound ERROR: SetCooperativeLevel()");
xxxDSound_Beenden();
return false;
}
for(int i = 0; i < ANZ_SOUNDS_GESAMT; i++)
{
sprintf(buffer, "sound%d.wav",i);
xxxDSound_Buffer_erzeugen(buffer, &lpDSB[i]);
if(lpDSB[i] == NULL)
return false;
}
return true;
}
void xxxDSound_Beenden(void)
{
if(lpDS != NULL)
lpDS->Release();
for(int i = 0; i < ANZ_SOUNDS_GESAMT; i++)
{
if(lpDSB[i] != NULL)
lpDSB[i]->Release();
}
}
bool xxxDSound_Buffer_erzeugen(const char* pfilename,LPDIRECTSOUNDBUFFER* lpDSB)
{
DSBUFFERDESC dsbd;
BYTE *pDSBuffData;
WAVEFORMATEX waveFormat;
DWORD dwDataLength;
PBYTE pbyWaveDaten;
HRESULT dsrval;
pbyWaveDaten = NULL;
if(!xxxDSound_Wave_laden(pfilename, &waveFormat, &dwDataLength,
&pbyWaveDaten))
{
MSG(hwnd ,"DSound ERROR: xxxDSound_Wave_laden()");
return false;
}
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |
DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC;
dsbd.dwBufferBytes = dwDataLength;
dsbd.lpwfxFormat = &waveFormat;
dsrval = lpDS->CreateSoundBuffer(&dsbd, &(*lpDSB), NULL);
if(FAILED(dsrval))
{
MSG(hwnd ,"DSound ERROR: DirectSoundCreate()");
return false;
}
dsrval = (*lpDSB)->Lock(0, dwDataLength, (LPVOID*) &pDSBuffData, &dwDataLength, NULL, 0, 0);
if(FAILED(dsrval))
{
MSG(hwnd ,"DSound ERROR: Lock()");
return false;
}
memcpy(pDSBuffData,pbyWaveDaten,dwDataLength);
free(pbyWaveDaten);
dsrval = (*lpDSB)->Unlock(pDSBuffData, dwDataLength, NULL, 0);
if(FAILED(dsrval))
{
MSG(hwnd ,"DSound ERROR: Unlock()");
return false;
}
return true;
}
bool xxxDSound_Wave_laden(const char* filename, WAVEFORMATEX* wf, DWORD* pdwLaenge, PBYTE* ppbyWDat)
{
HMMIO hmmio;
hmmio = mmioOpen((char*)((LPCTSTR)filename),NULL,MMIO_READ);
if(!hmmio)
{
MSG(hwnd ,"DSound ERROR: mmioOpen()");
return false;
}
if(!xxxDSound_Wave_Format(hmmio, wf))
{
MSG(hwnd ,"DSound ERROR: xxxDSound_Wave_Format()");
return false;
}
if(!xxxDSound_Wave_Daten(hmmio, pdwLaenge, ppbyWDat))
{
MSG(hwnd ,"DSound ERROR: xxxDSound_Wave_Daten()");
return false;
}
mmioClose(hmmio,0);
return true;
}
bool xxxDSound_Wave_Format(HMMIO hmmio, WAVEFORMATEX* wf)
{
MMCKINFO mmWave;
MMCKINFO mmFmt;
MMRESULT mmResult;
ZeroMemory(&mmWave, sizeof(mmWave));
ZeroMemory(&mmFmt, sizeof(mmFmt));
mmResult = mmioSeek(hmmio, 0, SEEK_SET);
mmWave.fccType = mmioStringToFOURCC("WAVE",0);
mmFmt.ckid = mmioStringToFOURCC("fmt",0);
mmResult = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend()");
return false;
}
mmResult = mmioDescend(hmmio, &mmFmt, &mmWave, MMIO_FINDRIFF);
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend() RIFF");
return false;
}
mmResult = mmioRead(hmmio, (HPSTR) wf, sizeof(WAVEFORMATEX));
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend() WAVEFORMATEX");
return false;
}
return true;
}
bool xxxDSound_Wave_Daten(HMMIO hmmio, DWORD* pdwLaenge, PBYTE* ppbyWDat)
{
MMCKINFO mmWave;
MMCKINFO mmData;
MMRESULT mmResult;
ZeroMemory(&mmWave, sizeof(mmWave));
ZeroMemory(&mmData, sizeof(mmData));
mmResult = mmioSeek(hmmio, 0, SEEK_SET);
mmWave.fccType = mmioStringToFOURCC("WAVE", 0);
mmData.ckid = mmioStringToFOURCC("data", 0);
mmResult = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend()");
return false;
}
mmResult = mmioDescend(hmmio, &mmData, &mmWave, MMIO_FINDRIFF);
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend() RIFF");
return false;
}
*pdwLaenge = mmData.cksize;
*ppbyWDat = (PBYTE)malloc(*pdwLaenge);
if(!*ppbyWDat)
{
MSG(hwnd ,"DSound ERROR: malloc() RIFF");
return false;
}
ZeroMemory(*ppbyWDat, *pdwLaenge);
mmResult = mmioRead(hmmio, (HPSTR) *ppbyWDat, *pdwLaenge);
if(FAILED(mmResult))
{
MSG(hwnd ,"DSound ERROR: mmioDescend() WAVEFORMATEX");
return false;
}
return true;
}
bool xxxDSound_Spielen(LPDIRECTSOUNDBUFFER lpDSB, int pan, int vol)
{
if(lpDSB)
{
lpDSB->SetPan(pan);
lpDSB->SetVolume(vol);
lpDSB->Play(0,0,0);
}
}
bool xxxDSound_Schleife(LPDIRECTSOUNDBUFFER lpDSB, int pan, int vol, bool play)
{
DWORD ret;
lpDSB->GetStatus(&ret);
if((lpDSB) && (play))
{
lpDSB->SetPan(pan);
lpDSB->SetVolume(vol);
lpDSB->Play(0,0,DSBPLAY_LOOPING);
}
else if (lpDSB)
lpDSB->Stop();
}
Wenn mir da einer helfen könnte wäre ich da sehr dankbar drüber.