Musik in C++ exe einbinden?!?



  • Hey ho Leute,

    ich hab jetzt eine Stunde gegoogelt und nachgeforscht wie ich Musik in mein Projekt einbinden kann. Bin aber nur bis zu diesem Ergebnis gekommen:

    #include <vcl.h>
    #pragma hdrstop
    #include <mmsystem.h>
    #pragma comment(lib,"winmm.lib")
    #include <windows.h>
    
    #include "Test_u.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    
    int main()
    {
    	PlaySound("fahrstuhl.wav", HInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
    }
    

    Es will aber immer noch nicht funktionieren...weiß jemand vielleicht eine Lösung?

    (arbeite mit Turbo C++ 2005, und bin Anfänger 😉 )



  • Es gibt mehrere Möglichkeiten.

    PlaySound ist evtl unbefriedigend, da man nur unkomprimierte wav Dateien spielen kann.

    Variante 1 (MCISendString):
    mit mciSendString kann man schon mehr machen.

    Beispiel:

    mciSendString("open \"C:\\file.mp3\" alias NAME wait", 0, 0, 0); // wait blockiert den weiteren Ablauf
    mciSendString("play NAME from 0", 0, 0, 0); // from 0 = from start
    mciSendString("close NAME", 0, 0, 0); // nötig am Ende
    

    zu wait: http://msdn.microsoft.com/en-us/library/windows/desktop/dd757622(v=vs.85).aspx

    NAME ist ein einzigartiger name, den du vergibts. Mit diesem Namen kannst du die Datei pausieren, stoppen und wieder schließen.

    es gibt dann noch die Befehle:

    play NAME from VALUE
    pause NAME
    resume NAME (gegenteil zu pause)
    stop NAME
    close NAME
    setaudio NAME Volume to VALUE (ich glaube von 0 bis 1000)

    Falls dir was fehlt ist hier der Rest:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd757151(v=vs.85).aspx

    Zu mciSendString: http://msdn.microsoft.com/en-us/library/windows/desktop/dd757161(v=vs.85).aspx

    Variante 2:
    die Komponente TMediaPlayer des Builders (EDIT: Ich weiß nicht seit wann es die gibt, ich gehe davon aus, dass du die nicht hast... keine Ahnung)

    Variante 3:
    Eine Bibliothek wie fmod.
    Die ist zwar super und kann viel, aber die ist glaube ich zu "übertrieben".



  • Also die 1. Variante hört sich am besten an. Nur versteh ich nicht ganz wie ich das umsetzten soll und was ich mich auch frag, ob es dann möglich ist, dass der Sound dann immer in der .exe gepeichert bleibt.



  • Naja, was die Umsetzung angeht: Kommt ganz darauf an was du vorhast.

    Du kannst die Musik als Ressource hinzufügen und auf bei Bedarf auf die Festplatte speichern (siehe die VCL FAQ in dem Forum).
    Ich habe noch nicht ausprobiert eine Audiodatei direkt von einem Puffer abzuspielen.

    EDIT:
    Gib nochmal ein bisl background info.
    Wie viele Dateien willst du denn spielen, wie groß (in total)?
    Dann kann man noch ein bisschen besser drauf eingehen und eine gute Lösung finden.
    Vielleicht reicht PlaySound ja vollkommen aus.



  • also mir geht es nur darum das die Musik dauerhaft in der .exe läuft.



  • was mciSendString angeht, da brauchst du nur an den Command der den Track spielt "repeat" anfügen.

    mciSendString("play NAME from 0 repeat", 0, 0, 0);
    


  • 1. Erstelle eine Datei, z. B. "resource.rc" und schreibe Folgendes rein:

    RES_MYSOUND    WAVE    "mysound.wav"
    

    2. Leg sie und die WAV-Datei in deinem Verzeichnis ab und füge die RC-Datei dem Projekt hinzu (Shift + F11).

    3. Abspielen mit

    PlaySound(L"RES_MYSOUND", (HINSTANCE__ *) HInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
    

    Wobei der erste Parameter dem ersten Bezeichner in der RC-Datei entspricht (es können auch mehrere Einträge erstellt werden - auch andere wie z. B. Bilder). Für PlaySound() musst du noch mmsystem.h inkludieren.

    Guck in die WinAPI Doku für weitere Sachen, die du mit der Funktion machen kannst. 😉



  • ich glaub ich bin dumm. Ich habs jetzt genau so gemacht und es funktioniert nicht.

    int main ()
    {
    PlaySound("RES_MYSOUND", HInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
    }
    

    die "resource.rc" hab ich erstellt und dem Projekt hinzugefügt.

    RES_MYSOUND    WAVE    "fahrstuhl.wav"
    

    hab auch mmsystem.h inkludiert.

    und wenn ich es genau so eintippe wie du geschrieben hast:

    PlaySound(L"RES_MYSOUND", (HINSTANCE__ *) HInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
    

    dann bekomm ich eine Fehlermeldung...

    ich kapiers nicht 😞



  • Tut mir leid, ich hab vermutlich eine neuere Version der IDE... nutze einfach deinen Aufruf wie vorhin, nur mit dem Resourcenbezeichner RES_MYSOUND anstelle eines Dateipfades:

    PlaySound("RES_MYSOUND", HInstance, SND_RESOURCE | SND_ASYNC | SND_LOOP);
    

    Ich bin mir nicht sicher welche Fehlermeldung du bekommst (bitte immer angeben), aber du hattest eigentlich schon fast alles richtig gemacht. Das Flag SND_RESOURCE im dritten Parameter sagt, dass er die wave-Datei aus seiner Resource laden soll, anstatt woanders her (z. B. Festplatte). Über den ersten Parameter kannst du ihm sagen welche Ressource er laden soll.

    Edit: Oh, ich sehe gerade du hattest es bereits so geschrieben. Dann müsstest du uns schon die Fehlermeldung verraten.



  • hä? genau so hab ich es ja gemacht. Er lädt die RES_MYSOUND resource datei die ich erstellt hab und in das Projekt eingefügt hab.
    Aber wenn ich das Projekt ausführe kommt der Sound nicht.



  • Ich habe noch das hier gefunden, das du ausprobieren könntest:
    How To Use MCI to Play AVI/WAVE Files from Memory:
    http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q155/3/60.asp&NoWebContent=1
    (Ich probier das demnächst mal aus)

    Dann kannst du die Resource in den Speicher laden und abspielen.
    Ich kann dir nicht sagen warum PlaySound nicht funktioniert.



  • Daniel95 schrieb:

    hä? genau so hab ich es ja gemacht. Er lädt die RES_MYSOUND resource datei die ich erstellt hab und in das Projekt eingefügt hab.
    Aber wenn ich das Projekt ausführe kommt der Sound nicht.

    Es müsste aber funktionieren. Vielleicht hast du sie mit einem Codec komprimiert? Könntest du die Datei irgendwo raufladen, damit wir das testen können? So ganz ohne Fehlermeldungen oder Beispieldateien kann man da nur raten. Probiere mal die folgende Datei - wenn es mit der klappt, liegt es an deiner WAV- oder RC-Datei (bei mir funktioniert es).

    http://www.vocaldownloads.com/subscrgetsongp.cfm?songid=241&code=FREE (Quelle)



  • hm es kommt immer noch keine Musik aber es kommt auch keine Fehlermeldung.

    die resource Datei und die .wav sind auch im selben Verzeichnis.

    Hier mal 2 Screens:

    http://s7.directupload.net/file/d/3216/uduel2ed_jpg.htm

    http://s14.directupload.net/file/d/3216/8dv5bwvg_jpg.htm



  • Probiere mal das Beispiel von dieser Webseite für sndPlaySound aus.



  • Ohne jetzt wirklich Plan von der Soundgeschichte zu haben, hat die Funktion doch bestimmt einen Rückgabewert.
    Diesen sollte man sich mal anschauen.
    Da es vermutlich WinApi ist kann man dann normalerweise mit GetLastError() mehr Infos bekommen.

    Außerdem bringen solche pauschal Aussagen wie "funktioniert nicht" oder es "kommt ein Fehler" gar nichts.
    Wenn Dir geholfen werden soll, bitte grundsätzlich auch die Fehlermeldungen und Details was nicht funktioniert posten.

    Manches mag für die selbstverständlich sein, da Du genau weißt was Du willt, jedoch für das Forum ist dies oft nicht der Fall, weill einfach Hintergrundinfos fehlern.

    Weiterhin viel Erfolg.



  • WxWidgets besitzt auch die Möglichkeit Muskidateien
    abzuspielen, wäre vlt. etwas für Anfänger.

    0x0ERROR



  • Daniel95 schrieb:

    es kommt immer noch keine Musik aber es kommt auch keine Fehlermeldung.
    [...]
    http://s7.directupload.net/file/d/3216/uduel2ed_jpg.htm

    Falls das noch aktuell ist: prüfe mit dem Debugger, ob dein int main() überhaupt aufgerufen wird.
    Vermutlich eher nicht ...


Log in to reply