Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Wie wave-Resource mit SndPlaySound abspielen? (https://www.delphipraxis.net/216593-wie-wave-resource-mit-sndplaysound-abspielen.html)

Gelmo 24. Jan 2025 13:08

Wie wave-Resource mit SndPlaySound abspielen?
 
Hallo zusammen!
Ich habe für ein Programm, sagen wir ‚Zahlen.dpr‘ mit der IDE eine Resourcendatei erstellt, die die Wave-Dateien der gesprochenen Zahlen von 1 bis 100 enthält. Die Vorlage sieht dann so aus:

Resource_1 RCDATA 001.wav
Resource_2 RCDATA 002.wav
….
Resource_100 RCDATA 100.wav
Diese Vorlage besteht ja nur aus Strings, die in eine RES.Datei compiliert werden, die dann wohl die Wave-Dateien der Zahlen enthält.
Diese Resource wird mit {$R ZahlenResource.RES} in das Programm eingebunden. Sie befindet sich im selben Ordner wie ‚Zahlen.dpr‘. Wie muss nun der SndPlaysound-Befehl aussehen, um zum Beispiel die Resource_1 abzuspielen?
Ich würde mich freuen, wenn mir jemand weiterhelfen würde.
MfG Gelmo

Gelmo 24. Jan 2025 19:12

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Sorry, im Eifer habe ich gar nicht gesagt, was ich wissen möchte. Wie kann ich eine der Dateien aus der Resource auslesen und mit PlaySound abspielen? Muss ich dafür Resource_1 oder 001.wav als Resourcennamen angeben? Habe in der Beschreibung zur WinApi nachgesehen, kann aber mit den Parametern nichts anfangen.

jaenicke 24. Jan 2025 20:07

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Du musst keine Ressourcendatei mehr erstellen und manuell kompilieren. Das macht Delphi mittlerweile bequem selbst.
Du findest die Ressourcenverwaltung im Menü Projekt --> "Ressourcen und Bilder...". Dort kannst du einfach direkt Ressourcen hinzufügen.

Abspielen geht dann mit:
Delphi-Quellcode:
PlaySound('Resource_1', 0, SND_RESOURCE or SND_ASYNC);
Statt 0 sollte auch HInstance gehen, aber soweit ich mich erinnere geht beides.

Mehr dazu findest du in der Doku zu PlaySound, inklusive Beispiel:
https://learn.microsoft.com/en-us/pr...43680(v=vs.85)
Dort wird als Typ der Ressource WAVE verwendet.

Gelmo 24. Jan 2025 22:19

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Das habe ich schon so gemacht. Mit 'Project/Resourcen und Bilder' habe ich die Dateien in die Resource übernommen.
Mit folgender Procedure, die ich nach deinem Post angepasst habe:
Delphi-Quellcode:
Procedure TForm1.ZahlSound (Zahl : Integer);
var
  ResName,
  ResQuelle    : String;
begin
  Resquelle:='Programm1Resource.RES';
  ResName:='Resource_'+Zahl.ToString;
  Playsound(ResName, 0,SND_Resource or SND_Sync);
end;
erhalte ich die Fehlermeldung: [dcc32 Fehler] Unit1.pas(93): E2010 Inkompatible Typen: 'PWideChar' und 'string'
Den Wert Zahl erhalte ich durch Klick auf ein Label mit der Zahl. Diese Angabe nehme ich dann in ResName auf.

jaenicke 24. Jan 2025 23:20

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Du musst auf den korrekten Typ casten:
Delphi-Quellcode:
procedure TForm1.ZahlSound(Zahl: Integer);
var
  ResName: String;
begin
  ResName := 'Resource_' + Zahl.ToString;
  Playsound(PChar(ResName), 0, SND_Resource or SND_Sync);
end;

Gelmo 25. Jan 2025 16:13

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Ich melde mich erst jetzt, weil es auch mit
Delphi-Quellcode:
Playsound(ResName, 0,SND_Resource or SND_Sync);
nicht geklappt hat, den Sound in der Resource zu aktivieren. In der Version oben höre ich keinen Ton, wenn ich Snd_Resource weglasse, höre ich den Windows-Fehlerton.
Habe das Problem inzwischen gelöst, indem ich den Ordner mit den Wave-Dateien im Umfeld des Programms suche und die einzelnen Töne in ein String-Array mit den jeweiligen Sounddatei-Pfaden aufnehme und dann mit
Delphi-Quellcode:
 Playsound(ZahlSound[Zahl],0,SND_Sync);
abspiele. Das funktioniert jetzt.
Vielen Dank
MfG Gelmo

jaenicke 25. Jan 2025 17:57

AW: Wie wave-Resource mit SndPlaySound abspielen?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Dann musst du irgendetwas anders gemacht haben. So sieht es bei mir aus:

Anhang 57362

Delphi-Quellcode:
procedure TForm281.ZahlSound(Zahl: Integer);
var
  ResName: String;
begin
  ResName := 'Resource_' + Zahl.ToString;
  Playsound(PChar(ResName), 0, SND_Resource or SND_Sync);
end;

procedure TForm281.Button1Click(Sender: TObject);
begin
  ZahlSound(1);
end;
Das Testprojekt, das ich dafür eben erstellt habe, liegt im Anhang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 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-2025 by Thomas Breitkreuz