Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 27.09.08 17:44 
Hallo!

Ich brauch eine kleine Hilfestellung, wie ich bei einem Sound den ich gerade abspiele, die Lautstärke verändern kann?
Es soll so ein Fade-Effekt werden wie bei WinAmp. Dazu benutze ich Soundsamples, die auf Knopfdruck aufhören sollen, aber eben nicht abrupt sondern langsam leiser werden (so im Bereich von 2-3 Sekunden). Danach soll dann auf Knopfdruck (oder per Code, da bin ich mir noch unschlüssig) der nächste Sound in normaler Lautstärke ohne Fade-In abgespielt werden.

Habt ihr ne Idee? Wär echt super, weil es ist auch ein wenig eilig - kleines Programm zur Untermalung eines Geburtstags-Spielchens.

Danke schonmal!

Grüße!


€: Und noch etwas: Wie kann ich mehrere Sounds gleichzeitig abspielen lassen? Wenn ich einen Sound abspielen lassen möchte, während ein anderer derzeit noch läuft wird dieser schlicht abgebrochen. Das wäre für meine Erfordernisse nicht sehr gut.

€2: Gibt es eine Möglichkeit herauszufinden, ob eine Wav schon komplett gespielt wurde?
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 27.09.08 18:46 
Zitat:
€: Und noch etwas: Wie kann ich mehrere Sounds gleichzeitig abspielen lassen? Wenn ich einen Sound abspielen lassen möchte, während ein anderer derzeit noch läuft wird dieser schlicht abgebrochen. Das wäre für meine Erfordernisse nicht sehr gut.

Versuchs mal mit sndplaysound().Findest du in der mmsystem-unit.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 27.09.08 18:50 
sndPlaySound klappt nicht. Damit hab ichs grad schon probiert, das ist die Funktion, bei der dann der vorige Sound abgebrochen wird.

Ich hab in der Suche diesen Thread hier gefunden: www.delphi-forum.de/...=sounds+gleichzeitig
Aber irgendwie tut sich da bei mir gar nix auf diese Art und Weise!

Bitte weitere Tipps!

Grüße!
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 27.09.08 19:03 
Was schreibst du in die Klammer?
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 27.09.08 19:26 
Ich schreibe als Prozedur folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
mciSendString('open waveaudio!C:\Geburtstag\Soundeffekte\Hintergrund\luhu01.WAV alias luhu01', nil, 0, 0);
mciSendString('play luhu01', nil, 0, 0);
end;


Sollte doch so stimmen?!

Grüße

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 27.09.08 19:57 
Nein.Mit meinem Code!
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Sa 27.09.08 20:20 
Mit SndPlaySound geht das nicht, da wird wie vorher schon gesagt der vorher gespielte Sound abgebrochen und der nächste angefangen.
Das Problem mit mciSendString hab ich jetzt nach langem Suchen in der Hilfe gefunden: Es darf kein Leerzeichen im Pfadnamen sein, sonst funktioniert das nicht mehr.
Das Problem mit dem Ausfaden bekomm ich glaub ich auch in den Griff, hab da schon was linkisches zusammengezimmert. Wenns läuft, werd ich den Code hier posten.

Bleibt noch die Frage, wie ich kontrollieren kann, ob eine Wav-Datei an ihrem Ende angekommen ist, also ob sie komplett abgespielt wurde? Für Tipps bin ich sehr dankbar!

Grüße
Jakob_Ullmann
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1747
Erhaltene Danke: 15

Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
BeitragVerfasst: So 28.09.08 17:48 
Also erst einmal: Man kann audiomäßig vieles auch über mciSendString regeln. Mag ich auch lieber.

@Kay E.: Prinzipiell richtig. Wenn in dem Dateinamen Leerzeichen sind, einfach mit " einklammern. Und zum Schluss ein CLOSE luhu01 nicht vergessen.
Kay E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Mo 29.09.08 19:48 
Hallo Jakob!
Danke für deinen Tipp, hat gut geholfen!

Hier hab ich den versprochenen Code für's ausfaden. Ist bestimmt nicht die eleganteste Art, aber ich konnte mir zumindest erfolgreich damit helfen.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
procedure TForm1.GetVolume(var volL, volR: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  volL:= 0;
  volR:= 0;
  // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
  // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  // get volume
  waveOutGetVolume(hWO, @vol);
  volL:= vol and $FFFF;
  volR:= vol shr 16;
  waveOutClose(hWO);
end;

procedure TForm1.SetVolume(const volL, volR: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  // init TWAVEFORMATEX
  FillChar(waveF, SizeOf(waveF), 0);
  // open WaveMapper = std output of playsound
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  vol:= volL + volR shl 16;
  // set volume
  waveOutSetVolume(hWO, vol);
  waveOutClose(hWO);
end;



procedure TForm1.stop_buttonClick(Sender: TObject);
begin
  i:=1;
  stop_timer.Enabled:=true;
end;

procedure TForm1.stop_timerTimer(Sender: TObject);
var
    VolLi, VolRe: Word;
begin
  GetVolume(VolLi, VolRe);
  if i>=20 then begin
    stop_timer.Enabled:=false;
    SndPlaySound(nil,0);
    end
  else begin
    VolLi:=VolLi-round(VolLi/15);
    VolRe:=VolRe-round(VolRe/15);
    SetVolume(VolLi, VolRe);
    i:=i+1;
  end;
end;


Die Prozeduren "SetVolume" und "GetVolume" hab ich hier gefunden:
www.delphi-treff.de/...multimedia/tipp/256/
Die Funktionen sind 1:1 übernommen.

Der Timer ist auf 150 ms Intervall geschaltet. Damit erhalte ich etwa 3 Sekunden Fade-Out, was sich durch regulieren des Intervalls und/oder der Schrittweite (hier 20) anpassen lässt.


Was das abspielen mehrerer Sounds angeht, hab ich das Problem folgendermaßen gelöst:
Mit SndPlaySound spiel ich einen Track im Loop (wusste nicht, wie das mit den mciSendString geht. Die Effekte werden dann über mciSendString eingeblendet. Funktioniert sehr gut.


Was noch wirklich nützlich wäre zu wissen ist, wie ich herausfinden kann, ob ein Wav komplett abgespielt worden ist, oder ob es zur Zeit noch läuft. Dazu habe ich bis jetzt noch nichts gefunden.
Vielleicht weiß ja noch jemand was?


Grüße!

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt
FrEaKY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: Di 30.12.08 05:26 
user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:

Hier hab ich den versprochenen Code für's ausfaden. Ist bestimmt nicht die eleganteste Art, aber ich konnte mir zumindest erfolgreich damit helfen.


Unelegant nicht... das ist schon gut so. Aber in diesem Fall nicht ganz passend! Mit dieser SetVolume Prozedur wird ja die gesamte Systemlautstärke gesetzt! D.h. wenn du gerade gleichzeitig ein Lied in Winamp hörst, wird das auch leiser obwohl du da garnichts geändert hast...
Außerdem wenn du es wirklich so machen willst, sollte deine Anwendung die Lautstärke am Ende wieder so zurücksetzen wie sie vorher war.
Ich glaub aber eher der TS will NUR den Sound von seinem Programm leiser machen. Und das geht nur über die Waveform API... es sei denn du nimmst eines dieser freeware libs BASS, FMOD und wie sie alle heißen. (wovon ich nix halte) und dann machst du dich halt stark abhängig und hast zusätzliche DLLs die du mitliefern musst.

mfg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.12.08 12:03 
user profile iconFrEaKY hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaub aber eher der TS will NUR den Sound von seinem Programm leiser machen. Und das geht nur über die Waveform API...
Wobei man dann auf ein Format beschränkt ist, zudem hat sich da unter Vista sehr viel geändert.

user profile iconFrEaKY hat folgendes geschrieben Zum zitierten Posting springen:
es sei denn du nimmst eines dieser freeware libs BASS, FMOD und wie sie alle heißen. (wovon ich nix halte) und dann machst du dich halt stark abhängig und hast zusätzliche DLLs die du mitliefern musst.
Dafür hat man aber auch tausend Mal mehr Möglichkeiten, und durch dynamische Einbindung der DLLs kann man die DLL auch als Ressource mitliefern und auspacken, wenn sie fehlt. Ich selbst benutze meistens BASS.

Zudem kommt man bei größeren Projekten ohnehin nicht sinnvoll um DLLs herum.