
ich möchte eine .wav Datei in die .exe mit einkompilieren und außerdem aus der .exe heraus abspielen.
Geht so was irgendwie ??
LG Cocky
Code: Alles auswählen
Sound1AsString:=LazarusResources.Find('sound1').Value;
Code: Alles auswählen
// .RC Datei bauen, wobei z.B. ...
1 WAVE "c:\eigenebla.wav"
2 WAVE "c:\eigeneblabla.wav"
Code: Alles auswählen
PlaySound(PChar(1),HInstance, snd_ASync or snd_Memory or snd_Resource);
Code: Alles auswählen
procedure TForm1.Button2Click(Sender: TObject);
var Sound1AsString: String;
memStream : TMemoryStream;
len: Integer;
begin
memStream := TMemoryStream.Create;
Sound1AsString := LazarusResources.Find('051_001').Value;
len := Length(Sound1AsString);
memStream.Write(PChar(Sound1AsString)^, len);
PlaySound(memStream.Memory, 0, SND_SYNC or snd_Memory);
memStream.Free;
end;
Wenn nicht 64 bit - ev. mit den ACS Komponenten abspielen ?! Ist nur ne Idee und nicht getestet. Demos sind ja dabei, vielleicht lässt da eines sich anpassen.Cocky hat geschrieben: Unbefriedigend ist, daß es mit SND_ASYNC als Parameter-Option aus irgend welchen Gründen nicht funktioniert (Sound wird einfach nicht abgespielt) und bei SND_SYNC hingegen das Programm angehalten wird, bis der Sound fertig abgespielt ist. Falls also jemand Vorschläge hat um das Ganze zu verbessern bzw. eleganter zu machen o.ä. ... immer her damit !![]()
Hmmm ... hatte ich auch schon drüber nachgedacht. Allerdings spricht folgendes dagegen:af0815 hat geschrieben:Wenn nicht 64 bit - ev. mit den ACS Komponenten abspielen ?! Ist nur ne Idee und nicht getestet. Demos sind ja dabei, vielleicht lässt da eines sich anpassen.
In einen Thread packen ?!Cocky hat geschrieben:Funktionieren tut's ja. Halt nur nicht sooooooo schön. Vielleicht bekomm ichs ja auch noch irgendwie hin das mit SND_ASYNC zum laufen zu kriegen![]()
... das ist auch eine Wissenschaft für sich. Für bestimmte Zwecke lohnt es sich.Cocky hat geschrieben:Threading. Jo, würde sich irgendwie anbieten. Hab zugegebenermaßen noch NIE damit gearbeitet.
Ja, Threading ist plattformunabhängig. Nur funktioniert glaube der GNU Debugger unter Linux mit multithreaded Programmen nicht. D.h. unter Linux müsstest du den abstellen.Ist die Threading Sache eigentlich plattformabhängig ? ich les in den Dokus immer was von Win32 ?!![]()
Sieht sich an ob mit "async" playsound DIREKT weitergeht in program. Aber dan gibst du den Memstream direkt frei.Cocky hat geschrieben:für die, die es interessiert ...
Ich habs jetzt so gelöst:
wobei '051_001' der Name der kompilierten Ressource (051_001.WAV) ist.Code: Alles auswählen
procedure TForm1.Button2Click(Sender: TObject); var Sound1AsString: String; memStream : TMemoryStream; len: Integer; begin memStream := TMemoryStream.Create; Sound1AsString := LazarusResources.Find('051_001').Value; len := Length(Sound1AsString); memStream.Write(PChar(Sound1AsString)^, len); PlaySound(memStream.Memory, 0, SND_SYNC or snd_Memory); memStream.Free; end;
Unbefriedigend ist, daß es mit SND_ASYNC als Parameter-Option aus irgend welchen Gründen nicht funktioniert (Sound wird einfach nicht abgespielt) und bei SND_SYNC hingegen das Programm angehalten wird, bis der Sound fertig abgespielt ist. Falls also jemand Vorschläge hat um das Ganze zu verbessern bzw. eleganter zu machen o.ä. ... immer her damit !![]()
...marcov hat geschrieben:Sieht sich an ob mit "async" playsound DIREKT weitergeht in program. Aber dan gibst du den Memstream direkt frei.
Code: Alles auswählen
// der berühmte Einzeiler; ggf anpassen
PlaySound(PChar(LazarusResources.Find('abc').Value), 0, SND_ASYNC or snd_Memory);
Ich bilde mir ein, daß ich es exakt so probiert hätte, ohne den entsprechenden Erfolg. Werds aber die Tage noch mal so probieren, vielleicht hab ich ja was geringfügig anders gemacht ...Socke hat geschrieben:MfG SockeCode: Alles auswählen
// der berühmte Einzeiler; ggf anpassen PlaySound(PChar(LazarusResources.Find('abc').Value), 0, SND_ASYNC or snd_Memory);