166 lines
4.1 KiB
ObjectPascal
166 lines
4.1 KiB
ObjectPascal
|
unit Unit1;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||
|
StdCtrls, Bass;
|
||
|
|
||
|
type
|
||
|
TForm1 = class(TForm)
|
||
|
GroupBox1: TGroupBox;
|
||
|
Button1: TButton;
|
||
|
GroupBox2: TGroupBox;
|
||
|
Button2: TButton;
|
||
|
GroupBox3: TGroupBox;
|
||
|
Button3: TButton;
|
||
|
GroupBox4: TGroupBox;
|
||
|
Button4: TButton;
|
||
|
OpenDialog1: TOpenDialog;
|
||
|
Button5: TButton;
|
||
|
Button6: TButton;
|
||
|
Button7: TButton;
|
||
|
procedure FormCreate(Sender: TObject);
|
||
|
procedure FormDestroy(Sender: TObject);
|
||
|
procedure Button1Click(Sender: TObject);
|
||
|
procedure Button5Click(Sender: TObject);
|
||
|
private
|
||
|
{ Private declarations }
|
||
|
public
|
||
|
{ Public declarations }
|
||
|
end;
|
||
|
|
||
|
var
|
||
|
Form1: TForm1;
|
||
|
|
||
|
flags: array[0..3] of DWORD = (BASS_SPEAKER_FRONT, BASS_SPEAKER_REAR, BASS_SPEAKER_CENLFE, BASS_SPEAKER_REAR2);
|
||
|
chan: array[0..3] of HSTREAM;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
{$R *.dfm}
|
||
|
|
||
|
procedure TForm1.FormCreate(Sender: TObject);
|
||
|
var
|
||
|
i: BASS_INFO;
|
||
|
begin
|
||
|
// check the correct BASS was loaded
|
||
|
if (HIWORD(BASS_GetVersion) <> BASSVERSION) then
|
||
|
begin
|
||
|
MessageBox(0,'An incorrect version of BASS.DLL was loaded',0,MB_ICONERROR);
|
||
|
Halt;
|
||
|
end;
|
||
|
|
||
|
// initialize BASS - default device
|
||
|
if (not BASS_Init(-1, 44100, 0, Handle, nil)) then
|
||
|
begin
|
||
|
MessageBox(0, 'Can''t initialize device', 0, 0);
|
||
|
Halt;
|
||
|
end;
|
||
|
|
||
|
// check how many speakers the device supports
|
||
|
BASS_GetInfo(i);
|
||
|
if (i.speakers < 4) then // no extra speakers detected, enable them anyway?
|
||
|
begin
|
||
|
if (MessageBox(0, 'Do you wish to enable "speaker assignment" anyway?', 'No extra speakers detected', MB_ICONQUESTION or MB_YESNO) = IDYES) then
|
||
|
begin
|
||
|
// reinitialize BASS - forcing speaker assignment
|
||
|
BASS_Free;
|
||
|
if (not BASS_Init(-1, 44100, BASS_DEVICE_SPEAKERS, Handle, nil)) then
|
||
|
begin
|
||
|
MessageBox(0, 'Can''t initialize device', 0, 0);
|
||
|
Halt;
|
||
|
end;
|
||
|
BASS_GetInfo(i); // get info again
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
if (i.speakers < 8) then
|
||
|
begin
|
||
|
Button4.Enabled := False;
|
||
|
Button7.Enabled := False;
|
||
|
end;
|
||
|
if (i.speakers < 6) then
|
||
|
begin
|
||
|
Button3.Enabled := False;
|
||
|
Button6.Enabled := False;
|
||
|
end;
|
||
|
if (i.speakers < 4) then
|
||
|
begin
|
||
|
Button2.Enabled := False;
|
||
|
Button5.Enabled := False;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.FormDestroy(Sender: TObject);
|
||
|
begin
|
||
|
BASS_Free;
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button1Click(Sender: TObject);
|
||
|
var
|
||
|
speaker: Integer;
|
||
|
begin
|
||
|
speaker := TButton(Sender).Tag;
|
||
|
if (not OpenDialog1.Execute) then
|
||
|
Exit;
|
||
|
|
||
|
BASS_StreamFree(chan[speaker]); // free old stream before opening new
|
||
|
chan[speaker] := BASS_StreamCreateFile(False, PChar(OpenDialog1.FileName), 0, 0, flags[speaker] or BASS_SAMPLE_LOOP {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
|
||
|
if (chan[speaker] = 0) then
|
||
|
begin
|
||
|
TButton(Sender).Caption := 'click here to open a file...';
|
||
|
MessageBox(0, 'Can''t play the file', 0, 0);
|
||
|
Exit;
|
||
|
end;
|
||
|
|
||
|
TButton(Sender).Caption := OpenDialog1.FileName;
|
||
|
BASS_ChannelPlay(chan[speaker], False);
|
||
|
end;
|
||
|
|
||
|
procedure TForm1.Button5Click(Sender: TObject);
|
||
|
var
|
||
|
i: BASS_CHANNELINFO;
|
||
|
speaker: Integer;
|
||
|
temp: HSTREAM;
|
||
|
temp1, temp2: String;
|
||
|
begin
|
||
|
speaker := TButton(Sender).Tag;
|
||
|
|
||
|
// swap handles
|
||
|
temp := chan[speaker];
|
||
|
chan[speaker] := chan[speaker+1];
|
||
|
chan[speaker+1] := temp;
|
||
|
|
||
|
// swap text
|
||
|
case speaker of
|
||
|
0: // swap 1 and 2
|
||
|
begin
|
||
|
temp1 := Button1.Caption;
|
||
|
temp2 := Button2.Caption;
|
||
|
Button1.Caption := temp2;
|
||
|
Button2.Caption := temp1;
|
||
|
end;
|
||
|
1: // swap 2 and 3
|
||
|
begin
|
||
|
temp1 := Button2.Caption;
|
||
|
temp2 := Button3.Caption;
|
||
|
Button2.Caption := temp2;
|
||
|
Button3.Caption := temp1;
|
||
|
end;
|
||
|
2: // swap 3 and 4
|
||
|
begin
|
||
|
temp1 := Button3.Caption;
|
||
|
temp2 := Button4.Caption;
|
||
|
Button3.Caption := temp2;
|
||
|
Button4.Caption := temp1;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
// update speaker flags
|
||
|
BASS_ChannelFlags(chan[speaker],flags[speaker],BASS_SPEAKER_FRONT);
|
||
|
BASS_ChannelFlags(chan[speaker+1],flags[speaker+1],BASS_SPEAKER_FRONT);
|
||
|
end;
|
||
|
|
||
|
end.
|