Waves in den Speicher laden und abspielen



  • Hallo Leute,

    Wie auch viele ander habe ich das problem das man mit PlaySound, nur Zeitnahe und nicht sofort .wav Dateinen wiedergeben kann. Also habe ich mich mal an sndPlaySound gemacht.
    Die ersten Probleme treten leider schon bei FindResource auf.

    HRSRC hResInfo = FindResource(hInstanceApp,TEXT("TEST"),TEXT("WAVE"));
    

    Wenn ich das Programm eine Zeile später unterbreche ist hResInfo immer noch leer.
    bei z.B msdn.microsoft

    if (hResInfo == NULL) 
            return FALSE;
    

    ist dann auch schon gleich Ende.
    Für FindResource musste ich noch das

    TEXT("")
    

    wegen des UNICODE einfügen.
    Ich denke mal da das so ziemlich der Grundstein ist müsste das ja als erstes behoben werden um überhaupt weiter zu sehen.

    Gruß
    OneFox


  • Mod

    Wie hast Du denn die WAV Datei in die ressourcen Datei eingefügt. Vermutlich ist der name oder der Typ falsch. Oder Du verwendest hier Texte für die Namen aber in der ressource IDs, oder umgekehrt.



  • Vielen dank,
    Ich hatte mich noch nie mit so was wie resource Dateien befast.
    Hab jetzt eine resource.rc angelegt und mit

    SND_EAT WAVE "eating.wav"
    

    gefüllt.
    jetzt kommt auch nicht mehr NULL aus dem

    hResInfo
    

    Leider bin ich noch ganz am Anfang die nächste frage ist wie bekomme ich den gewünschten Zeiger auf

    sndPlaySound([Zeiger], SND_MEMORY|SND_ASYNC|SND_LOOP);
    

    hin. Der Zeiger muss im LPCWSTR format sein
    Muss ich die .wav Datei irgenwie Binäre auslesen?
    Ich hab bissher glaube ich ziemlichen Müll gecodet, aber es läst sich Erstellen 😃

    HRSRC hResInfo = FindResource(hInstanceApp,TEXT("SND_EAT"),TEXT("WAVE"));
     	if(hResInfo==NULL)
    		return;
     	HANDLE sndLaser = LoadResource(hInstanceApp, hResInfo);
    

    und weiter unten

    const char* sndRes = (const char*)LockResource(sndLaser);
    	if (sndRes)
    	{
    		mbstowcs (tlol,sndRes, strlen (sndRes));
    			tlol[strlen (sndRes)]='\0';
    		sndPlaySound(tlol, SND_MEMORY|SND_ASYNC|SND_NODEFAULT);
    		UnlockResource(sndRes);
    	}
    

    Naja irgenwie klappt das nicht ^^.



  • Ich bins noch mal,
    Ich hab hier auch noch mal das Beispiel von MSDN umgeschrieben:

    BOOL PlayResource(LPSTR lpName) 
    { 
        BOOL bRtn; 
        LPSTR lpRes; 
        HANDLE  hRes, hResInfo; 
    	//MultiByteToWideChar(CP_ACP,0,
        // Find the WAVE resource. 
    
        hResInfo = FindResource(0,TEXT("SND_EAT"), TEXT("WAVE")); 
        if (hResInfo == NULL) 
            return FALSE; 
    
        // Load the WAVE resource. 
    
        hRes = LoadResource(0, (HRSRC)hResInfo); 
        if (hRes == NULL) 
            return FALSE; 
    
        // Lock the WAVE resource and play it. 
    
        lpRes = (LPSTR)LockResource(hRes); 
        if (lpRes != NULL) { 
    		hResInfo = FindResource(0,TEXT("SND_EAT"), TEXT("WAVE")); 
            bRtn = sndPlaySound(TEXT("SND_EAT"), SND_MEMORY | SND_LOOP | SND_ASYNC); 
            UnlockResource(hRes); 
        } 
         else 
            bRtn = 0; 
    
        // Free the WAVE resource and return success or failure. 
    
        FreeResource(hRes); 
        return bRtn; 
    }
    

    Naja zu hören ist nichts, aber ich kann es erstellen 😉
    Liegt aber denke ich auch mal an dem Problem mit dem Zeiger bei:

    sndPlaySound(TEXT("SND_EAT"), SND_MEMORY | SND_LOOP | SND_ASYNC);
    

    TEXT("SND_EAT") das kenn ist ja warscheinlich kein Zeiger auf die Datei^^

    Gruß
    OneFox



  • UnlockResource kann man sich sparen, ist nicht mal mehr im MSDN gelistet.


  • Mod

    Warum übergibst Du nicht den Zeiger der Ressource?

    LPCTSTR lpRes = static_cast<LPCTSTR>(LockResource(hRes)); 
     bRtn = sndPlaySound(lpRes, SND_MEMORY | SND_LOOP | SND_ASYNC);
    

    Vor allem bitte keinen Unfug wie das hier:

    mbstowcs (tlol,sndRes, strlen (sndRes));
                tlol[strlen (sndRes)]='\0';
    


  • Vielen Dank, Jetzt bekomm ich zumindest schon mal sound 🙂
    Welche Varialblen muss ich jetzt Global(oder wie ich es vor habe in einer Verketteten Liste) Speichern damit ich sozusagen alle .wav im Speicher habe?
    Ist es nur die LPCTSTR lpRes ?
    Mein vorhaben wäre dann eine Liste mit IDs zu erstellen und dann je nach Bedarf über Get Funktionen die einzelden "Zeiger"(lpRes) auf die wave Dateien zu holen und wieder zugeben. Das ganze sollte ja die Verzögerung weg machen, wenn ich alles in Vorfeld lade und dann nur mit Zeigern arbeite oder?

    Gruß
    OneFox

    PS.: Mmh wenn ich LPCTSTR lpRes global mache und

    HRSRC hResInfo = FindResource(hInstanceApp,TEXT("SND_EAT"),TEXT("WAVE"));
    	if(hResInfo==NULL)
    		return;
     	HANDLE sndLaser = LoadResource(hInstanceApp, hResInfo);
    	lpRes = static_cast<LPCTSTR>(LockResource(sndLaser));
    

    ganz am Programmstart ausführe und dann später im Programm z.B wenn ich F3 drücke

    sndPlaySound(lpRes, SND_MEMORY | SND_LOOP | SND_ASYNC);
    

    starte dann braucht er wieder ein bisschen so wie auch ohne das mit SND_MEMORY.
    Wenn ich mir im Taskmanager den Arbeitspeicher des Prozesses anschaue dan geht er erst hoch, wenn ich

    sndPlaySound(lpRes, SND_MEMORY | SND_LOOP | SND_ASYNC);
    

    ausführe nicht aber bei der Initialisierung von den waves.
    Irgenwie stimmt da noch was nicht.


Anmelden zum Antworten