在開發穩健的音頻播放器時,實時掌握播放流的當前狀態至關重要。Bass.dll 提供 BASS_ChannelIsActive 函數,可精確區分停止、播放、暫停、失速四種狀態。本文展示如何在 Delphi 中利用計時器輪詢並顯示狀態。
| 常量 | 數值 | 含義 |
|---|---|---|
| BASS_ACTIVE_STOPPED | 0 | 停止狀態(未播放或播放結束) |
| BASS_ACTIVE_PLAYING | 1 | 正在播放 |
| BASS_ACTIVE_STALLED | 2 | 失速狀態(緩衝中,等待數據) |
| BASS_ACTIVE_PAUSED | 3 | 暫停狀態 |
procedure TForm1.Timer1Timer(Sender: TObject);
var
str: string;
begin
if hs = 0 then Exit; {流未建立時退出}
case BASS_ChannelIsActive(hs) of
BASS_ACTIVE_STOPPED: str := '停止狀態';
BASS_ACTIVE_PLAYING: str := '正在播放';
BASS_ACTIVE_STALLED: str := '失速狀態, 正在等待數據';
BASS_ACTIVE_PAUSED: str := '暫停狀態';
end;
Caption := str; {顯示於視窗標題}
end;
procedure TForm1.Button2Click(Sender: TObject); {播放}
begin
BASS_ChannelPlay(hs, False);
end;
procedure TForm1.Button3Click(Sender: TObject); {暫停}
begin
BASS_ChannelPause(hs);
end;
procedure TForm1.Button4Click(Sender: TObject); {停止}
begin
BASS_ChannelStop(hs);
end;
hs := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, 0);
{若需直接循環播放,可在建立流時加入 BASS_SAMPLE_LOOP 旗標}
{hs := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, BASS_SAMPLE_LOOP);}
視窗標題會隨著播放、暫停、停止操作即時切換顯示對應狀態文字。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
var
hs: HSTREAM;
{ ... 完整實現代碼 ... }
end.
BASS_ACTIVE_STOPPED 且非使用者主動停止時,觸發播放列表下一首。BASS_ACTIVE_STALLED 可觸發「緩衝中...」動畫。BASS_ChannelPlay。BASS_ChannelIsActive 是輕量級的狀態查詢 API,配合計時器輪詢即可構建完整的播放狀態機,是播放器核心邏輯不可或缺的一環。