[DSound] Problem beim Laden einer Wave-Datei :-(



  • Ich dachte man kann da wenig falsch machen mit den mmio-Funktionen aus der Windows-API. Falsch gedacht. Ich habe eine Funktion geschrieben die mir eine Wave-Datei in einen IDirectSoundBuffer8 kopieren soll.

    Mit dem Framework will ich allerdings auch nicht arbeiten, also habe ich mir folgende Funktion gebastelt:

    EDIT: Funktion gekürzt auf den Bereich in dem der Fehler auftretet:

    // Wave-Daten in den DirectSound-Buffer schreiben
    		/// DirectSound-Buffer verriegeln
    	BYTE* BufferStartAdress = 0;
    	if(DS_OK != (*DSoundBuffer)->Lock(0,WaveDataLength,reinterpret_cast<void**>(&BufferStartAdress),&WaveDataLength,0,0,0))
    	{
    		dxError(DXGLOBALS.Name,"Fehler beim Verriegeln eines DirectSound-Buffers.");
    		return(DX_FAILURE);
    	}
    
    		// Wave-Daten in den DirectSound-Buffer schreiben
    	memcpy(BufferStartAdress,WaveData,WaveDataLength);
    	delete[] WaveData;
    
    		// DirectSound-Buffer entriegeln
    	if(DS_OK != (*DSoundBuffer)->Unlock(BufferStartAdress,WaveDataLength,0,0))
    	{
    		dxError(DXGLOBALS.Name,"Fehler beim Entriegeln eines DirectSound-Buffers.");
    		return(DX_FAILURE);
    	}
    
    	return(DX_OKAY);
    }
    

    dxError macht im Prinzip nichts anderes als eine MessageBox anzuzeigen mit Caption = param1 und Text = param2.

    Leider bekomme ich allerdings keine Fehlermeldung angezeigt - trotzdem wird das Programm aufgerufen und sofort wieder beendet (keine Error-Anzeigen, nichts). Rufe ich diese Funktion allerdings nicht auf ist dies allerdings nicht der Fall => Problem muss hier liegen.

    Bloß wo? Habe ich irgendeinen Idiotenfehler gemacht? Irgendetwas vergessen?

    ---

    Ja ein ähnliches Posting findet sich auch auf zfx.info - da aber nicht alle Gurus von hier dort vertreten sind und ich dort keine Antwort bekomme habe ich es hier versucht. Hoffe hier kann mir jemand helfen, bin nämlich bereits sehr verzweifelt :(.

    MfG SideWinder



  • Wie wäre es, wenn du einfach mal den Debuger benutzt?

    Bye, TGGC



  • Wollte ich ja, allerdings (MSVC) ich starte den Debugvorgang und ich bekomme das Fenster zu sehen, danach den Sound für einen Fehler kann aber weder das Programm beenden noch irgendwie in meinem Programm weitergehen geschweige denn zum MSVC zurückwechseln. Nichts.

    MfG SideWinder



  • Kannst du kein Breakpoint vor dem Funktionsaufruf setzen? Ansonsten leg mal zwischendurch immer Dateien an, um die Stelle einzugrenzen, an der er aussteigt.

    Bye, TGGC



  • Schlecht aufgelegt?

    Breakpoints habe ich gesetzt -> ich kann aber nicht mit ALT+TAB zurück in den MSVC wechseln und das Programm hängt sich auf. Führe ich es ganz normal aus, hört es auf während dieser Funktion (führe ich sie nicht aus, ist das nämlich nicht der Fall).

    Das mit den Log-Dateien werde ich mal machen, vielleicht finde ich da genaueres.

    MfG SideWinder



  • Offenbar schafft er es nicht den Buffer zu verriegeln? Muss ich dafür ein bestimmtes Bufferformat angeben? Ich habe folgende Flags:

    DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC
    

    MfG SideWinder



  • Was gibt er den für einen Fehlercode bei der Methode *(DSoundBuffer)->Lock zurück?



  • Konnte ich nicht abrufen da das Programm abgestürzt ist. Problem behoben - habe meinen Fehler selbst gefunden

    Das Problem lag bei QueryInterface() und doch nicht hier.

    Ich habe auf einen Zeiger auf einen IDirectSoundBuffer8* statt ihn einfach in void** zu wandeln ein & davor geschrieben -> Tot ;).

    Dämlicher Fehler :(. Danke für eure Hilfe :).

    Eine Frage habe ich dann aber noch:

    Warum kann ich nicht gleich einen IDirectSoundBuffer8* erstellen sondern muss zuerst einen einfachen Buffer herstellen und ihn dann nach Version 8 konvertieren? 😕

    MfG SideWinder



  • Kann es an COM liegen? Direct3D kann man ja auch auf diesem Umweg initialisieren. Bei DirectSoundBuffer8 weiss ich noch es es nicht für Primärbuffer ist. Naja ich kenne mich mit DirectX besonders mit DirectSound nicht so gut aus.



  • Mit einem Direct3D9-Objekt kann ich auch direkt ein Direct3D9-Device erzuegen.
    Mit einem DirectInput8-Objekt bekomme ich auch direkt DirectInput8-Devices.

    Nur bei DirectSound kann ich selbst mit einem DirectSound8-Objekt nur einen DirectSoundBuffer1 erstellen den ich dann "mühsam" mit QueryInterface in die Version 8 bringen muss.

    MfG SideWinder



  • SideWinder schrieb:

    Mit einem Direct3D9-Objekt kann ich auch direkt ein Direct3D9-Device erzuegen.
    Mit einem DirectInput8-Objekt bekomme ich auch direkt DirectInput8-Devices.

    Nur bei DirectSound kann ich selbst mit einem DirectSound8-Objekt nur einen DirectSoundBuffer1 erstellen den ich dann "mühsam" mit QueryInterface in die Version 8 bringen muss.

    MfG SideWinder

    DirectX Graphics und Input haben diese CreateXXX-Wrapper-Funktionen die genau das machen...
    DirectX Audio nunmal nicht.


Anmelden zum Antworten