waveOutSetVolume aus mmsystem
Hi Leute,
ich möchte gerne die Wave-Ausgabe Lautstärke ändern sprich per Schieberegler anpassen. Dazu habe ich mir die Hile der Funktion waveOutSetVolume angeschaut und habe mir folgenden Code ausgedacht :
Delphi-Quellcode:
Irgentwie funktioniert das ganze nicht richtig, kann mir jemand sagen, warum ?
// Konvertiert einen Integer Wert in einen Hexadezimal-String
Function InttoHexStr(Num : Byte) : String; Var EZ, ZZ : Byte; EZStr, ZZStr : String; begin EZ := Num div 16; ZZ := Num mod 16; if ez > 9 then begin Case EZ of 10 : EZStr := 'A'; 11 : EZStr := 'B'; 12 : EZStr := 'C'; 13 : EZStr := 'D'; 14 : EZStr := 'E'; 15 : EZStr := 'F'; end; end else EZStr := inttostr(EZ); if Zz > 9 then begin Case ZZ of 10 : ZZStr := 'A'; 11 : ZZStr := 'B'; 12 : ZZStr := 'C'; 13 : ZZStr := 'D'; 14 : ZZStr := 'E'; 15 : ZZStr := 'F'; end; end else ZZStr := inttostr(ZZ); Result := EZStr+ZZStr; end; // hier kommen als Value nur Werte zwischen 0 und 255 in Frage // da meine Trackbar auf diese Werte begrenzt ist procedure TTWKom.setVolume(Value: Longint); var v : DWORD; a : Longint; HexStr : String; begin if active then begin fVolume := Value; // get Volume-Value HexStr := InttoHexStr(Value); // set this value for right and left channel HexStr := '$'+HexStr+HexStr; v := StrToInt(HexStr); waveoutsetvolume(acmOut.FWaveOutHandle, v); end; end; Gruß Data [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] |
Moin Data,
WaveOutSetVolume erwartet als 2. Parameter ein DWORD, wobei linker/rechter Kanal im nieder/höherwertigen WORD liegen. So müsste die Methode genügen:
Delphi-Quellcode:
BTW: Für Dein IntToHexStr kennt Delphi IntToHex.
procedure TTWKom.setVolume(Value: Longint);
begin if active then begin fVolume := Value; waveoutsetvolume(acmOut.FWaveOutHandle, (Word(Value) shl 16) or (Word(Value))); end; end; [EDIT] Allerdings dürfte das Ganze bei Dir recht leise werden, da der Wertebereich für die Lautstärke von $0000 bis $FFFF reicht (0-65535), Du aber nur 0-255 zulässt. [/EDIT] |
Danke erstmal, aber wenn ich jetzt Werte zwischen 0 bis 255 an diese Procedure übergebe ist mein Wave-Ausgabelevel immer 0 ?!
Oder muß ich andere Werte bei meiner Trackbar eintragen ? Danke, Deine Änderung war das was ich brauchte :wink: Gruß Data P.S. Du hast Recht meine Funktion gab es schon in Delphi :oops: |
Moin Data,
Zitat:
Ausserdem ist die Lautstärkenänderung logarithmisch und nicht linear. |
Zitat:
|
Moin d3g,
Zitat:
|
Hi,
wenn ich jetzt anhand der momentanen Lautstärke die Position meiner TrackBar setzen möchte, wie habe ich dann den Rückgabewert der Funktion : waveOutGetVolume zu interpretieren ? Gruß Data |
Moin Data,
als Fehlercode, wobei ein Rückgabewert von 0 als "Kein Fehler" zu betrachten ist. Die Codes sind im PSDK bzw. MSDN beschrieben. |
Ich meine nicht den Rückgabewert der Funktion, die Werte sind mir bekannt !
ich möchte anhand der aktuelle Lautstärke die Position meiner TrackBar setzen. Jetziger Code :
Delphi-Quellcode:
Leider funktioniert das nicht richtig;
function TTWKom.getVolume: Longint;
var v : pdword; res : mmresult; begin Result := fVolume; if active then begin res := waveOutGetVolume(acmOut.FWaveOutHandle, @v); if Integer(res) <> 0 then result := 0 else result := Integer(v); end; end; Ich denke mal das der Wert in V auch irgentwie umgerechnet werden muß mit shl, aber wie ? Gruß Data [edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit] |
Moin Data,
schrei doch nicht so Zitat:
Zitat:
Delphi-Quellcode:
Damit hättest Du dann den Monowert, falls das Gerät keine zwei Kanäle unterstützt, oder den des linken Kanals.
Result := v and $FFFF;
Solltest Du den rechten brauchen:
Delphi-Quellcode:
Du brauchst halt nur die andere Berechnung umzukehren, also nach rechts schieben.
Result := (v shr 16)
|
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 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