AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sound auslesen und in % umrechnen

Ein Thema von Andy-h · begonnen am 5. Okt 2007 · letzter Beitrag vom 5. Okt 2007
Antwort Antwort
Andy-h

Registriert seit: 3. Okt 2007
23 Beiträge
 
#1

Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 20:57
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 20:58
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?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#3

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 21:07
Und dass der Operator "/" nicht auf ganze Zahlen angewendet werden kann?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Andy-h

Registriert seit: 3. Okt 2007
23 Beiträge
 
#4

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 21:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 21:22
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 "/".
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Andy-h

Registriert seit: 3. Okt 2007
23 Beiträge
 
#6

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 21:29
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;
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 22:00
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:
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
Floor(X / 65535) = X div 65535 Naja ^^ siehe oben

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Sound auslesen und in % umrechnen

  Alt 5. Okt 2007, 22:06
Du kannst auch einfach erst mit 100 multiplizieren:
(X*100) div 65535
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:20 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