Background Musik unter Window Forms



  • Nabend allerseits,

    ich habe mir ein GUI gebastelt und möchte, dass sobald das Programm gestartet wird, Hintergrundmusik abgespielt wird.

    Für die Hintergrundmusik habe ich eine eigene .cpp Datei erstellt:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <windows.h>
    #include "include/irrKlang.h"
    
    using namespace std;
    using namespace irrklang;
    
    #pragma comment(lib, "irrKlang.lib")
    
    void backgroundSound() {
    
    	ISoundEngine* engine = createIrrKlangDevice();
    
    	if(!engine) {
    		return;
    
    	}
    
    	string sSoundFile = "La Musica Notturna (Passa Calle).mp3";
    
    	if(engine->play2D(sSoundFile.c_str()) != 0) {
    		return;
    	}
    
    	while(engine->isCurrentlyPlaying(sSoundFile.c_str())) {
    		Sleep(100);
    	}
    
    	engine->drop();
    
    }
    

    Jetzt weiß ich allerdings nicht, wo ich die Funktion aufrufen soll...

    Kann mir da einer helfen?



  • Schreib alles bis zu der while Schleife (exklusive) in eine "StartBackgroundMusic" Funktion, die while Schleife selbst wird zu deinem Hauptprogramm, und der Rest (engine->drop()) kommt in eine "StopBackgroundMusic" Funktion.

    Den ISoundEngine-Zeiger musst du dazu natürlich irgendwo abspeichern wo die "StopBackgroundMusic" Funktion dann auch wieder drankommt. Einfachste Lösung: mach ne globale Variable.

    Davon abgesehen: was hat das bitte mit "Window(s) Forms" zu tun?



  • Ich hab jetzt mal n bissl ummodelliert^^

    .h Datei

    #pragma once
    
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <windows.h>
    #include "include/irrKlang.h"
    
    #pragma comment(lib, "irrklang.lib")
    
    using namespace std;
    using namespace irrklang;
    
    class HintergrundMusik {
    
    private:
    	ISoundEngine* soundEngine;
    	ISound* currentSound;
    	string soundFile;
    
    public:
    	HintergrundMusik();
    	HintergrundMusik(string);
    	~HintergrundMusik();
    
    	void spieleSoundThread();
    	bool spielt();
    
    };
    

    .cpp Datei

    #include "HintergrundMusik.h"
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    #include <windows.h>
    #include "include/irrKlang.h"
    
    using namespace std;
    using namespace irrklang;
    
    HintergrundMusik::HintergrundMusik() {
    
    	soundEngine = createIrrKlangDevice();
    	currentSound = 0;
    
    	if(!soundEngine) {
    		exit(0);
    	}
    
    }
    
    HintergrundMusik::HintergrundMusik(string sSoundFile) {
    
    	soundEngine = createIrrKlangDevice();
    	currentSound = 0;
    
    	if(!soundEngine) {
    		exit(0);
    	}
    }
    
    HintergrundMusik::~HintergrundMusik() {
    	soundEngine->drop();
    }
    
    void HintergrundMusik::spieleSoundThread() {
    
    	soundFile = "La Musica Notturna (Passa Calle).mp3";
    
    	currentSound = soundEngine->play2D(soundFile.c_str(), false, false, true);
    
    	while(spielt()) {
    		Sleep(100);
    	}
    
    }
    
    bool HintergrundMusik::spielt() {
    
    	return !currentSound->isFinished();
    
    }
    

    und der Aufruf erfolgt halt in ner anderen Klasse:

    private: System::Void HintergrundmusikAn_Click(System::Object^  sender, System::EventArgs^  e) {
    				 if(HintergrundmusikAn->Checked::get()) {
    					HintergrundmusikAus->Checked::set(false);
    
    					HintergrundMusik backgroundSound;
    					backgroundSound.spieleSoundThread();
    				 }
    			 }
    

    Wenn ich die Checkbox anklicke spielt der auch den Sound ab, allerdings möchte ich eigentlich, dass

    1. der Sound beim Programmstart abgespielt wird und nicht erst, wenn die Checkbox angeklickt wird und

    2. das Programm nicht warten muss, bis die Sounddatei beendet ist - jetzt wird die Sounddatei abgespielt und nix anderes geht mehr - ich hab in C++ mit Threads noch keinerlei Erfahrung sammeln können..

    Kann mir da jemand weiterhelfen?^^ 😉



  • Windows Forms und Musik sind in Standard-C++ nicht enthalten. In welches Forum darf ich dich verschieben?


Anmelden zum Antworten