在音頻播放開發中,往往需要在播放到達特定位置(如開頭、中點、結尾)時觸發特定邏輯。Bass.dll 提供的同步回調機制(BASS_ChannelSetSync)恰好能滿足此需求。本文示範如何在 Delphi 中註冊多個同步回調,分別在播放開始、中點、結束時更新介面提示。
{播放開始回調}
procedure MySync1(handle: HSYNC; channel, data, user: DWORD); stdcall;
begin
Form1.Caption := '開始播放了';
end;
{播放到中點回調}
procedure MySync2(handle: HSYNC; channel, data, user: DWORD); stdcall;
begin
Form1.Caption := '已過中點';
{若需在此處循環播放,可取消註釋下行}
// BASS_ChannelPlay(channel, True);
end;
{播放結束回調}
procedure MySync3(handle: HSYNC; channel, data, user: DWORD); stdcall;
begin
Form1.Caption := '播放完畢';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Mp3Path: AnsiString;
Mp3Len: Cardinal;
begin
BASS_StreamFree(hs);
Timer1.Enabled := False;
OpenDialog1.Filter := 'Mp3 文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*wav';
if OpenDialog1.Execute then
Mp3Path := AnsiString(OpenDialog1.FileName);
hs := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, 0);
if hs < BASS_ERROR_ENDED then
Caption := '打開失敗'
else begin
Caption := string(Mp3Path);
Mp3Len := BASS_ChannelGetLength(hs, BASS_POS_BYTE);
TrackBar1.Max := Mp3Len;
{註冊三個同步回調}
BASS_ChannelSetSync(hs, BASS_SYNC_POS, 0, @MySync1, nil); // 位置 0:開始
BASS_ChannelSetSync(hs, BASS_SYNC_POS, Mp3Len div 2, @MySync2, nil); // 中點
BASS_ChannelSetSync(hs, BASS_SYNC_END, 0, @MySync3, nil); // 結束
{也可用 BASS_SYNC_POS 指定總長度作為結束點}
// BASS_ChannelSetSync(hs, BASS_SYNC_POS, Mp3Len, @MySync3, nil);
{設定僅觸發一次}
BASS_ChannelSetSync(hs, BASS_SYNC_END or BASS_SYNC_ONETIME, 0, @MySync3, nil);
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if BASS_ChannelIsActive(hs) = BASS_ACTIVE_PLAYING then
TrackBar1.Position := BASS_ChannelGetPosition(hs, BASS_POS_BYTE);
end;
程式啟動後,點選「開啟」載入音樂,點選「播放」。視窗標題列會依序顯示「開始播放了」→「已過中點」→「播放完畢」,直觀展示回調觸發時機。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
TrackBar1: TTrackBar;
Timer1: TTimer;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
var
hs: HSTREAM;
{回調函數定義 ...}
{事件處理代碼 ...}
end.
同步回調不僅限於介面提示,還可用於:
掌握 BASS_ChannelSetSync 的各類同步類型與旗標組合,能讓 Delphi 開發者精準控制音頻播放流程,實現豐富的互動功能。