在多音頻設備環境下(如同時擁有內建聲卡、USB 耳機、HDMI 輸出),讓使用者選擇輸出設備是播放器的基本功能。Bass.dll 提供 BASS_GetDeviceInfo 遍歷系統音頻設備。本文示範 Delphi 實現,並特別說明 Delphi 2009+ Unicode 版本中 BASS_DEVICEINFO 結構體的修正要點。
Delphi 2009 起預設字串為 Unicode,原 bass.pas 中 BASS_DEVICEINFO 定義為 PChar 會導致設備名稱顯示亂碼。需修改為 PAnsiChar:
{原定義}
BASS_DEVICEINFO = record
name: PChar; // description
driver: PChar; // driver
flags: DWORD;
end;
{修正為}
BASS_DEVICEINFO = record
name: PAnsiChar; // description
driver: PAnsiChar; // driver
flags: DWORD;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if HiWord(BASS_GetVersion) <> BASSVERSION then
MessageBox(0, 'Bass.dll 版本不符!', nil, MB_ICONERROR);
ListBox1.Align := alTop;
Button1.Caption := '獲取當前音頻輸出設備列表';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
info: BASS_DEVICEINFO;
i: Integer;
begin
i := 1; {設備索引從 1 開始}
while BASS_GetDeviceInfo(i, info) do begin
{info.name 為 PAnsiChar,轉為 UnicodeString 顯示}
ListBox1.Items.Add(string(info.name));
Inc(i);
end;
end;
點擊按鈕後,ListBox 列出所有可用音頻輸出設備描述(如「Realtek High Definition Audio」、「USB Audio Device」等)。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
{ ... 完整實現代碼 ... }
end.
獲取設備列表後,可將使用者選擇的索引傳給 BASS_Init:
var
deviceIndex: Integer;
begin
deviceIndex := ListBox1.ItemIndex + 1; {ItemIndex 從 0 開始}
if not BASS_Init(deviceIndex, 44100, 0, 0, nil) then
ShowMessage('指定設備初始化失敗');
end;
| 旗標 | 含義 |
|---|---|
| BASS_DEVICE_ENABLED | 設備啟用 |
| BASS_DEVICE_DEFAULT | 系統預設設備 |
| BASS_DEVICE_INIT | 設備已初始化 |
| BASS_DEVICE_TYPE_MASK | 設備類型掩碼(結合 BASS_DEVICE_TYPE_* 判斷) |
修正 BASS_DEVICEINFO 結構體為 PAnsiChar 是 Delphi Unicode 版本使用 Bass.dll 的關鍵細節。配合 BASS_GetDeviceInfo 遍歷,即可輕鬆實現音頻設備選擇功能。