27.01.2012, 22:59
|
|
.
|
|
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
|
|
Самый простой вариант, без использования CallBack-а:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, bass, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
procedure FreeStream;
procedure PlayStream;
procedure Play;
function LoadStream(FileName : String) : Boolean;
end;
var
Form1 : TForm1;
Channel : HSTREAM;
Volume,
FadeTimer : Integer;
PlaySync : HSYNC;
Dir : String;
Timer : DWORD;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if BASS_Init(-1, 44100, 0, Handle, NIL) = False then
ShowMessage('Ошибка');
GetDir(0, Dir);
Channel := 0;
FadeTimer := 3000;
Volume := 100;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
BASS_Free;
end;
procedure TForm1.FreeStream;
begin
if BASS_ChannelIsActive(Channel) = BASS_ACTIVE_PLAYING then
BASS_ChannelSlideAttribute(Channel, BASS_ATTRIB_VOL, 0, FadeTimer);
while BASS_ChannelIsSliding(Channel, BASS_ATTRIB_VOL) do
Sleep(1);
BASS_ChannelStop(Channel);
// если канал воспроизводится, тормозим его
BASS_StreamFree(Channel);
// высвобождаем память
Channel := 0;
end;
procedure TForm1.PlayStream;
begin
case BASS_ChannelIsActive(Channel) of
BASS_ACTIVE_STOPPED :
begin
Play;
end;
end;
end;
procedure TForm1.Play; //функция воспроизведения канала давно загруженного в память
begin
BASS_ChannelSetAttribute(Channel, BASS_ATTRIB_VOL, 0);
BASS_ChannelPlay(Channel, False);
BASS_ChannelSlideAttribute(Channel, BASS_ATTRIB_VOL, Volume / 100, FadeTimer);
end;
function TForm1.LoadStream(FileName : String) : Boolean;
var
Time : DWORD;
begin
if Channel <> 0 then
FreeStream;
Channel := BASS_StreamCreateFile(False, PChar(FileName), 0, 0, 0);
Time := Trunc(BASS_ChannelBytes2Seconds(Channel, BASS_ChannelGetLength(Channel, BASS_POS_BYTE)));
Result := Channel <> 0;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
if LoadStream(Dir + '\First.mp3') then
PlayStream;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
if LoadStream(Dir + '\Second.mp3') then
PlayStream;
end;
end.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
|