| Autor |
Beitrag |
Kay E.
      
Beiträge: 118
|
Verfasst: 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
|
Verfasst: 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. 
      
Beiträge: 118
|
Verfasst: 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
|
Verfasst: Sa 27.09.08 19:03
Was schreibst du in die Klammer?
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Sa 27.09.08 19:26
Ich schreibe als Prozedur folgendes:
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 matze: Delphi-Tags hinzugefügt
|
|
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Sa 27.09.08 19:57
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: 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
      
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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. 
      
Beiträge: 118
|
Verfasst: 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.
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; FillChar(waveF, SizeOf(waveF), 0); waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0); 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 FillChar(waveF, SizeOf(waveF), 0); waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0); vol:= volL + volR shl 16; 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 Gausi: Code- durch Delphi-Tags ersetzt
|
|
FrEaKY
      
Beiträge: 235
D7
|
Verfasst: Di 30.12.08 05:26
Kay E. hat folgendes geschrieben : |
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 30.12.08 12:03
FrEaKY hat folgendes geschrieben : | | 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.
FrEaKY hat folgendes geschrieben : | | 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.
|
|
|