欧以前用过的一个控制声音的类:
{ *********************************************************************** }
{ }
{ 声音控制类 }
{ }
{ 实现 wave、linein、cd 等设备的声音读取、设置 }
{ }
{ 设计:Lsuper 2003.06.15 }
{ }
{ Copyright (c) 1998-2003 Super Studio }
{ }
{ *********************************************************************** }
unit VolCtrl;
interface
uses
SysUtils, MMSystem;
type
{ 设备的类型 }
TDeviceType = (dvCD, dvLineIn, dvMidi, dvWave);
{ 声音 }
TVolumeType = record
case Integer of
0: (LongVolume: Longint);
1: (LeftVolume, RightVolume: Word);
end;
{ 声音控制类 }
TVolControl = class(TObject)
private
{ Private declarations }
FDevicetype: TDeviceType;
FDevice: Integer;
function GetVolume: Byte;
procedure SetVolume(Volume: Byte);
procedure SetDeviceType(Value: TDeviceType);
protected
{ Protected declarations }
procedure VolumeInit;
public
{ Public declarations }
constructor Create;
published
{ Published declarations }
property DeviceType: TDeviceType read FDeviceType write SetDeviceType;
property Volume: Byte read GetVolume write SetVolume stored False;
end;
implementation
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2003.06.15
//功能: 初始化
//参数:
////////////////////////////////////////////////////////////////////////////////
constructor TVolControl.Create;
begin
FDeviceType := dvCd;
VolumeInit;
end;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2003.06.15
//功能: 设置设备类型
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TVolControl.SetDeviceType(Value: TDeviceType);
begin
if FDeviceType <> Value then
begin
FDeviceType := Value;
VolumeInit;
end;
end;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2003.06.15
//功能: 设置声音
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TVolControl.SetVolume(Volume: Byte);
var
Vol: TVolumeType;
begin
Vol.LeftVolume := Volume shl 8;
Vol.RightVolume := Vol.LeftVolume;
case FDeviceType of
dvCD..dvLineIn:
auxSetVolume(FDevice, Vol.LongVolume);
dvMidi:
midiOutSetVolume(FDevice, Vol.LongVolume);
dvWave:
waveOutSetVolume(FDevice, Vol.LongVolume);
end;
end;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2003.06.15
//功能: 读取声音
//参数:
////////////////////////////////////////////////////////////////////////////////
function TVolControl.GetVolume: Byte;
var
Vol: TVolumeType;
begin
Vol.LongVolume := 0;
case FDeviceType of
dvCD..dvLineIn:
auxGetVolume(FDevice, @Vol.LongVolume);
dvMidi:
midiOutGetVolume(FDevice, @Vol.LongVolume);
dvWave:
waveOutGetVolume(FDevice, @Vol.LongVolume);
end;
GetVolume := (Vol.LeftVolume + Vol.RightVolume) shr 9;
end;
////////////////////////////////////////////////////////////////////////////////
//设计: Lsuper 2003.06.15
//功能: 初始化所有声音控制
//参数:
////////////////////////////////////////////////////////////////////////////////
procedure TVolControl.VolumeInit;
var
AuxCaps: TAuxCaps;
WaveOutCaps: TWaveOutCaps;
MidiOutCaps: TMidiOutCaps;
I: Integer;
begin
FDevice := -1;
case FDeviceType of
dvCD: for I := 0 to auxGetNumDevs - 1do
begin
auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));
if ((AuxCaps.dwSupport and AUXCAPS_VOLUME) <> 0) and
((AuxCaps.wTechnology and AUXCAPS_CDAUDIO <> 0)) then
begin
FDevice := I;
Break;
end;
end;
dvLineIn: for I := 0 to auxGetNumDevs - 1do
begin
auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));
if ((AuxCaps.dwSupport and AUXCAPS_VOLUME) <> 0) and
((AuxCaps.wTechnology and AUXCAPS_AUXIN <> 0)) then
begin
FDevice := I;
Break;
end;
end;
dvWave: for I := 0 to waveOutGetNumDevs - 1do
begin
waveOutGetDevCaps(I, @WaveOutCaps, SizeOf(WaveOutCaps));
if (WaveOutCaps.dwSupport and WAVECAPS_VOLUME) <> 0 then
begin
FDevice := I;
Break;
end;
end;
dvMidi: for I := 0 to midiOutGetNumDevs - 1do
begin
MidiOutGetDevCaps(I, @MidiOutCaps, SizeOf(MidiOutCaps));
if (MidiOutCaps.dwSupport and MIDICAPS_VOLUME) <> 0 then
begin
FDevice := I;
Break;
end;
end;
end;
end;
end.