Musik abspielen



  • Moin, also ich hab nen kleines Programm hier geschrieben, mit 6 Sounds (sind ressourcen), alles .wav dateien, ich kann die im programm auch mit

    sndPlaySound(data5, SND_MEMORY | SND_SYNC | SND_NODEFAULT);

    ganz einfach abspielen, NUR es ist verbuggt.

    Also wenn ich zB 2 mal auf den Button drücke um einem sounds abzuspielen laggt es (programm lässt sich net verschieben, etc)sound wird abgespielt (doppelt) (hinternander ohne pause) und das find ich dumm.

    Ich möchte, das wenn man nen sound abspielt und auf nem anderen button drückt (der eine abgebrochen wird) und, dass der andere sound dann direkt abgespielt wird.

    gibs da eventuell ne funktion die in der windows.h mit drinnen ist?

    ansonsten ne gute libarie? wenns geht, sollte man auch .mp3 abspielen können (ressourcen wäre kleiner, programm dann direkt kleiner) wenns geht keine riessigen .dll oder lobaries.

    also ich habe leider nochnix richtiges gefunden, auf der fmod seite steht, mit .mp3 würde es gehen, ich weis aber nicht genau was ich dazu genau brauche...

    Danke schonmal

    mfg Kollege



  • PlaySound(MAKEINTRESOURCE(ID_WAV1), hInstance, SND_RESOURCE | SND_ASYNC | SND_NODEFAULT);
    


  • geht Leider nicht 😞

    selbe wie vorher, wenn ein sound gespielt wird, ist das programmm für nix anderes mehr zugänglich (ausser man klickt auf andere buttond, und die soudns werden dann direkt im anschluss alle abgespielt. programm ist wie gefroren wenn es nen sound abspielt...

    habe schonmal mit bassmod gearbeitet, also mit .mod dateien in einem programm, dass ging reibungslos

    bei jeder buttonaktion nen BASSMOD_MusicFree(); und dann den sound geladen und dann abgespielt, einwandfrei gefunzt, man konnte abspielen was man wollte...

    naja, mit playound geht leider nicht, wobei das mit hInstance sowiso nicht wollte 😕 😕

    naja, eventuell andere libarie (wenn möglich sotle alles mitgelinkt werden (also keine sachen, wie bassmod mit ner extra .dll ....

    mfg


  • Mod

    PlaySound funktioniert asynchron wenn Du auch SND_ASYNC setzt. Es stimt nicht, dass diese Funktion dann Dein Programm blociert!



  • ...wie wäre es mit einem zweiten thread?



  • Freundchen schrieb:

    geht Leider nicht 😞

    LOL, du scheinst nicht einmal copy&paste zu können. 😉 Natürlich geht das!



  • Ich sagte ja bereits, hInstance gibts bei mir in der WndProc net...

    nochmal der ausschnitt (was net funktioniert)

    case WM_COMMAND:
          {
             if (lParam == (LPARAM)hButton1)
             {
                //LPVOID data1 = LockResource(LoadResource(0, FindResource(0,MAKEINTRESOURCE(ID_WAVE_01),"WAVE")));
                if(HIWORD(wParam) == BN_CLICKED)
                {
                     //sndPlaySound(data1, SND_MEMORY | SND_SYNC | SND_NODEFAULT);
                     PlaySound(MAKEINTRESOURCE(ID_WAVE_01), 0, SND_RESOURCE | SND_ASYNC | SND_NODEFAULT);
                     return 0;
                }
             }
    
    .........
    .....
    

    das mit sndPlaySound und loadressource, war die lösung vorher.. blockiert genauso wie euer async playsound ...



  • Freundchen schrieb:

    Ich sagte ja bereits, hInstance gibts bei mir in der WndProc net...

    Jop und das ist auch gut so 😃 . Mit GetModuleHandle(NULL) kommt Du an den Handle Deines aktuellen Moduls (also Deiner EXE, der Normalfall). Falls Du aus anderen Modulen laden willst, hast Du dabei entsprechend ein HMODULE via LoadLibrary bekommen, den kannst Du dann verwenden. Letzteres ist aber in Deinem Fall eher unwarscheinlich 😃 .



  • Ansonsten steht die hInstance auch in einem der Parameter der WinMain. Viel WinAPI hast du noch nicht geproggt, oder? 😉


  • Mod

    Ich verstehe bis heute nicht warum alle Leute immer GetModuleHandle(NULL) anraten, wenn hInstance in WinMain brav übergeben wird. Sobald man das Stück Code in einer DLL verwendet funktioniert wer nicht mehr...



  • Joar, aber IMHO befindet er sich NICHT in der WinMain, sondern in der WndProc... . Wobei ich eigentlich auch den hInstance-Parameter aus der WinMain globalisiert hätte 😉 , so wäre es zu Testzwecken aber einfacher.



  • Martin Richter schrieb:

    Ich verstehe bis heute nicht warum alle Leute immer GetModuleHandle(NULL) anraten, wenn hInstance in WinMain brav übergeben wird. Sobald man das Stück Code in einer DLL verwendet funktioniert wer nicht mehr...

    Hi, also was wäre deine Meinung nach die richtige Lösung? Ich bin wirklich noch WinApi noob, sondn paar lustige sounds die ich für ein paar kollegen zu nem programm zusammen füegen möchte...

    wäre dankbar wenn du mal ein koplettes beispiel mit richtiger hInstance übergabe posten könntest (so dass es auch mit ner .dll klappen würde.)

    danke



  • getmodulehandle(null) bringt btw auchnix, wenn ein sound abgespielt wird, wird der rest blockiert,...

    mfg



  • Freundchen schrieb:

    wenn ein sound abgespielt wird, wird der rest blockiert,...

    Ich schreibe es jetzt zum letzten mal: du musst in den Flags SND_ASYNC anstatt SND_SYNC angeben!



  • löl, es war async

    nur ich habe vergessen die makefiles zu löschen, meine ide rafft irgendwie net das alles neu kompilliert werden soll,

    danke klappt wunderbar mit async...

    mfg

    achja, geht das auch mit .mp3 ?



  • Nein, AFAIK nicht. Dann hilft aber mciSendCommand, mciSendString.



  • Hi Leute,
    Also mein Cpp-Queltext für mp3's ist so:

    [cpp]
    #include <windows.h>
    //#pragma comment(lib,"winmm.lib")  //für MSV C++  
    
    int main()
    {
    
      mciSendString("open file.mp3", NULL, 0, NULL);
      mciSendString("play file.mp3 wait", NULL, 0, NULL);
      mciSendString("close file.mp3", NULL, 0, NULL);
    
      return 0;
    }
    [/cpp]
    

    Ihr müsst nur noch beim Compiler Visual C++ die Komentare wegmachen in der 2. Zeile! Für Dev-Cpp bei Projekt Optionen --> Linker Optionen einfach -lwinmm
    eingeben! Bei anderen Compilern einfach wimm.lib Linken!

    Ich hoffe der Beitrag war hilfreich!

    MfG _Der Auflöser_


Log in to reply