Показать сообщение отдельно
  #18  
Старый 27.01.2012, 22:59
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 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 в.д.
Ответить с цитированием