首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 應用 Bass.dll 同步回調監聽播放關鍵節點

     編輯:Delphi

前言

在音頻播放開發中,往往需要在播放到達特定位置(如開頭、中點、結尾)時觸發特定邏輯。Bass.dll 提供的同步回調機制(BASS_ChannelSetSync)恰好能滿足此需求。本文示範如何在 Delphi 中註冊多個同步回調,分別在播放開始、中點、結束時更新介面提示。

核心概念:同步類型與參數

  • BASS_SYNC_POS:在指定字節位置觸發。
  • BASS_SYNC_END:播放結束時觸發。
  • BASS_SYNC_ONETIME:標誌位,使回調僅執行一次(預設會在循環播放時重複觸發)。

關鍵代碼實現

1. 定義回調函數

{播放開始回調}
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;

2. 開啟檔案並註冊同步

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;

3. 計時器更新進度條

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 開發者精準控制音頻播放流程,實現豐富的互動功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved