Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi waveOutSetVolume aus mmsystem (https://www.delphipraxis.net/5561-waveoutsetvolume-aus-mmsystem.html)

DataCool 11. Jun 2003 11:16


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:
// 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;
Irgentwie funktioniert das ganze nicht richtig, kann mir jemand sagen, warum ?

Gruß Data

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Christian Seehase 11. Jun 2003 11:39

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:
procedure TTWKom.setVolume(Value: Longint);
begin
   if active then
   begin
      fVolume := Value;
      waveoutsetvolume(acmOut.FWaveOutHandle, (Word(Value) shl 16) or (Word(Value)));
   end;
end;
BTW: Für Dein IntToHexStr kennt Delphi IntToHex.

[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]

DataCool 11. Jun 2003 11:49

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:

Christian Seehase 11. Jun 2003 12:28

Moin Data,

Zitat:

Zitat von DataCool
aber wenn ich jetzt Werte zwischen 0 bis 255 an diese Procedure übergebe ist mein Wave-Ausgabelevel immer 0 ?!

nein. Im Wesentlichen hängt es davon ab, wieviele Bits das Gerät für die Auflösung der Lautstärke benutzt. Sind es 8, hast Du den vollen Bereich abgedeckt, sind es mehr kommst Du nicht an's Maximum (vielleicht versteh' ich das falsch aber so entnehme ich das der Doku).
Ausserdem ist die Lautstärkenänderung logarithmisch und nicht linear.

d3g 11. Jun 2003 13:23

Zitat:

Zitat von Christian Seehase
Ausserdem ist die Lautstärkenänderung logarithmisch und nicht linear.

Zwischenfrage: Wie ist das gemeint? Bedeutet das, dass der Schalldruck logarithmisch geregelt wird, oder dass der Schalldurck an sich linear gehandhabt wird (die logarithmische Wahrnehmung wird dann nur durch die Signalverarbeitung unseres Gehirns hervorgerufen)? Ersteres wäre ja schrecklich...

Christian Seehase 11. Jun 2003 14:20

Moin d3g,

Zitat:

Zitat von PSDK
This means the perceived increase in volume is the same when increasing the volume level from 0x5000 to 0x6000 as it is from 0x4000 to 0x5000.


DataCool 11. Jun 2003 14:49

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

Christian Seehase 11. Jun 2003 16:04

Moin Data,

als Fehlercode, wobei ein Rückgabewert von 0 als "Kein Fehler" zu betrachten ist.
Die Codes sind im PSDK bzw. MSDN beschrieben.

DataCool 11. Jun 2003 16:48

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:
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;
Leider funktioniert das nicht richtig;
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]

Christian Seehase 11. Jun 2003 17:17

Moin Data,

schrei doch nicht so

Zitat:

Zitat von DataCool
Ich meine nicht den Rückgabewert der Funktion, die Werte sind mir bekannt !

immerhin hattest Du ja danach gefragt, oder?

Zitat:

Zitat von DataCool
wie habe ich dann den Rückgabewert der Funktion : waveOutGetVolume zu interpretieren ?

Da auch hier wieder beide Kanäle in einer Variablen übergeben werden, muss Du die nur wieder trennen. Wenn Dich hierbei wieder nur der Wert für einen Kanal interessiert, und da Du ja nur einen Wert brauchst bleibt Dir da auch nichts weiter übrig, wird's ganz einfach:

Delphi-Quellcode:
Result := v and $FFFF;
Damit hättest Du dann den Monowert, falls das Gerät keine zwei Kanäle unterstützt, oder den des linken Kanals.

Solltest Du den rechten brauchen:

Delphi-Quellcode:
Result := (v shr 16)
Du brauchst halt nur die andere Berechnung umzukehren, also nach rechts schieben.

d3g 11. Jun 2003 20:22

Zitat:

Zitat von Christian Seehase
Moin d3g,

Zitat:

Zitat von PSDK
This means the perceived increase in volume is the same when increasing the volume level from 0x5000 to 0x6000 as it is from 0x4000 to 0x5000.


Ich bin beruhigt... Danke.


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