JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=d3ff52df8db286c119e01e4768e592cfMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

ein paar frage...
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 04.06.2008, 14:18    Titel: ein paar frage... Antworten mit Zitat

Hallo,

ich hab mal wieder ein paar Fragen:

1. Ich hab mir zwei Funktionen geschrieben um Sounds zu laden und abzuspielen. Ich hab alles so gemacht wie es im Buch steht.
CPP:
BOOL CDirectX::PlaySound(char* FILE_NAME, int loops)
{
        int error = 0;

        if(loops == 0) SoundFiles[FILE_NAME]->SetRepeats(DMUS_SEG_REPEAT_INFINITE);
        else SoundFiles[FILE_NAME]->SetRepeats(loops);

        lpPerformance->PlaySegmentEx(
                                        SoundFiles[FILE_NAME],
                                        NULL,
                                        NULL,
                                        DMUS_SEGF_SECONDARY,
                                        0,
                                        NULL,
                                        NULL,
                                        NULL
                                    );


        if(error != 0)
        {
            //SetError(error);
            return FALSE;
        }

        return TRUE;
}


Wie kann ich den Sound jetzt wieder stoppen?


2. Frage:

Ich kann anhand des Rückgabewerts der Present-Funktion feststellen, ob das Direct3D Device verloren gegangen ist. Ich versuche ich es mit lpD3DDevice::Reset wieder zu resetten, das Funktioniert aber nicht, ich bekomme einen Laufzeitfehler.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 35
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 04.06.2008, 16:58    Titel: Re: ein paar frage... Antworten mit Zitat

newby hat Folgendes geschrieben:

2. Frage:

Ich kann anhand des Rückgabewerts der Present-Funktion feststellen, ob das Direct3D Device verloren gegangen ist. Ich versuche ich es mit lpD3DDevice::Reset wieder zu resetten, das Funktioniert aber nicht, ich bekomme einen Laufzeitfehler.


Da musst du schauen was genau mit dem device passiert ist bzw. in welchem Zustand es sich befindet und ob es gegebenenfalls möglich ist, es zu reseten. Das geht nämlich nicht immer. Steht aber auch so in der msdn bei der reset methode dabei.
Wenn du genau wissen willst, wie es deinem device gerade geht, dann empfiehlt es sich mal TestCooperativeLevel(...) auszuprobieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Deviloper
Junior JLI'ler



Anmeldedatum: 31.05.2006
Beiträge: 77

Medaillen: Keine

BeitragVerfasst am: 05.06.2008, 13:06    Titel: Antworten mit Zitat

Dein Code da oben ist nicht sinnvoll. Stell mal Warnungsstufe 4 ein und guck dann was der Compiler meldet.

CPP:
const bool CDirectX::PlaySound(const char* file_name, const unsigned int loops)
{
    SoundFiles[file_name]->SetRepeats(!loops ? DMUS_SEG_REPEAT_INFINITE : loops);
    return !FAILED(lpPerformance->PlaySegmentEx(SoundFiles[file_name], NULL, NULL, DMUS_SEGF_SECONDARY, 0, NULL, NULL, NULL);
}


Stoppen per:
CPP:
void CDirectX::StopSound(const char* file_name)
{
    lpPerformance->StopEx(SoundFiles[file_name], 0, 0);
}
...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 11.06.2008, 19:20    Titel: Antworten mit Zitat

komisch:

CPP:
result = lpD3DDevice->Present(0, 0, 0, 0);

        if(result == D3DERR_DEVICELOST)
        {
            result = lpD3DDevice->TestCooperativeLevel();
            if(result == D3DERR_DEVICELOST) return false;
            else if(result == D3DERR_DEVICENOTRESET)
            {
                result = lpD3DDevice->Reset(&Params);
                if(result == D3D_OK) MessageBox(0, "gut", "test", MB_OK); return true;
                if(result == D3DERR_DEVICELOST) MessageBox(0, "gut1", "test", MB_OK); return true;
                if(result == D3DERR_DRIVERINTERNALERROR) MessageBox(0, "gut2", "test", MB_OK); return true;
                if(result == D3DERR_INVALIDCALL) MessageBox(0, "gut3", "test", MB_OK); return true;
                if(result == D3DERR_OUTOFVIDEOMEMORY) MessageBox(0, "gut4", "test", MB_OK); return true;
                if(result == E_OUTOFMEMORY) MessageBox(0, "gut5", "test", MB_OK); return true;
                MessageBox(0, "gut6", "test", MB_OK);


            }
            //else Error.Set();
        }



der aufruf von reset() verursacht einen laufzeitfehler, aber wenn ich das auskommentiere wird die untere MessageBox nicht angezeigt ? Confused

warum bekomme ich einen laufzeitfehler, wäre der parameter falsch würde die methode das invalid_call zurückgeben und den Device kann man auch resetten, überprüfe ich ja vorher.


den sound stoppen funktioniert super, vielen dank.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 11.06.2008, 20:11    Titel: Antworten mit Zitat

Der Zeiger könnte ungültig sein.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 12.06.2008, 18:57    Titel: Antworten mit Zitat

newby hat Folgendes geschrieben:
wenn ich das auskommentiere wird die untere MessageBox nicht angezeigt ? Confused
Das liegt daran dass du jede if-abfrage mit einem ; abschließt, der geht also beim ersten return true zurück. Zu dem anderen problem glaub ich auch, dass das mit Params zu tun hat oder dass da iwas nicht stimmt drinne.

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 12.06.2008, 19:52    Titel: Antworten mit Zitat

du hast recht, wenn ich die return wegmache, bekomme ich den fehler invalid_call, das Parameter ist also falsch.

Meine D3DPRESENT_PARAMETERS sehen so aus:

CPP:
Params.SwapEffect          = D3DSWAPEFFECT_DISCARD;
        Params.hDeviceWindow       = hWnd;
        Params.Windowed            = Fullscreen;
        Params.BackBufferWidth     = Options.GetInt("GENERAL", "width");
        Params.BackBufferHeight    = Options.GetInt("GENERAL", "height");
        Params.BackBufferFormat    = D3DFMT_A8R8G8B8;


fullscreen = true, width = 1280 und height = 1024

die sind genauso wie bei der initialisierung am anfang.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 12.06.2008, 20:23    Titel: Antworten mit Zitat

Hast du alle DX Resourcen freigegeben (bis auf die managed Resourcen)?

Wenn ja dann benutze mal die DX Debug runtime Library (Suchfunktion), diese sollte dir mehr informationen geben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 13.06.2008, 13:12    Titel: Antworten mit Zitat

das hier sind meine resourcen, welche muss ich davon releasen?

CPP:
LPDIRECT3D9                 lpD3D;
    LPDIRECT3DDEVICE9           lpD3DDevice;
    LPD3DXFONT                  lpD3DFont;
    LPDIRECT3DSURFACE9          lpBackBuffer;
    LPDIRECT3DSURFACE9          lpSurface;
    IDirectMusicPerformance8*   lpPerformance;
    IDirectMusicLoader8*        lpLoader;
    LPD3DXSPRITE                lpSprite;
    LPDIRECTINPUT8              lpDI;
    LPDIRECTINPUTDEVICE8        lpDIKeyboard;

    bool bKeyboard[256];
    bool bKeyboard_old[256];
    POINT MousePos;
    HRESULT result;
    HINSTANCE hInst;
    HWND hWnd;
    map<string, D3DCOLOR> FontColor;
    map<string, LPD3DXFONT> Fonts;
    map<string, IDirectMusicSegment8*> SoundFiles;
    map<string, LPDIRECT3DTEXTURE9> TextureFiles;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 13.06.2008, 15:15    Titel: Antworten mit Zitat

ich gehe hier davon aus das du das D3DDevice Reseten möchtest, wie es bei Input sowie Music/Sound aussieht kann ich nicht sagen da ich diese teile nie verwende.

Rot: Resource freigeben
Grün: Objekt nicht freigeben
Blau: Hängt von der Resource ab (hast du es von einer datei geladen sollte freigeben nicht nötig sein)

Zitat:
LPDIRECT3D9 lpD3D;
LPDIRECT3DDEVICE9 lpD3DDevice;

LPD3DXFONT lpD3DFont;
LPDIRECT3DSURFACE9 lpBackBuffer;
LPDIRECT3DSURFACE9 lpSurface;

IDirectMusicPerformance8* lpPerformance;
IDirectMusicLoader8* lpLoader;

LPD3DXSPRITE lpSprite;
LPDIRECTINPUT8 lpDI;
LPDIRECTINPUTDEVICE8 lpDIKeyboard;


bool bKeyboard[256];
bool bKeyboard_old[256];
POINT MousePos;
HRESULT result;
HINSTANCE hInst;
HWND hWnd;
map<string, D3DCOLOR> FontColor;

map<string, LPD3DXFONT> Fonts;
map<string, IDirectMusicSegment8*> SoundFiles;
map<string, LPDIRECT3DTEXTURE9> TextureFiles;


D3DX Objekte muss man übrigens nicht freigeben hier reicht es aus einfach OnDeviceLost vor dem Reset aufzurufen und danach OnDeviceReset aufzurufen (kann sein das die Methoden anders lauten).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 13.06.2008, 17:48    Titel: Antworten mit Zitat

wenn irgendwas hiervon nicht auskommentiere bekomme ich sofort einen laufzeitfehler:

CPP:
//lpD3DFont->Release();

                /*map<string, LPD3DXFONT>::iterator it;
                for(it=Fonts.begin();it!=Fonts.end();it++)
                {
                    (*it).Release();
                }*/


                //lpSurface->Release();
                //lpBackBuffer->Release();
                //lpSprite->Release();

                //result = lpD3DDevice->Reset(&Params);
                if(result == D3D_OK) MessageBox(0, "Well", "Well", MB_OK);
                if(result == D3DERR_DEVICELOST) MessageBox(0, "gut1", "Error 1", MB_OK);
                if(result == D3DERR_DRIVERINTERNALERROR) MessageBox(0, "gut2", "Error 2", MB_OK);
                if(result == D3DERR_INVALIDCALL) MessageBox(0, "gut3", "Error 3", MB_OK);
                if(result == D3DERR_OUTOFVIDEOMEMORY) MessageBox(0, "gut4", "Error 4", MB_OK);
                if(result == E_OUTOFMEMORY) MessageBox(0, "gut5", "Error 5", MB_OK);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 36
Anmeldedatum: 17.02.2003
Beiträge: 3431
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.06.2008, 17:32    Titel: Antworten mit Zitat

Könnte allerhöchstwahrscheinlich an ungültigen Pointern liegen. Du solltest das überprüfen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 15.06.2008, 19:28    Titel: Antworten mit Zitat

Hast du überhaupt probiert herauszufinden was da schief läuft? Wenn nein dann tu das, wenn doch tu es nochmal aber ordentlich.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
newby
JLI'ler



Anmeldedatum: 17.08.2007
Beiträge: 106

Medaillen: Keine

BeitragVerfasst am: 30.06.2008, 16:07    Titel: Antworten mit Zitat

neue frage:

wie kann ich die lautstärkte der sounds einstellen, hab bei msdn nichts vernünfiges gefunden (oder bin zu dumm zum suchen)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 01.07.2008, 15:06    Titel: Antworten mit Zitat

http://www.jliforum.de/board/viewtopic.php?t=3699&highlight=setvolume

Nächstes Mal bitte die Forumsuche bemühen. Das war nun wirklich nicht schwer zu finden Wink
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum