217 lines
5.3 KiB
ObjectPascal

unit uMixer;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ComCtrls,
ExtCtrls, StdCtrls,GraphType, ACS_Mixer, ACS_Converters;
type
{ TfMixer }
TfMixer = class(TForm)
cbDevice: TComboBox;
lDevice: TLabel;
Label3: TLabel;
Mixer: TACSMixer;
Timer: TTimer;
TopPanel: TPanel;
procedure MuteChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure ChannelChange(Sender: TObject);
procedure BalanceChange(Sender: TObject);
procedure cbDeviceChange(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
Channels : array of TTrackBar;
Balance : array of TTrackBar;
Muting : array of TCheckBox;
end;
var
fMixer: TfMixer;
implementation
{ TfMixer }
procedure TfMixer.FormCreate(Sender: TObject);
var
i : Integer;
begin
cbDevice.Items.Clear;
for i := 0 to Mixer.DevCount-1 do
begin
Mixer.DevNum := i;
cbDevice.Items.Add(Mixer.MixerName);
end;
cbDevice.ItemIndex := 0;
end;
procedure TfMixer.MuteChange(Sender: TObject);
var
i : Integer;
begin
for i := 0 to length(Muting)-1 do
if Sender = Muting[i] then
begin
Mixer.Mute[i] := TCheckBox(Sender).Checked;
end;
end;
procedure TfMixer.FormHide(Sender: TObject);
begin
Timer.Enabled := False;
end;
procedure TfMixer.FormShow(Sender: TObject);
begin
cbDeviceChange(nil);
end;
procedure TfMixer.TimerTimer(Sender: TObject);
var
i : Integer;
begin
{ for i := 0 to length(Channels)-1 do
begin
if Mixer.IsStereo(i) then
Channels[i].Position := 255-Mixer.Level[i].Left
else
Channels[i].Position := 255-Mixer.Level[i].Main;
end;}
end;
procedure TfMixer.ChannelChange(Sender: TObject);
var
i,tmp : Integer;
outp : TACSMixerLevel;
begin
for i := 0 to length(Channels)-1 do
if Sender = Channels[i] then
begin
if Mixer.IsStereo(i) then
begin
tmp := -Balance[i].Position;
if tmp < 0 then tmp := 0;
tmp := round(((tmp*255)/255)+(255-Channels[i].Position));
if tmp > 255 then
tmp := 255;
Outp.Left := tmp;
tmp := Balance[i].Position;
if tmp < 0 then tmp := 0;
tmp := round(((tmp*255)/255)+(255-Channels[i].Position));
if tmp > 255 then
tmp := 255;
Outp.Right := tmp;
end
else
Outp.Main := Channels[i].Position-255;
Mixer.Level[i] := Outp;
end;
end;
procedure TfMixer.BalanceChange(Sender: TObject);
var
i : Integer;
begin
for i := 0 to length(Channels)-1 do
begin
if Mixer.IsStereo(i) then
Channels[i].Position := 255-Mixer.Level[i].Left
else
Channels[i].Position := 255-Mixer.Level[i].Main;
end;
end;
procedure TfMixer.cbDeviceChange(Sender: TObject);
var
i : Integer;
aComp : TControl;
newPanel : TPanel;
newTrackbar : TTrackbar;
newBevel : TBevel;
newCheckbox : TCheckbox;
newLabel : TLabel;
begin
setlength(Channels,0);
setlength(Balance,0);
setlength(Muting,0);
while fMixer.ControlCount > 1 do
begin
aComp := fMixer.Controls[1];
fMixer.RemoveControl(aComp);
aComp.Free;
end;
for i := 0 to Mixer.ChannelCount-1 do
begin
newPanel := TPanel.Create(nil);
newPanel.Parent := fMixer;
newPanel.Align := alLeft;
newPanel.Width := 80;
newPanel.BevelOuter := bvNone;
newLabel := TLabel.Create(nil);
newLabel.Parent := newPanel;
newLabel.Align := alTop;
newLabel.Alignment := taCenter;
newLabel.Caption := Mixer.ChannelName[i];
newLabel.Height := 30;
newBevel := TBevel.Create(nil);
newBevel.Parent := newPanel;
newBevel.Shape := bsLeftLine;
newBevel.Width := 1;
newBevel.Align := alRight;
newTrackbar := TTrackbar.Create(nil);
newTrackbar.Parent := NewPanel;
newTrackbar.Align := alClient;
newTrackBar.Orientation := trVertical;
newTrackbar.Max := 255;
newTrackbar.Min := 0;
setlength(Channels,i+1);
Channels[i] := newTrackBar;
newTrackBar.OnChange := @ChannelChange;
setlength(Balance,i+1);
Balance[i] := nil;
if Mixer.IsStereo(i) then
begin
newTrackbar := TTrackbar.Create(nil);
newTrackbar.Parent := NewPanel;
newTrackbar.Align := alTop;
newTrackBar.Orientation := trHorizontal;
newTrackBar.Height := 15;
newTrackbar.Max := 100;
newTrackbar.Min := -100;
newTrackBar.Position := 0;
Balance[i] := newTrackBar;
Balance[i].Max := 40;
Channels[i].Position := 255-Mixer.Level[i].Left;
end
else
Channels[i].Position := 255-Mixer.Level[i].Main;
newCheckBox := TCheckBox.Create(nil);
newCheckBox.Parent := newPanel;
newCheckBox.Caption := 'Mute';
newCheckBox.Align := alBottom;
newCheckBox.Checked := Mixer.Mute[i];
newCheckBox.OnChange := @MuteChange;
setlength(Muting,i+1);
Muting[i] := newCheckBox;
end;
Timer.Enabled := True;
Width := Mixer.ChannelCount*80;
end;
initialization
{$I umixer.lrs}
end.