falsche wav-datei Ausgabe mit DirectSound



  • Hi,
    ich habe an Hand eines Buches versucht eine wav-datei mit DirectSound abzuspielen.
    Ich habe das Programm jetzt soweit, dass ich keine Compilerfehler mehr bekommen und das Programm auch starten kann. Das Problem ist , dass wenn ich meine wav-file abspiele, sie sich icht wie meine wav-file anhört, sondern sich wie ein durcheinander von falschen Frequenzen anhört(oder wie eine defekte sound-datei. Defekt ist die Datei aber nicht, da ich sie in z.B. Winamp problemlos abspielen kann).

    Ich vermute dass ich die wav-datei falsch öffne und in den Speicher lade. Allerdings weis ich nicht was ich anders machen muss, damit sich meine wav-datei normal anhört.

    Ich poste hier mal einen Ausschnitt aus meinem Quellcode:
    Headerdatei als Information :

    class Sound{
    private:
    	LPDIRECTSOUND sound;
    	LPDIRECTSOUNDBUFFER buffer[2];
    	DWORD length;
    	PBYTE waveData;
    	WAVEFORMATEX wfx;
    public:
    	WAVEFORMATEX setWaveFormat(void);
    	Sound();
    	BOOL init(HWND hwnd);
    	void end();
    	BOOL bufferErstellen(const char* fileName, LPDIRECTSOUNDBUFFER* buffe);
    	BOOL waveLaden(const char* fileName);
    	BOOL waveFormat(HMMIO hmmio);
    	BOOL waveDaten(HMMIO hmmio);
    	void soundSpielen(LPDIRECTSOUNDBUFFER buffer, int pan, int vol);
    	void schleife(LPDIRECTSOUNDBUFFER buffer, int pan, int vol, BOOL play);
    	LPDIRECTSOUNDBUFFER getBuffer();
    
    };
    

    code der ausschlaggebenden Funktionen:

    BOOL Sound::bufferErstellen(const char* fileName, LPDIRECTSOUNDBUFFER* buffe){
    
    	DSBUFFERDESC desc = {0};
    
    	BYTE *data;
    
    	memset(&desc, 0, sizeof(DSBUFFERDESC));
    	if(!waveLaden(fileName)){
    		printf("Fehler 4");
    		return false;
    	}
    
    	ZeroMemory(&desc, sizeof(desc));
    	desc.dwSize = sizeof(desc);
    	desc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
    	desc.dwBufferBytes = wfx.cbSize; 
    	desc.dwReserved = 0;
    	desc.lpwfxFormat = &wfx;
    
    	if(FAILED(sound->CreateSoundBuffer(&desc, buffe,NULL))){
    		printf("Fehler 1");
    		return false;
    	}
    
    	if(FAILED((*buffe)->Lock(0, desc.dwBufferBytes, (LPVOID*)&data, &length, NULL, NULL, DSBLOCK_ENTIREBUFFER))){
    		printf("Fehler 2");
    		return false;
    	}
    
    	memcpy(data, waveData, length);
    	free(waveData);
    
    	if(FAILED((*buffe)->Unlock(data,length,NULL,NULL))){
    		printf("Fehler 3");
    		return false;
    	}
    
    	return TRUE;
    }
    
    BOOL Sound::waveLaden(const char* fileName){
    
    	HMMIO hmmio;
    	hmmio = mmioOpenA((char*)((LPCTSTR)fileName), NULL, MMIO_READ);
    
    	if(!hmmio){
    		printf("Fehler bei WaveLaden");
    		return false;
    	}
    
    	if(!waveFormat(hmmio)){
    		printf("Fehler bei WaveFormat");
    		return false;
    	}
    
    	if(!waveDaten(hmmio)){
    		printf("Fehler bei WaveDaten");
    		return false;
    	}
    
    	mmioClose(hmmio,0);
    
    	return TRUE;
    }
    
    BOOL Sound::waveFormat(HMMIO hmmio){
    
    	MMCKINFO mmWave;
    	MMCKINFO mmFmt;
    	MMRESULT result;
    
    	ZeroMemory(&mmWave, sizeof(mmWave));
    	ZeroMemory(&mmFmt, sizeof(mmFmt));
    
    	result = mmioSeek(hmmio,0,SEEK_SET);
    	mmWave.fccType = mmioStringToFOURCCA("WAVE",0);
    	mmFmt.ckid = mmioStringToFOURCC("fmt",0);
    
    	result = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend1");
    		return false;
    	}
    
    	result= mmioDescend(hmmio, &mmFmt, &mmWave, MMIO_FINDCHUNK);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend2");
    		return false;
    	}
    
    	result = mmioRead(hmmio, (HPSTR)&wfx, sizeof(WAVEFORMATEX));
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioRead");
    		return false;
    	}
    
    	return TRUE;
    
    }
    
    BOOL Sound::waveDaten(HMMIO hmmio){
    
    	MMCKINFO mmWave;
    	MMCKINFO mmData;
    	MMRESULT result;
    
    	ZeroMemory(&mmWave, sizeof(mmWave));
    	ZeroMemory(&mmData, sizeof(mmData));
    
    	result = mmioSeek(hmmio,0,SEEK_SET);
    
    	mmWave.fccType = mmioStringToFOURCCA("WAVE",0);
    	mmData.ckid = mmioStringToFOURCCA("data",0);
    
    	result = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
    	if(FAILED(result)){
    		printf("Fehler bei WaveDatenDescend22");
    		return false;
    	}
    
    	length = mmData.cksize;
    	waveData = (PBYTE)malloc(length);
    	if(!waveData){
    		printf("Fehler bei laenge");
    		return false;
    	}
    
    	ZeroMemory(waveData,length);
    
    	result = mmioRead(hmmio, (HPSTR)waveData,length);
    	if(FAILED(result)){
    		printf("Fehler bei laenge2");
    		return false;
    	}
    
    	return TRUE;
    }
    

    Wie gesagt, buffer anlegen funktioniert soweit, ich kann auch was aus den Boxen hören, nur leider hört es sich nicht wie meine wav-datei an 🙂

    Vielleicht liegt das Problem auch in der größe meines Puffers:

    desc.dwBufferBytes = wfx.cbSize;
    

    Hat jemand eine Idee, wie man wav-Datein laden muss/kann, damit es sich normal anhört?
    Hatte vielleicht jemand schon mal ein aehnliches Problem 🙂
    Mir würde es auch helfen, wenn jemand wüsste warum meine wav-datei falsch abgespielt wird. Denn im moment weis ich leider nicht genau wo der Fehler liegt. Deshalb weis ich auch nicht an welcher Stelle ich nach einer Lösung suchen soll. Wenn jemand ne Idee hätte, wüsste ich wenigstens wo und wie ich weiter suchen muss 🙂

    Ich hab schon einige Informationen zu Problemen mit den Buffern gefunden, aber da mein Buffer zu laufen scheint, denke ich das das Problem wo anderst liegt, aber wo? 😃

    Ich habe auch paar andere Möglichkeiten gefunden wav-files zu laden, allerdings hatte ich dann immer compiler-fehler oder wusste nicht wie ich es in den restlichen code einzubauen habe.

    Da ich langsam verrückt werde, dachte ich, ich frag mal nach ob jemand vielleicht eine Idee hat.

    Ich danke euch 🙂



  • Alles klar, hat sich erledigt. danke an alle 🙂
    Im Buch stand

    ZeroMemory(waveData,sizeof(waveData));
    

    vor

    result = mmioRead(hmmio, (HPSTR)*waveData,*length);
    	if(FAILED(result)){
    		printf("Fehler");
    		return false;
    	}
    	return TRUE;
    

    Damit wurden die Informationen aus "waveData" gelöscht und ich habe falsche Werte bekommen.
    Yuhuu 🙂 4 Tage habe ich gebraucht bis ich die Scheisse zum laufen gebracht habe 🙂

    PS: Es gab auch einige andere Fehler, die ich mir aber selbst durch rumprobieren eingebaut habe 🙂

    Falls es jemanden interessiert, hier der Code wie es funktioniert:

    BOOL Sound::bufferErstellen(char* fileName, LPDIRECTSOUNDBUFFER* buffe){
    
    	DSBUFFERDESC desc = {0};
    	BYTE *data;
    	DWORD length;
    	WAVEFORMATEX wfx = setWaveFormat();
    	PBYTE waveData;
    
    	memset(&desc, 0, sizeof(DSBUFFERDESC));
    	if(!waveLaden(fileName, &wfx, &length, &waveData)){
    		printf(" waveLaden(fileName)-Fehler ");
    		return false;
    	}
    
    	ZeroMemory(&desc, sizeof(desc));
    	desc.dwSize = sizeof(desc);
    	desc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
    	desc.dwBufferBytes = length;
    	desc.dwReserved = 0;
    	desc.lpwfxFormat = &wfx;
    
    	if(FAILED(sound->CreateSoundBuffer(&desc, buffe,NULL))){
    		printf("Fehler 1");
    		return false;
    	}
    
    	if(FAILED((*buffe)->Lock(0, desc.dwBufferBytes, (LPVOID*)&data, &length, NULL, NULL, 0))){
    		printf("Fehler 2");
    		return false;
    	}
    
    	memcpy(data, waveData, length);
    	free(&waveData);
    
    	if(FAILED((*buffe)->Unlock(data,length,NULL,0))){
    		printf("Fehler 3");
    		return false;
    	}
    
    	return TRUE;
    }
    
    BOOL Sound::waveLaden(char* fileName, WAVEFORMATEX* wfx, DWORD* length, PBYTE* waveData){
    
    	HMMIO hmmio;
    	hmmio = mmioOpenA(fileName, NULL, MMIO_READ);
    
    	if(!hmmio){
    		printf("Fehler bei öffnen der Wav-Datei");
    		return false;
    	}
    	if(!waveFormat(hmmio,wfx)){
    		printf(" ASD ");
    		return false;
    	}
    	if(!waveDaten(hmmio,length,waveData)){
    		printf(" ASD2 ");
    		return false;
    	}
    
    	mmioClose(hmmio,0);
    
    	return TRUE;
    
    }
    
    BOOL Sound::waveFormat(HMMIO hmmio, WAVEFORMATEX *wfx){
    
    	MMCKINFO mmWave;
    	MMCKINFO mmFmt;
    	MMRESULT result;
    
    	ZeroMemory(&mmWave, sizeof(mmWave));
    	ZeroMemory(&mmFmt, sizeof(mmFmt));
    
    	result = mmioSeek(hmmio,0,SEEK_SET);
    
    	mmWave.fccType = mmioStringToFOURCC("WAVE",0);
    	mmFmt.ckid = mmioStringToFOURCC("fmt",0);
    
    	result = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend1");
    		return false;
    	}
    
    	result= mmioDescend(hmmio, &mmFmt, &mmWave, MMIO_FINDCHUNK);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend2");
    		return false;
    	}
    
    	result = mmioRead(hmmio,(HPSTR)wfx, sizeof(WAVEFORMATEX));
    	if(FAILED(result)){
    		printf(" Fehler bei Lesen der SoundData-Informationen ");
    		return false;
    	}
    
    	return TRUE;
    }
    
    BOOL Sound::waveDaten(HMMIO hmmio, DWORD* length, PBYTE* waveData){
    
    	MMCKINFO mmWave;
    	MMCKINFO mmData;
    	MMRESULT result;
    
    	ZeroMemory(&mmWave, sizeof(mmWave));
    	ZeroMemory(&mmData, sizeof(mmData));
    
    	result = mmioSeek(hmmio,0,SEEK_SET);
    
    	mmWave.fccType = mmioStringToFOURCC("WAVE",0);
    	mmData.ckid = mmioStringToFOURCC("data",0);
    
    	result = mmioDescend(hmmio, &mmWave, NULL, MMIO_FINDRIFF);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend1");
    		return false;
    	}
    
    	result= mmioDescend(hmmio, &mmData, &mmWave, MMIO_FINDCHUNK);
    	if(FAILED(result)){
    		printf("Fehler bei WaveFormatmmioDescend2");
    		return false;
    	}
    
    	*length = mmData.cksize;
    	*waveData = (PBYTE)malloc(*length);
    	if(!*waveData){
    		printf("Fehler bei laenge");
    		return false;
    	}
    
    	//ZeroMemory(waveData,sizeof(waveData));
    
    	result = mmioRead(hmmio, (HPSTR)*waveData,*length);
    	if(FAILED(result)){
    		printf("Fehler bei laenge2");
    		return false;
    	}
    	return TRUE;
    }
    


  • Wenn du wirklich einfach Audio abspielen willst, dann greif dir fmod!

    Einfach zu benutzen und Support ist einsame Klasse. Ich habe einen Bug gemeldet, ne .flac Datei mitgeschickt und Ende der Woche war ein neue Version draussen, die das behoben hat..


Anmelden zum Antworten