![]() |
mehrere Sounds hinteinander abspielen ohne Anwendung stoppen
Hallo,
ich möchte in meinem Programm kleine Sounds abspielen und zwar hintereinander ohne das die Anwedung angehalten wird, wie es zum Beispiel bei SndPlaySound() der Fall ist, wenn ich als Flag SND_SYNC verwende.
Delphi-Quellcode:
Nehme ich aber als Flag SND_ASYNC, wird nur der letze Sound abespielt. Wenn ich also 5 Sounds abspsielen will, die unterschiedliche Länge haben (nicht länger als 3 Sekunden), dann wird immer nur der letzte abgespielt.
SndPlaySound(PChar('Sounds\S1.wav'), SND_SYNC);
SndPlaySound(PChar('Sounds\S2.wav'), SND_SYNC); Gibt es da eine Lösung? Ich möchte keine Fremdkomponente verwenden, da ich denke dass es eine Lösung gibt, nur leider komm ich nicht drauf. Gruß Mazel |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
mmmhhh :gruebel: Denke mal du musst so ne art Loop reinmachen Loop (wiederholen) damit du Endloschleife bekommst musst mal abchecken muss gehen :stupid: :stupid:
|
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Hintereinander? Du solltest ja irgendwie mitkriegen können, wann der eine Sound zuende ist, dann schiebst du den nächsten nach....
@JackZero: Glaube nicht, dass er das machen will ;) EDIT: Ne schnelle Lösung: In nem Thread synchron abspielen! |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Hi,
@JackZero: Ich weis nicht was du mit Loop meinste? Eine "For-Schleife" oder doch die Soundwiederholung? Wenn du das letztere meinst dann nein. :wink: Wenn ich das in eine For-Schleife packe, geht das auch nicht, da die Schleife viel zu schnell ist. @DGL-luke: Mit welcher Methode kann ich herausbekommen, wann der Sound zuende ist? |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Das weiß ich nicht... aber wie gesagt, in einem thread synchron müsste funktionieren.
|
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Also mit Threads hab ich nicht viel Erfahrung. Kannst du mir sagen wie ich das am besten machen kann?
|
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Du erstellst ein neues Thread-Objekt (Datei->Neu->Delphi-Projekte->Thread-Objekt oder so ähnlich), schreibst in die Execute-Methode deine Aufrufe.
Im Hauptprogramm erzeugst du den Thread dann und startest ihn, entweder indem du bei createsuspended false angibst oder indem du .Resume aufrufst. EDIT: hab das mal schnell gemacht:
Delphi-Quellcode:
Aufruf:
unit UPlaySoundThread;
interface uses Classes,MMSystem; type TPlaySoundThread = class(TThread) private { Private-Deklarationen } protected procedure Execute; override; end; implementation procedure TPlaySoundThread.Execute; begin SndPlaySound(PChar('Sounds\S1.wav'), SND_SYNC); SndPlaySound(PChar('Sounds\S2.wav'), SND_SYNC); end;
Delphi-Quellcode:
var sndThread: TPlaySoundThread;
begin sndthread := TPlaySoundThread.Execute(false); end; |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Hi,
danke für den Code. Was heißt das jetzt was da steht? Läuft der Thread parallel ab? Wenn ja wird meine Anwendung nicht beeinflust? Edit: Hab das eben ausprobiert, die Form hält trotzdem an. Gruß Mazel |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Die VCL startet damit für dich einen neuen Thread, ja, der im Prinzip vom Mainthread unabhängig läuft.
(Wenn du allerdings selbstständig Execute aufrufst, läuft es im Kontext des Mainthreads ;) ) Hmm... das kann eigentlich nicht sein. Allerdings habe ich gerade das selbe Phänomen in einer Anwendung von mir. Ich werde das ganze mal auf Luckies NonVCL-Threading umstellen und dann sehen, ob sich was ändert. |
Re: mehrere Sounds hinteinander abspielen ohne Anwendung sto
Hallo,
Zuerst: Es ist besser, PlaySound anstatt von SndPlaySound zu verwenden. Wenn du die Länge des Sounds kennst, kannst du es mit
Delphi-Quellcode:
probieren, wobei Delay die Prozedur von negaH aus der
PlaySound('S1.wav', 0, SND_ASYNC or SND_FILENAME);
Delay(3000); PlaySound('S2.wav', 0, SND_ASYNC or SND_FILENAME); ![]() [edit]Habe es nicht getestet, aber ich mache es meistens mit einem Timer (Interval = 100), den ich zum Abspielen aktiviere. Im onTimer deaktiviert er sich selbst und die Zeilen oben werden ausgeführt. Das sollte das Programm nicht aufhängen.[/edit] Gruß, ManuMF |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz