音頻播放器常見的「單曲循環」功能,在 Bass.dll 中可通過兩種方式實現:建立流時指定 BASS_SAMPLE_LOOP 旗標,或播放過程中動態切換 BASS_ChannelFlags。本文演示後者,配合 TCheckBox 實現循環模式即時開關。
function BASS_ChannelFlags(handle: DWORD; flags, mask: DWORD): DWORD; stdcall;
flags:要設置的新旗標值。mask:指定哪些位參與修改(僅修改 mask 為 1 的位)。要開啟循環:BASS_ChannelFlags(hs, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP)
要關閉循環:BASS_ChannelFlags(hs, 0, BASS_SAMPLE_LOOP)
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if CheckBox1.Checked then
BASS_ChannelFlags(hs, BASS_SAMPLE_LOOP, BASS_SAMPLE_LOOP) {開啟循環}
else
BASS_ChannelFlags(hs, 0, BASS_SAMPLE_LOOP); {關閉循環}
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;
Button1: TButton;
Button2: TButton;
Button3: TButton;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
var
hs: HSTREAM;
{ ... 完整實現代碼 ... }
end.
BASS_SAMPLE_FLOAT(32-bit 浮點輸出)、BASS_SAMPLE_3D(3D 音效)、BASS_SAMPLE_MONO(強制單聲道)等,均可用 BASS_ChannelFlags 動態調整。BASS_ChannelFlags(hs, 0, 0) 可獲取完整旗標組合,便於介面同步顯示。BASS_ChannelFlags 提供了靈活的運行時屬性修改能力,使「循環播放」等功能無需重建流即可熱切換,大幅簡化播放器邏輯。