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

Delphi 聲音裝置偵測與音量控制完整指南

     編輯:Delphi

概述

開發多媒體播放器時,偵測聲音裝置是否存在以及精確控制音量是基本功能。本文整理使用 mmsystem 單元(Windows Multimedia API)實現聲卡偵測、波形輸出音量調整、輔助音訊裝置音量讀寫的完整範例。

1. 偵測波形輸出裝置

使用 WaveOutGetNumDevs 判斷系統是否至少有一個波形輸出裝置。

uses mmsystem;

function HasWaveOutDevice: Boolean;
begin
  Result := WaveOutGetNumDevs > 0;
end;

2. 偵測輔助音訊裝置

在表單建立時呼叫 auxGetNumDevs,若傳回 0 表示無輔助裝置。

procedure TForm1.FormCreate(Sender: TObject);
var
  DevCount: Integer;
begin
  DevCount := auxGetNumDevs;
  if DevCount <= 0 then
    Label1.Caption := '系統未偵測到聲卡裝置';
end;

3. 控制波形輸出音量

利用 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;

4. 讀寫輔助裝置音量並還原

完整範例展示啟動時備份所有輔助裝置目前音量,設定為低音量,關閉時還原使用者原始設定。

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.

注意事項

  • 所有 API 需在 uses 加入 mmsystem。
  • 裝置索引從 0 開始,實際數量以 GetNumDevs 系列函數傳回為準。
  • 音量參數為 DWORD,請注意位元運算組合左右聲道。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved