Hintergrundmusik



  • Heho 😉

    Ich habe Hintergrundmusik am laufen, bzw. sie schaltet sich ein, sobald der User n Kästchen anklickt und sollte sich ausschalten, sobald der Benutzer wieder auf das Kästchen klickt, also den Haken entfernt.

    private: System::Void checkBox1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    				ISoundEngine* soundEngine = createIrrKlangDevice();
    
    				if(checkBox1->Checked::get()) {
    					spieleHintergrundMusik(soundEngine);
    					TestBox->Text = "Musik an";
    				}
    				if(!checkBox1->Checked::get()) {
    					stoppeHintergrundMusik(soundEngine);
    					TestBox->Text = "Musik aus";
    				}
    
    		 }
    

    die beiden Funktion spiele- und stoppeHintergrundMusik sehen wiefolgt aus:

    void spieleHintergrundMusik(ISoundEngine* soundEngine) {
    
    	if(!soundEngine) {
    		return;
    	}
    
    	string sSoundFile = "La Musica Notturna (Passa Calle).mp3";
    
    	if(!soundEngine->isCurrentlyPlaying(sSoundFile.c_str())) {
    		soundEngine->play2D(sSoundFile.c_str(), true);
    	}
    
    }
    
    void stoppeHintergrundMusik(ISoundEngine* soundEngine) {
    
    	soundEngine->drop();
    
    }
    

    allerdings beendet das Programm nicht die Musik, sobald ich den Haken des Kästchens entferne - weiß jemand warum?



  • was mir zuerst auffällt, warum checkst du in "stoppeHintergrundMusik()" nicht ob du einen NULL-pointer erhalten hast?
    sticht mir zumindest als erstes ins auge.
    und wäre es nicht klüger den block

    if(!checkBox1->Checked::get()) {
                        stoppeHintergrundMusik(soundEngine);
                        TestBox->Text = "Musik aus";
                    }
    

    als else if zu schreiben? letztendlich kann eh nur eins von beiden zutreffen.
    ansonsten, bist du mal durchgesteppt? kommt deine programm überhaupt in die "stoppeHintergrundMusik()"-funktion?
    versuchs ansonsten mal mit StopAllSounds



  • Ob if if oder else if ist für meine Frage ziemlich irrelevant, da es nur um schöneres coden geht - aber ich habs trotzdem geändert 😉

    void stoppeHintergrundMusik(ISoundEngine* soundEngine) {
    
    	if(!soundEngine) {
    		return;
    	} else {
    		soundEngine->drop();
    	}
    }
    

    Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:

    void spieleHintergrundMusik(ISoundEngine* soundEngine) {
    
    	if(!soundEngine) {
    		return;
    	}
    
    	string sSoundFile = "La Musica Notturna (Passa Calle).mp3";
    
    	if(!soundEngine->isCurrentlyPlaying(sSoundFile.c_str())) { // hier Fehler vermutet
    		soundEngine->play2D(sSoundFile.c_str(), true); // oder hier :P
    	}
    
    }
    

    Ich probier selber nochmal aus, falls das aber jemandem ins Auge sticht, wo da der Fehler ist, darf er sich gerne melden^^ 😉



  • Ich arbeite auch mit Irrklang, und ich muss sagen, mach einfach eine globale Zeigervariable. ala

    Header:

    #ifndef SOUNDENGINE_HXX_INCLUDED
    #define SOUNDENGINE_HXX_INCLUDED
    
    #include "irrKlang.h"
    
    namespace Sound
    {
            extern irrklang::ISoundEngine* soundEngine;
    
            extern irrklang::ISoundSource *NoWinnerSound;//Beispielsound aus meinem Projekt
    
    //FUNKTIONEN ZUM ARBEITEN
    //...
    }
    
    namespace UnUsed
    {
            struct StartEnd
            {
                    StartEnd();
    
                    ~StartEnd()
                    {
                            Sound::soundEngine->drop();
                    }
            } extern S;
    }
    
    #endif // SOUNDENGINE_HXX_INCLUDED
    

    Source:

    #include "SoundEngine.hxx"
    
    UnUsed::StartEnd S;
    
    irrklang::ISoundEngine* Sound::soundEngine(nullptr);
    irrklang::ISoundSource* Sound::NoWinnerSound(nullptr);
    
    UnUsed::StartEnd::StartEnd()
    {
        Sound::soundEngine = irrklang::createIrrKlangDevice();
    
        Sound::NoWinnerSound = soundEngine->addSoundSourceFromFile("NoWinnerSound.ogg", irrklang::ESM_AUTO_DETECT, true);
    }
    

    So mach ich es immer.



  • Zel2491 schrieb:

    Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:

    Also wenn die Funktion stoppeHintergrundMusik() gar nicht erreicht wird, liegts ja vielleicht eher an

    if(!checkBox1->Checked::get()) {...}
    

    Was gibt get() an der Stelle zurück?



  • Zel2491 schrieb:

    Ob if if oder else if ist für meine Frage ziemlich irrelevant, da es nur um schöneres coden geht - aber ich habs trotzdem geändert 😉

    void stoppeHintergrundMusik(ISoundEngine* soundEngine) {
    
    	if(!soundEngine) {
    		return;
    	} else {
    		soundEngine->drop();
    	}
    }
    

    ich meinte auch eher

    private: System::Void checkBox1_Click(System::Object^  sender, System::EventArgs^  e) {
    
                    ISoundEngine* soundEngine = createIrrKlangDevice();
    
                    if(checkBox1->Checked::get()) {
                        spieleHintergrundMusik(soundEngine);
                        TestBox->Text = "Musik an";
                    }
                    else {
                        stoppeHintergrundMusik(soundEngine);
                        TestBox->Text = "Musik aus";
                    }
    
             }
    

    denn wenn nicht checked ist, gibt es ja nur noch eine möglichkeit.
    könnte dein problem vll auch beheben.



  • iop schrieb:

    Zel2491 schrieb:

    Allerdings kommt er nicht in die stoppeHintergrundMusik-Funktion, ich weiß allerdings nicht genau warum^^ Ich mein, das Problem kann man ja auf die spieleHintergrundMusik-Funktion eingrenzen:

    Also wenn die Funktion stoppeHintergrundMusik() gar nicht erreicht wird, liegts ja vielleicht eher an

    if(!checkBox1->Checked::get()) {...}
    

    Was gibt get() an der Stelle zurück?

    Dafür hab ich da ja n kleinen "Debugger" eingefügt^^

    private: System::Void checkBox1_Click(System::Object^  sender, System::EventArgs^  e) {
    
    				ISoundEngine* soundEngine = createIrrKlangDevice();
    
    				if(checkBox1->Checked::get()) {
    					spieleHintergrundMusik(soundEngine);
    					TestBox->Text = "Musik an";
    				} else {
    					soundEngine->stopAllSounds();
    					TestBox->Text = "Musik aus";
    				}
    
    		 }
    

    Hab ne Textbox, deren Inhalt verändert wird, wenn ich draufklicke - und der Text wechselt auch immer schön brav zwischen "musik an" und "musik aus", also in den else-block kommt er schon rein 😉

    @anti-freak:

    hab ich vllt schlecht gekennzeichnet, ich wusste schon, welchen Bereich du meintest, hab diesen auch geändert, das was ich dann gepostet hatte sollte eigentlich nur kurz zeigen, dass ich jetzt n Nullpointer abfange^^ 😉

    Ich probier mal Sone's Vorschlag - bei Erfolg oder Misserfolg meld ich mich wieder 😉
    Danke für die ganzen Anregungen schonmal^^ 😉

    Naja...globale Zeigervariable funzt auch net...


Anmelden zum Antworten