Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Sound auslesen und in % umrechnen (https://www.delphipraxis.net/100946-sound-auslesen-und-umrechnen.html)

Andy-h 5. Okt 2007 19:57


Sound auslesen und in % umrechnen
 
Hallo

Ich habe mich an einem Mediaplayer versucht.
Musikabspielen geht auch. Jetzt möchte ich zwei label in denen man die Lautstärke in % ablesen kann.
ich habe diesen Code gefunden:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  VolLi, VolRe: Word;
begin
  GetVolume(VolLi,VolRe);

  Label1.Caption:=IntToStr(VolLi);
  Label2.Caption:=IntToStr(VolRe);
end;
es wierd aber ja nur der Wave wert (oder wie man das auch ausdrück angezeigt)z.b. 65535

Jetzt wollte ich einfach den wert mit zwei zusäzlichen Variablen umrechen:

Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var
 TonLi, TonRe, VolLi, VolRe: Word;
begin
  GetVolume(VolLi,VolRe);
  TonLi:= Volli / 65535 * 100;
  TonRe:= VolRe /65535 * 100;
  Label1.Caption:=IntToStr(TonLi);
  Label2.Caption:=IntToStr(TonRe);
end;
Es werden keine Fehler angezeigt bis ich compiliere dan kommen die fehler:

[Pascal Fehler] Unit4.pas(117): E2010 Inkompatible Typen: 'Word' und 'Extended'
[Pascal Fehler] Unit4.pas(118): E2010 Inkompatible Typen: 'Word' und 'Extended'
[Pascal Fataler Fehler] MP.dpr(5): F2063 Verwendete Unit 'Unit4.pas' kann nicht compiliert werden

Wie Programmiere ich so eine Rechnung?

Davor habe ich noch das stehen:

Delphi-Quellcode:
procedure 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 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;

Gruß
Andy

SirThornberry 5. Okt 2007 19:58

Re: Sound auslesen und in % umrechnen
 
du weißt schon das dir GetVolume nicht die lautstärke zurück gibt die aktuell gespielt wird sondern die eingestellte für das Gerät?!

DeddyH 5. Okt 2007 20:07

Re: Sound auslesen und in % umrechnen
 
Und dass der Operator "/" nicht auf ganze Zahlen angewendet werden kann?

Andy-h 5. Okt 2007 20:14

Re: Sound auslesen und in % umrechnen
 
Hallo
Das GetVolume nur die eingestellte Lautstärke des Gerät anzeigt weis ich.
Das man / nich auf ganze zahlen anwenden kann wusste ich nicht.

Wie mache ich das dann?

Ich habe viel mit Swishmax gearbeitet und von da bin ich es so gewohnt.

Khabarakh 5. Okt 2007 20:22

Re: Sound auslesen und in % umrechnen
 
Zitat:

Zitat von Andy-h
Das man / nich auf ganze zahlen anwenden kann wusste ich nicht.

Vergiss es gleich wieder, denn es ist falsch ;) . Allerdings errechnet eben "/" eine Gleitkommazahl, die du dann auch in einer Variablen mit dem entsprechenden Typen speichern musst. Reichen dir ganzzahlige Prozentwert, dann nimm einfach "div" statt "/".

Andy-h 5. Okt 2007 20:29

Re: Sound auslesen und in % umrechnen
 
Hallo Khabarakh

Wenn du mit ganzzahlige ohne komma meinst dann ja .
mit div kommt aber nur 100 und 0 als wert raus.

Der code sieht jetzt so aus:

Delphi-Quellcode:
procedure TForm4.Button2Click(Sender: TObject);
var
TonLi, TonRe, VolLi, VolRe: Word;
begin
  GetVolume(VolLi,VolRe);
  TonLi:= Volli div 65535 * 100;
  TonRe:= VolRe div 65535 * 100;
  Label1.Caption:=IntToStr(TonLi);
  Label2.Caption:=IntToStr(TonRe);
end;

xZise 5. Okt 2007 21:00

Re: Sound auslesen und in % umrechnen
 
Ja ;)
Und zwar ist div eine Intdivision: Also wird Int / Int genommen und dann alle Nachkommastellen abgeschnitten ;)
Also musst du entweder nicht durch 65535 sondern 655 (=> Also sozusagen gekürzt) oder du berechnest eine Zahl und machst dann eine Ganzzahl draus.
Dafür gibt es mehrere Methoden:
Floor() Trunc() schneiden die Nachkommastellen ab
Ceil() rundet auf
Round() ^^ Rundet.

Zu den 1.: Bevor du denkst wo ist der Unterschied bedenke folgendes:
Delphi-Quellcode:
Floor(X / 65535 * 100) <> X div 65535 * 100
Da du bei Floorzuerst die Prozent ausrechnset (Also von 0..100) und dann die Nachkommastellen entfernst.
Beim zweiteren Berechnest du zuerst eonrn "rationalen" Wert: 0..1 und schneidest dann die Nachkommastellen ab ;)

Um dich vollends zu verwirren ;)
Delphi-Quellcode:
Floor(X / 65535) = X div 65535
Naja ^^ siehe oben ;)

MfG
xZise

Apollonius 5. Okt 2007 21:06

Re: Sound auslesen und in % umrechnen
 
Du kannst auch einfach erst mit 100 multiplizieren:
Delphi-Quellcode:
(X*100) div 65535


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 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