Resource an TProcess übergeben

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Resource an TProcess übergeben

Beitrag von Scotty »

Ich würde gern Sound aus einer Resource abspielen. Unter Windows geht das leicht per:

Code: Alles auswählen

sndPlaySound(PChar(LazarusResources.Find(aWaveFile).Value),snd_async or snd_memory);
Aber wie mache ich das unter Linux, wenn ich dort TProcess benutze?

Code: Alles auswählen

with TProcess.Create(nil) do
try
  CommandLine:='/usr/bin/paplay "'+aWaveFile+'"';
  Execute;
finally
  Free;
end;

Eb
Lazarusforum e. V.
Beiträge: 240
Registriert: Di 5. Feb 2008, 15:32
OS, Lazarus, FPC: Linux Mint - Laz 2.2.0
CPU-Target: 64Bit
Wohnort: Stuttgart

Re: Resource an TProcess übergeben

Beitrag von Eb »

Unter OpenSuse spiele ich wav-Dateien mit 'play' ab - das ist im Paket sox enthalten:

Code: Alles auswählen

procedure sound_abspielen(filename : string; faktor_lautstaerke : real);          
var  AProcess: TProcess;                                                          
  kommando : string;                                                              
begin                                                                             
  kommando :=  'play -q -v ' + floattostr(faktor_lautstaerke) + ' '  + filename  ;
 
  AProcess := TProcess.Create(nil)  ;                                             
  AProcess.CommandLine := kommando;                                             
  AProcess.Execute; 
 
end;
wobei faktor_lautstaerke zwischen 0 und 1 sein muss.

Ist nicht elegant, tut aber ...

Eb

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Resource an TProcess übergeben

Beitrag von Scotty »

Das Abspielen ist nicht das Problem. Linux Anwender sollten in der Lage sein, ihren Audio-Server zu bedienen, und ich habe meinem Programm ein TEdit für die Commandline spendiert. Mein Problem ist, dass ich die Waves gern als Ressource einbinden würde. Auch das geht problemlos, aber ich habe keine Idee, wie ich die Ressource an einen TProcess übergeben kann. snPlaySound(.., snd_Memory) gibt es nicht unter Linux.

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Resource an TProcess übergeben

Beitrag von Hitman »

Schau doch mal, ob eins der Programme vlt. von stdin abspielen kann, dann könntest du den Inhalt der Resource dort hin pipen.

Benutzeravatar
theo
Beiträge: 10874
Registriert: Mo 11. Sep 2006, 19:01

Re: Resource an TProcess übergeben

Beitrag von theo »

Hitman hat geschrieben:Schau doch mal, ob eins der Programme vlt. von stdin abspielen kann, dann könntest du den Inhalt der Resource dort hin pipen.
Das wäre sicher der Königsweg, aber weil doch ein bisschen kompliziert reicht es vllt. auch die Ressource erstmal in ein Temp-File zu speichern und bei Programmende alles zu löschen (falls man nicht auf das Ende des externen Prozesses warten kann).

marcov
Beiträge: 1102
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: Resource an TProcess übergeben

Beitrag von marcov »

Es sollte doch auch Bibliotheken geben die Wave Audio abspielen können? Seit .mp3 meistens nach .wav dekomprimiert würde es mich wundern wenn nicht jene MP3player Lib auch Wave spielen konnte.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Resource an TProcess übergeben

Beitrag von Scotty »

Sowohl Alsa als auch Pulseaudio können gepipt werden (paplay <Chat.wav). Im Terminal ist das kein Problem, aber wenn ich dem TProcess die gleiche Commandline gebe, kommt nichts mehr raus, egal, ob mit oder ohne Options:=[poUsePipes] ("paplay Chat.wav" funktioniert). Das gleiche passiert, wenn ich "cat Chat.wav ¦ paplay" eingebe: im Terminal alles einwandfrei, per Commandline kein Erfolg.
Wenn das ginge, dann sollte doch auch der String selbst (LazarusResources.Find('Chat').Value -> "RIFF...") umgeleitet werden können, oder?
PS: Bibliotheken mag ich nicht benutzen, weil Anwender dann darauf angewiesen sind, irgendwas zu installieren. Und das nur für ein Gimmick! :mrgreen:

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Resource an TProcess übergeben

Beitrag von Hitman »

Schonmal Audorra angeguckt? Das braucht zwar dann sicher auch externe libs, aber soweit ich das sehe, ist es dabei immernoch variabel (man ist nicht auf eine bestimmte angewiesen). Und als User ist es mir ehrlich gesagt lieber, es heisst "du brauchst FMOD" als "such dir ein commandline tool, find dessen Parameter raus und gib sie hier manuell an". FMOD, BASS und Co hab ich schneller installiert als ich rausgefunden habe, wie ich per commandline Sound abspiele.

Antworten