[Gelöst] Windows: "Programm funktioniert nicht mehr"



  • Liebe C-plusplus Community,

    Ich hoffe, dass das hier das richtige Forum für diesen Beitrag ist.

    Ich versuche derzeit die Irrklang API (http://www.ambiera.com/irrklang/) in ein WinAPI Programm einzubauen. Lässt sich auch problemlos kompilieren, beim Ausführen tritt aber ein Fehler auf.

    Um mit Irrklang Titel abspielen zu können, hab ich zwei ISound-Pointer definiert:

    irrklang::ISound* TitelFront; // Titel, der gerade gespielt wird.
    irrklang::ISound* TitelBack; // Titel, der gerade geladen wird.
    bool TitelBackBufferEmpty = true;
    

    Am Anfang wird ein Titel geladen und sofort abgespielt. Kurz bevor er zu Ende ist, wird der nächste Titel geladen, der dann abgespielt wird, wenn der Erste fertig gespielt ist:

    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch(message)
        {
            case WM_CREATE:
                IrrKlangEngine = irrklang::createIrrKlangDevice();
                if (!IrrKlangEngine) {
                    MessageBox (hWnd, "Irrklang Engine konnte nicht geladen werden.", "No Irrklang Engine", MB_OK | MB_ICONERROR);
                }
                TitelFront = IrrKlangEngine->play2D("young.mp3", false, false, true);
                SetTimer(hWnd, 36, 40, NULL);
            break;
            case WM_TIMER:
                switch(wParam){
                    case 36:
                        if (TitelBackBufferEmpty && (TitelFront->getPlayLength() - TitelFront->getPlayPosition() < 10000.0f || TitelFront->isFinished())) {
                            TitelBack = IrrKlangEngine->play2D("valse.wav", false, true, true);
                            TitelBackBufferEmpty = false;
                        }
                        if (!TitelBackBufferEmpty && TitelFront->isFinished()) {
                            TitelFront->drop();
                            TitelFront = TitelBack;
                            TitelBack->drop();
                            TitelBackBufferEmpty = true;
                            TitelFront->setIsPaused(false);
                        }
                }
            break;
    

    ... zumindest theoretisch.

    Am Anfang läuft auch alles wunderbar: der MP3-Titel wird abgespielt, danach wird der WAV-Titel einmal abgespielt und dann tritt der Fehler auf:
    Nach dem ersten Abspielen der WAV-Datei sollte diese nochmals abgespielt werden. Man hört gerade noch den ersten Ton, dann bricht Windows ab und erklärt, dass das Programm nicht mehr funktioniert.

    Natürlich könnte ich die WAV-Datei auch loopen, wenn ich sie mehrmals abspielen wollte, aber trotzdem verstehe ich nicht, wieso es ein Problem bereitet, die selbe Datei noch einmal zu laden.

    Weiß jemand was ich falsch gemacht habe?

    Vielen Dank für Eure Antworten!

    LG
    Michi


  • Mod

    Debuggen... der Debugger bleibt auf Deinem fehlerhaten Statement stehen.



  • Ok, Lösung gefunden:

    Ab Zeile 20:

    if (!TitelBackBufferEmpty && TitelFront->isFinished()) {
                            TitelFront->drop();
                            TitelFront = TitelBack;
                            TitelBack->drop();
                            TitelBackBufferEmpty = true;
                            TitelFront->setIsPaused(false);
                        }
    

    Darf der Zeiger "TitelBack" nicht "drop()" aufrufen, weil er da auf den selben Titel zeigt wie "TitelFront". Stattdessen muss man ihn auf NULL setzen:

    TitelFront = TitelBack;
                            TitelBack = NULL;
    

Anmelden zum Antworten