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.microsoftif (hResInfo == NULL) return FALSE;ist dann auch schon gleich Ende.
Für FindResource musste ich noch dasTEXT("")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
-
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 mitSND_EAT WAVE "eating.wav"gefüllt.
jetzt kommt auch nicht mehr NULL aus demhResInfoLeider 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.
-
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ß
OneFoxPS.: 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 ichsndPlaySound(lpRes, SND_MEMORY | SND_LOOP | SND_ASYNC);ausführe nicht aber bei der Initialisierung von den waves.
Irgenwie stimmt da noch was nicht.