開發多媒體播放器時,偵測聲音裝置是否存在以及精確控制音量是基本功能。本文整理使用 mmsystem 單元(Windows Multimedia API)實現聲卡偵測、波形輸出音量調整、輔助音訊裝置音量讀寫的完整範例。
使用 WaveOutGetNumDevs 判斷系統是否至少有一個波形輸出裝置。
uses mmsystem;
function HasWaveOutDevice: Boolean;
begin
Result := WaveOutGetNumDevs > 0;
end;
在表單建立時呼叫 auxGetNumDevs,若傳回 0 表示無輔助裝置。
procedure TForm1.FormCreate(Sender: TObject);
var
DevCount: Integer;
begin
DevCount := auxGetNumDevs;
if DevCount <= 0 then
Label1.Caption := '系統未偵測到聲卡裝置';
end;
利用 waveOutSetVolume 設定左右聲道音量。參數為 32 位元整數,高 16 位為右聲道,低 16 位為左聲道,範圍 0~65535。範例使用兩個 TTrackBar (Max=65535) 分別控制左右聲道。
procedure TForm1.TrackBarChange(Sender: TObject);
var
Vol: DWORD;
begin
// 合成左右聲道音量參數
Vol := (TrackBar2.Position shl 16) or TrackBar1.Position;
waveOutSetVolume(0, Vol); // 裝置 ID 0 為預設裝置
end;
完整範例展示啟動時備份所有輔助裝置目前音量,設定為低音量,關閉時還原使用者原始設定。
unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, mmsystem;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
OldVolumes: array[0..10] of DWORD;
public
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var
Count, i: Integer;
begin
Count := auxGetNumDevs;
for i := 0 to Count - 1 do
begin
auxGetVolume(i, @OldVolumes[i]); // 備份原始音量
// 設定極低音量 (左右聲道皆為 9000)
auxSetVolume(i, (9000 shl 16) or 9000);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Count, i: Integer;
begin
Count := auxGetNumDevs;
for i := 0 to Count - 1 do
auxSetVolume(i, OldVolumes[i]); // 還原音量
end;
end.
uses 加入 mmsystem。GetNumDevs 系列函數傳回為準。