開發多媒體播放器時,需獨立控制左/右聲道音量。Windows Multimedia API waveOutSetVolume 以 32 位元整數編碼雙聲道:低 16 位 = 左聲道,高 16 位 = 右聲道,各聲道範圍 0~65535 (0x0000~0xFFFF)。
TTrackBar:TrackBar1 (左聲道)、TrackBar2 (右聲道)。Min := 0、Max := 65535、Frequency := 1000 (刻度間距)。OnChange 共用同一事件處理函式。uses MMSystem;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
Volume: DWORD;
begin
{ 組合雙聲道:高字組=右聲道,低字組=左聲道 }
Volume := (DWORD(TrackBar2.Position) shl 16) or DWORD(TrackBar1.Position);
waveOutSetVolume(0, Volume); { 0 = 預設波形輸出裝置 }
end;
waveOutSetVolume(uDeviceID, dwVolume):uDeviceID=0 代表系統預設播放裝置;dwVolume 為雙聲道合成值。IAudioEndpointVolume (Vista+ Core Audio API)。waveOutGetNumDevs 取得裝置數,waveOutGetDevCaps 取得名稱,供使用者選擇特定輸出裝置。procedure TForm1.FormCreate(Sender: TObject);
var
Vol: DWORD;
begin
waveOutGetVolume(0, @Vol);
TrackBar1.Position := Vol and $FFFF; { 左聲道 }
TrackBar2.Position := (Vol shr 16) and $FFFF; { 右聲道 }
end;
以 TTrackBar 搭配 waveOutSetVolume 實現雙聲道獨立音量控制,代碼簡潔且即時生效。理解 32 位元雙聲道編碼格式,對後續學習 Core Audio API、音訊串流處理大有裨益。