Tipy a triky v Delphi, díl 67.

Regulace hlasitosti jednotlivých zvukových kanálů bude téma dnešního dílu. Ukážeme si, jak nezávisle regulovat hlasitost levého a pravého kanálu.
Již jsme si kdysi ukazovali, jakým způsobem regulovat celkové hlasitosti jednotlivých zařízení v systému a mohli jste si tak vytvořit například vlastní variantu systémového programu pro ovládání hlasitosti. Dnešní příklad bude vlastně na toto téma trošku navazovat. Funkčnost jednoduchého ovládání hlasitosti drobně rozšíříme a ukážeme si, jak ovládat hlasitost každého kanálu zvlášť. Opět nám bude pomáhat knihovna MMSystem.

A bez dalších zbytečných úvodů se rovnou vrhneme na popis našeho příkladu. Vytvořte si nový projekt a na formulář umístěte dvě komponenty Label. Ty nám poslouží pro výpis aktuální hlasitosti levého a pravého kanálu. Dále na formulář umístěte dvě komponenty TrackBar, pomocí kterých budeme regulovat samotnou hlasitost. Rozsah hodnot, kterých může hlasitost jednotlivých kanálů nabývat, se pohybuje od 0 do 65535 (typ Word). Nastavte proto vlastnosti komponent TrackBar v Object Inspectoru na tento rozsah. A to je vlastně vše. Funkce na zjištění aktuální hlasitosti a na nastavení hlasitosti podle vaší volby naleznete v přiloženém zdrojovém kódu:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MMSystem, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    Label1: TLabel;
    TrackBar2: TTrackBar;
    Label2: TLabel;
    procedure TrackBar1Change(Sender: TObject);
    procedure TrackBar2Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure GetVolume(var volLeft, volRight: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  volLeft := 0;
  volRight := 0;
  FillChar(waveF, SizeOf(waveF), 0);
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  waveOutGetVolume(hWO, @vol);
  volLeft := vol and $FFFF;
  volRight := vol shr 16;
  waveOutClose(hWO);
end;

procedure SetVolume(const volLeft, volRight: Word);
var
  hWO: HWAVEOUT;
  waveF: TWAVEFORMATEX;
  vol: DWORD;
begin
  FillChar(waveF, SizeOf(waveF), 0);
  waveOutOpen(@hWO, WAVE_MAPPER, @waveF, 0, 0, 0);
  vol := volLeft + volRight shl 16;
  waveOutSetVolume(hWO, vol);
  waveOutClose(hWO);
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Label1.Caption := IntToStr(TrackBar1.Position);
  SetVolume(TrackBar1.Position, TrackBar2.Position);
end;

procedure TForm1.TrackBar2Change(Sender: TObject);
begin
  Label2.Caption := IntToStr(TrackBar2.Position);
  SetVolume(TrackBar1.Position, TrackBar2.Position);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  volL, volR: Word;
begin
  GetVolume(volL, volR);
  Trackbar1.Position := volL;
  Label1.Caption := IntToStr(TrackBar1.Position);
  Trackbar2.Position := volR;
  Label2.Caption := IntToStr(TrackBar2.Position);
end;

end.

Zbývá jen přiřadit dané události OnChange pro jednotlivé TrackBary a rovněž nezapomeňte přiřadit událost OnCreate formuláře, ve které se zjišťují počáteční (aktuální) hlasitosti a podle toho se nastaví poloha TrackBarů.

Úroveň hlasitosti, kterou zobrazují Label1 a Label2, je zobrazena jako číslo z intervalu 0..65535, což asi nebude pro reálné použití to pravé, ale jistě pro vás nebude problém tuto hodnotu přepočítat například na procenta či jiné hodnoty, které vám budou vyhovovat. Příklad si ještě můžete dále vylepšit tím, že přidáte na formulář třetí TrackBar, který bude sloužit jako vyvážení levé a pravé strany, tedy podobně jako ze systémového ovládacího programu.

A pro puntičkáře na samý závěr připomínám, že ve zdrojovém kódu nejsou pro přehlednost ošetřeny chybové stavy, ale věřím, že snad bude každý schopen konstrukci try..except do svého programu bez problému přidat.

Diskuze (1) Další článek: USB klíčenka s pamětí již s podporou USB 2.0

Témata článku: Software, Windows, Programování, Trik, Díl


Určitě si přečtěte

Šmírování kamerami Googlu: Koukněte se, co zachytily na Street View

Šmírování kamerami Googlu: Koukněte se, co zachytily na Street View

Google stále fotí celý svět do své služby Street View. A novodobou zábavou je hledat v mapách Googlu vtipné záběry. Podívejte se na výběr nejlepších!

redakce | 44

Nechali jsme dopadnout asteroid Ryugu na Prahu. Místo stověžatého města je pětikilometrový kráter

Nechali jsme dopadnout asteroid Ryugu na Prahu. Místo stověžatého města je pětikilometrový kráter

** Ryugu je blízkozemní planetka, která křižuje dráhu Země ** Její průměr je asi 900 metrů ** Co by se stalo, kdyby Ryugu dopadla na Zemi?

Petr Kubala | 5

V doupěti hackerů na brněnské FIT: Ukázali nám útoky na Bluetooth i vlastní chytré krabičky

V doupěti hackerů na brněnské FIT: Ukázali nám útoky na Bluetooth i vlastní chytré krabičky

** Internet je plný malwaru, to už dnes ví každý ** Víte ale, že lze útočit třeba i na Bluetooth? ** Navštívil jsem hackery z brněnského FITu

Jakub Čížek | 1

Vyzkoušeli jsme eObčanku a přihlásili se s ní na weby úřadů. Vážně to funguje!

Vyzkoušeli jsme eObčanku a přihlásili se s ní na weby úřadů. Vážně to funguje!

** Máme eObčanku, máme čtečku, vyzkoušeli jsme přihlášení na weby úřadů. ** Objevily se drobné problémy, podařilo se nám je vyřešit. ** Používání eObčanky pro online identifikaci je velmi pohodlné.

Marek Lutonský | 35


Aktuální číslo časopisu Computer

Jak vytvořit a spravovat vlastní web

Velký test herních klávesnic a DVB-T2 tunerů

Vše o formátu RAW

Vybíráme nejlepší základní desku