196 lines
6.1 KiB
ObjectPascal
196 lines
6.1 KiB
ObjectPascal
unit Unit1;
|
|
{========================================================================
|
|
Plugin Delphi Demo (translated from C PluginDemo Copyright by Ian Luck)
|
|
by (Chris Troesken)(cst-tech@foni.net)http:www.cst-development.de
|
|
|
|
|
|
Plugin Demo the shows how to get the Info about the supported loaded Plugins
|
|
* Requires: BASS.DLL available @ www.un4seen.com
|
|
========================================================================}
|
|
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
|
bass, ExtCtrls, StdCtrls, ComCtrls, Dialogs;
|
|
|
|
type
|
|
TForm1 = class(TForm)
|
|
Panel1: TPanel;
|
|
GroupBox1: TGroupBox;
|
|
Button1: TButton;
|
|
open1: TOpenDialog;
|
|
lblInfo: TLabel;
|
|
ListView_PlugIns: TListView;
|
|
Timer1: TTimer;
|
|
ScrollBar1: TScrollBar;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure Button1Click(Sender: TObject);
|
|
procedure Timer1Timer(Sender: TObject);
|
|
procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
|
|
var ScrollPos: Integer);
|
|
private
|
|
{ Private-Deklarationen }
|
|
Sliding: boolean;
|
|
procedure Error(const Text: string);
|
|
function GetCTypeString(ctype: DWORD; plugin: HPLUGIN): string;
|
|
public
|
|
{ Public-Deklarationen }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
Chan: HStream;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
function ProgDir: string;
|
|
begin
|
|
result := ExtractFilePath(ParamStr(0));
|
|
end;
|
|
|
|
function TForm1.GetCTypeString(ctype: DWORD; plugin: HPLUGIN): string;
|
|
var
|
|
pInfo: ^BASS_PLUGININFO;
|
|
a: integer;
|
|
begin
|
|
if plugin <> 0 then
|
|
begin
|
|
// pInfo := BASS_PluginGetInfo(plugin);
|
|
pInfo := pointer(BASS_PluginGetInfo(plugin));
|
|
for a := 0 to PInfo.formatc - 1 do
|
|
if pInfo.Formats[a].ctype = cType then
|
|
Result := pInfo.Formats[a].name;
|
|
end;
|
|
// check built-in stream formats...
|
|
case cType of
|
|
BASS_CTYPE_STREAM_OGG: Result := Result + '"Ogg Vorbis"';
|
|
BASS_CTYPE_STREAM_MP1: Result := Result + '"MPEG layer 1"';
|
|
BASS_CTYPE_STREAM_MP2: Result := Result + '"MPEG layer 2"';
|
|
BASS_CTYPE_STREAM_MP3: Result := Result + '"MPEG layer 3"';
|
|
BASS_CTYPE_STREAM_AIFF: Result := Result + '"Audio IFF"';
|
|
BASS_CTYPE_STREAM_WAV_PCM: Result := Result + '"PCM WAVE"';
|
|
BASS_CTYPE_STREAM_WAV_FLOAT: Result := Result + '"Floating-point WAVE"';
|
|
BASS_CTYPE_STREAM_WAV: Result := Result + '"Wave"';
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.Error(const Text: string);
|
|
begin
|
|
MessageBox(Handle, PChar(Text + ' Errorcode = ' +
|
|
inttostr(Bass_ErrorGetCode)), PChar('Error'), 16);
|
|
end;
|
|
|
|
procedure TForm1.FormCreate(Sender: TObject);
|
|
var
|
|
fd: TWin32FindData;
|
|
fh: THandle;
|
|
plug: HPLUGIN;
|
|
Info: ^Bass_PluginInfo;
|
|
s: string;
|
|
a: integer;
|
|
ListItem: TListItem;
|
|
begin
|
|
if not Bass_Init(-1, 44100, 0, handle, nil) then
|
|
begin
|
|
Error('Can''t initialize device');
|
|
Application.Terminate;
|
|
end;
|
|
// Set The OpenDialog Filter to the Bass build In Formats
|
|
Open1.Filter :=
|
|
'BASS built-in *.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif)\0*.mp3;*.mp2;*.mp1;*.ogg;*.wav;*.aif' + '|'
|
|
+ '*.mp3;*.mp2;*.mp1;*.ogg;*.wav*;*.aif';
|
|
|
|
// get the Modules from the currentDirectory
|
|
fh := FindFirstFile(PChar(ProgDir + 'bass*.dll'), fd);
|
|
if (fh <> INVALID_HANDLE_VALUE) then
|
|
try
|
|
repeat
|
|
plug := BASS_PluginLoad(fd.cFileName, 0 {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
|
|
if Plug <> 0 then
|
|
begin
|
|
// Info := BASS_PluginGetInfo(Plug); // get plugin info to add to the file selector filter...
|
|
Info := pointer(BASS_PluginGetInfo(Plug)); // get plugin info to add to the file selector filter...
|
|
for a := 0 to Info.formatc - 1 do
|
|
begin
|
|
// Set The OpenDialog additional, to the supported PlugIn Formats
|
|
open1.Filter := Open1.Filter + '|' + Info.Formats[a].name + ' ' + '(' +
|
|
Info.Formats[a].exts + ') , ' + fd.cFileName + '|' + Info.Formats[a].exts;
|
|
// Lets Show in the Listview the supported Formats
|
|
|
|
if (Info.Formats[a].name <> nil) then
|
|
if (a = 0) then
|
|
s :=Info.Formats[a].name
|
|
else
|
|
s := s + ',' + Info.Formats[a].name;
|
|
end;
|
|
ListItem := ListView_PlugIns.Items.Add;
|
|
ListItem.Caption := fd.cFileName;
|
|
ListItem.SubItems.Add(s);
|
|
end;
|
|
until FindNextFile(fh, fd) = false;
|
|
finally
|
|
Windows.FindClose(fh);
|
|
end;
|
|
|
|
if Listview_PlugIns.Items.Count = 0 then
|
|
begin
|
|
ListItem := ListView_PlugIns.Items.Add;
|
|
ListItem.SubItems.Add('no plugins found - visit the BASS webpage to get some');
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.FormDestroy(Sender: TObject);
|
|
begin
|
|
Bass_Free();
|
|
BASS_PluginFree(0);
|
|
end;
|
|
|
|
procedure TForm1.Button1Click(Sender: TObject);
|
|
var
|
|
Info: Bass_ChannelInfo;
|
|
begin
|
|
if open1.Execute then
|
|
begin
|
|
Timer1.Enabled := false;
|
|
Bass_StreamFree(Chan);
|
|
Chan := Bass_StreamCreateFile(false, PChar(open1.FileName), 0, 0, BASS_SAMPLE_LOOP {$IFDEF UNICODE} or BASS_UNICODE {$ENDIF});
|
|
if CHan <> 0 then
|
|
begin
|
|
BASS_ChannelGetInfo(chan, info);
|
|
Button1.Caption := open1.FileName;
|
|
lblInfo.Caption := 'channel type = ' + inttostr(info.ctype) + ' ' +
|
|
getCTypeString(info.ctype, info.plugin);
|
|
Scrollbar1.Max := round(BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetLength(chan, BASS_POS_BYTE)));
|
|
Bass_ChannelPlay(Chan, false);
|
|
Timer1.Enabled := true;
|
|
|
|
end
|
|
else
|
|
begin
|
|
Button1.Caption := 'Click here to open a file';
|
|
Error('Can''t play the file');
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TForm1.Timer1Timer(Sender: TObject);
|
|
begin
|
|
if not Sliding then
|
|
Scrollbar1.Position := round(BASS_ChannelBytes2Seconds(chan, BASS_ChannelGetPosition(chan, BASS_POS_BYTE)));
|
|
end;
|
|
|
|
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
|
|
var ScrollPos: Integer);
|
|
begin
|
|
Sliding := Scrollcode <> scEndScroll;
|
|
if ScrollCode = scEndScroll then
|
|
BASS_ChannelSetPosition(chan, BASS_ChannelSeconds2Bytes(chan, Scrollbar1.position), BASS_POS_BYTE);
|
|
end;
|
|
|
|
end.
|
|
|