Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mehrere WAVE Dateien parallel aus einer .RES-Datei abspielen (https://www.delphipraxis.net/132947-mehrere-wave-dateien-parallel-aus-einer-res-datei-abspielen.html)

XoRiC 22. Apr 2009 14:03


Mehrere WAVE Dateien parallel aus einer .RES-Datei abspielen
 
Hi,

tut mir Leid dass ich schon wieder einen Thread bezüglich WAVE Dateien starte, aber ich konnte nach knapp 30 minütigem Durchstöbern des Archivs kein entsprechendes Thema finden das mir weiterhilft.

Ich hatte anfangs für mein Projekt einige WAVE Dateien im Projekt Ordner rumliegen, widergegeben habe ich diese wie folgt:

Delphi-Quellcode:
mciSendString(PChar('open waveaudio shareable'), nil, 0, 0);
mciSendString(PChar('play "./Sound/' + FileName + '"'), nil, 0, 0);
mciSendString(PChar('close waveaudio'), nil, 0, 0);
Wichtig ist für mein Projekt, dass mehrere WAVE Dateien parallel abgespielt werden können, was hier der Fall war und wunderbar geklappt hat.
Nun habe ich mich dazu durchgerungen, die WAVE Dateien in ein(ig)e RES Datei(en) zu packen. Um sie abzuspielen verwende ich derzeit folgende Prozedur:

Delphi-Quellcode:
  var hFind, hRes: THandle;
      Song: PChar;
begin
  hFind := FindResource(HLib, PChar(SoundName), 'WAVE');
  if (hFind <> 0) then begin
    hRes := LoadResource(HLib, hFind);
    if (hRes <> 0) then begin
      Song := LockResource(hRes);
      if Assigned(Song) then SndPlaySound(Song, snd_ASync or snd_Memory);
      UnlockResource(hRes);
    end;
    FreeResource(hFind);
  end;
Das funktioniert soweit auch einwandfrei, jedoch lässt sich auf diese Weise nur immer jeweils ein Sound gleichzeitig abspielen. Soll eine neue WAVE aufgerufen werden, so muss die Wiedergabe der alten WAVE abgebrochen werden.

Ich habe einige Lösungsvorschläge gefunden. Unter anderem die Idee, die WAVE Dateien temporär wieder auf die Festplatte zu speichern. So könnte ich meinen alten Code wieder verwenden, aber besonders elegant finde ich die Lösung nicht.
In die Bass.dll müsste ich mich erst einarbeiten und meine ersten Versuche sind kläglich gescheitert.

Ich suche nun also nach einer möglichst simplen Möglichkeit, um mehrere WAVE Dateien aus einer RES Datei parallel wiedergeben zu können.

Vielen Dank für Tipps und Links,
Xoric

XoRiC 23. Apr 2009 18:33

Re: Mehrere WAVE Dateien parallel aus einer .RES-Datei abspi
 
Falls niemand eine Idee hat würde ich mich wohl auch damit zufriedengeben, die WAVE Dateien temporär aus der RES Datei zu laden und auf die Festplatte zu speichern. Sie sind nicht allzu groß und wenn sie dort eine Weile liegen bleiben bevor sie wieder gelöscht werden sollte es hoffentlich nicht zu langsam werden.

Mit Bitmaps bekomm ich das hin:
- Objekt vom Typ TBitmap erstellen (var B: TBitmap)
- Bitmap aus der RES Datei laden (B.LoadFromResourceName(...))
- Bitmap auf die Festplatte speichern (B.SaveToFile(...))
Für WAVE Dateien fehlt mir leider der Ansatz.

Alternative Frage also:
Wie kann ich eine WAVE Datei aus einer RES Datei auf die Festplatte speichern?

Ich bin für jeden Tipp dankbar!
Xoric

Sunlight7 23. Apr 2009 19:43

Re: Mehrere WAVE Dateien parallel aus einer .RES-Datei abspi
 
Wenn die Waves nicht groß sind, könntest Du sie in den RAM laden und von dort aus abspielen, zB mit MSDN-Library durchsuchenWaveOutOpen oder MSDN-Library durchsuchenDirectSound.

XoRiC 23. Apr 2009 21:15

Re: Mehrere WAVE Dateien parallel aus einer .RES-Datei abspi
 
Hi Sunlight,

ich hab deine beiden Vorschläge angeschaut, bin damit aber auf keinen grünen Zweig gekommen.
Wenn ich irgendwann mal wieder die Nerven hab um mich da noch weiter hineinzuarbeiten werd ich das sicher tun.
Für jetzt hab ich mich für eine andere Lösung entschieden.
Vielen lieben Dank aber für die Links :)

-----

Ich werde meinen Thread mal als "erledigt" flaggen und mich mit der oben genannten Notlösung zufrieden geben.
Falls das Thema noch andere interessiert - so kann man WAVE (bzw beliebige) Dateien aus der RES Datei extrahieren:

Delphi-Quellcode:
var
 rStream: TResourceStream;
 fStream: TFileStream;
 fname: string;
begin
 fname := ExtractFileDir(Paramstr(0))+'\Test.wav';
 rStream := TResourceStream.Create(hInstance, 'Test', PChar('WAVE')) ;
 try
  fStream := TFileStream.Create(fname, fmCreate) ;
  try
   fStream.CopyFrom(rStream, 0) ;
  finally
   fStream.Free;
  end;
 finally
  rStream.Free;
 end;
Hier wird zum Beispiel die WAVE Datei 'Test' als 'Test.wav' in den Projektordner extrahiert.
Nachzulesen gibt es das hier.

-----

Sollte doch noch irgendjemand über diesen Thread stolpern, der eine Möglichkeit kennt um die WAVE Dateien direkt aus der RES abzuspielen ohne dass die Wiedergabe der letzten WAVE abgebrochen wird, wenn eine neue abgespielt wird, so möge er bitte dennoch hier posten :)

Danke
Xoric


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz