AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi waveOutSetVolume aus mmsystem
Thema durchsuchen
Ansicht
Themen-Optionen

waveOutSetVolume aus mmsystem

Ein Thema von DataCool · begonnen am 11. Jun 2003 · letzter Beitrag vom 11. Jun 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

waveOutSetVolume aus mmsystem

  Alt 11. Jun 2003, 11:16
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]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#3
  Alt 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

Gruß Data

P.S. Du hast Recht meine Funktion gab es schon in Delphi
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#4
  Alt 11. Jun 2003, 12:28
Moin Data,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#5
  Alt 11. Jun 2003, 13:23
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...
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 11. Jun 2003, 14:20
Moin d3g,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#7
  Alt 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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#9
  Alt 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]
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#10
  Alt 11. Jun 2003, 17:17
Moin Data,

schrei doch nicht so

Zitat von DataCool:
Ich meine nicht den Rückgabewert der Funktion, die Werte sind mir bekannt !
immerhin hattest Du ja danach gefragt, oder?

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:

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:

Result := (v shr 16) Du brauchst halt nur die andere Berechnung umzukehren, also nach rechts schieben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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