wav in .exe einkompilieren ?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

wav in .exe einkompilieren ?

Beitrag von Cocky »

Hi mal wieder :)

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

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: wav in .exe einkompilieren ?

Beitrag von creed steiger »

http://wiki.lazarus.freepascal.org/Laza ... esource.3F" onclick="window.open(this.href);return false;

http://wiki.lazarus.freepascal.org/Lazarus_Resources" onclick="window.open(this.href);return false;

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: wav in .exe einkompilieren ?

Beitrag von Cocky »

Vielen Dank @ creed steiger ! :)

also .lrs kompilieren hat schon mal geklappt. Ressource einer Variablen zuweisen ...

Code: Alles auswählen

Sound1AsString:=LazarusResources.Find('sound1').Value;
... klappt nach o.a. Prinzip auch. Zumindest hat die Variable anschließend die korrekte Länge.

*hüstel* ... könnte mir nun noch jemand in seiner/ihrer unendlichen Güte und Weisheit sagen, wie ich das aus dem Memory abgespielt bekomme ?? :mrgreen:

In Delphi funktionierts ja so ...

Code: Alles auswählen

// .RC Datei bauen, wobei z.B. ...
1 WAVE "c:\eigenebla.wav"
2 WAVE "c:\eigeneblabla.wav"
und dann im Programm aufrufen mit ...

Code: Alles auswählen

PlaySound(PChar(1),HInstance, snd_ASync or snd_Memory or snd_Resource);
Müsste in Lazarus/FPC ja ähnlich gehen. Allerdings gibts ja keine .RC Dateien wie im WIKI steht, oder ??

Ich bedanke mich nochmals herzlichst im Voraus ! ;)

LG Cocky

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: wav in .exe einkompilieren ?

Beitrag von Cocky »

für die, die es interessiert ...

Ich habs jetzt so gelöst:

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;
wobei '051_001' der Name der kompilierten Ressource (051_001.WAV) ist.

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 ! :mrgreen:

LG Cocky

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6926
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von af0815 »

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 ! :mrgreen:
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: wav in .exe einkompilieren ?

Beitrag von Cocky »

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.
Hmmm ... hatte ich auch schon drüber nachgedacht. Allerdings spricht folgendes dagegen:
  • Die zu programmierende Anwendung soll eine 1 Datei Anwendung werden (daher auch das Einkompilieren der .wav Dateien). ACS benötigt aber, sofern ich das richtig verstanden habe, zusätzlich librarys für den Betrieb ?!
  • das Programm benötigt genau 6 .wav Dateien, deren Größe im zweistelligen kB Bereich liegen. Da erscheint mir ein echtes Sound-System wie ACS etwas überdimensioniert.
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 :|

LG Cocky

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6926
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von af0815 »

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 :|
In einen Thread packen ?!
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von Christian »

ACS benötigt für das simple abspielen einer Wave datei keinerlei extere bibliotheken. Weder unter Windows noch unter Linux.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: wav in .exe einkompilieren ?

Beitrag von Cocky »

Threading. Jo, würde sich irgendwie anbieten. Hab zugegebenermaßen noch NIE damit gearbeitet. Ist die Threading Sache eigentlich plattformabhängig ? ich les in den Dokus immer was von Win32 ?! :?

[edit]@ Christian ... für ACS muß man das Lazarus Package installieren ? oder gehts auch durch simples Einbinden einer Unit oder so ?? [/edit]

LG Cocky

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von Euklid »

Cocky hat geschrieben:Threading. Jo, würde sich irgendwie anbieten. Hab zugegebenermaßen noch NIE damit gearbeitet.
... das ist auch eine Wissenschaft für sich. Für bestimmte Zwecke lohnt es sich.
Ist die Threading Sache eigentlich plattformabhängig ? ich les in den Dokus immer was von Win32 ?! :?
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.


Viele Grüße, Euklid

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von Christian »

Du kannst auch de Units einzeln einbinden aber das Package macht dir das eigentlich eher einfacher als schwieriger...
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6926
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von af0815 »

In der letzten Toolbox (2/2009) war ein guter Artikel über eine Unit, die das Multithreathing 'relativ' einfach macht.

Stichwort: Die Multithreading-Bibliothek MTProcs
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

marcov
Beiträge: 1103
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: wav in .exe einkompilieren ?

Beitrag von marcov »

Cocky hat geschrieben:für die, die es interessiert ...

Ich habs jetzt so gelöst:

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;
wobei '051_001' der Name der kompilierten Ressource (051_001.WAV) ist.

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 ! :mrgreen:
Sieht sich an ob mit "async" playsound DIREKT weitergeht in program. Aber dan gibst du den Memstream direkt frei.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: wav in .exe einkompilieren ?

Beitrag von Socke »

marcov hat geschrieben:Sieht sich an ob mit "async" playsound DIREKT weitergeht in program. Aber dan gibst du den Memstream direkt frei.
...
könnte man dann einfach so machen:

Code: Alles auswählen

// der berühmte Einzeiler; ggf anpassen
PlaySound(PChar(LazarusResources.Find('abc').Value), 0, SND_ASYNC or snd_Memory);
MfG Socke
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: wav in .exe einkompilieren ?

Beitrag von Cocky »

Socke hat geschrieben:

Code: Alles auswählen

// der berühmte Einzeiler; ggf anpassen
PlaySound(PChar(LazarusResources.Find('abc').Value), 0, SND_ASYNC or snd_Memory);
MfG Socke
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 ...

LG Cocky

Antworten