mixerSetControlDetails auxoutsetvolume 是控制CD音量的 waveOutSetVolume 是控制波形的 midiOutSetVolume 是控制FM或者是synthesizerunit Volume; interface uses windows,mmsystem; type Tvolume=record left,right:word; // 取值范围 0--65535 end; procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS); function getpeak(control:PMixerControl;var peak:integer):boolean; function setvolume(control:Pmixercontrol; volume:Tvolume):boolean; function getvolume(control:Pmixercontrol; volume:Tvolume):boolean; var mcontrols:array of array of array of PMixerControl; //mixer的数组,单声卡可以不用 fmixerhandle:HMIXER; //mixer的句柄 implementation procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS); begin Cdetails.cbStruct:=sizeof(cdetails); cdetails.dwControlID:=Control.dwControlID; cdetails.cbDetails:=sizeof(integer); cdetails.hwndOwner:=0; end; function getpeak(control:PMixerControl;var peak:integer):boolean; var details:TMixerControlDetailsSigned; cdetails:tMIXERCONTROLDETAILS; begin Result:=false; if control.dwControlType<> mixercontrol_controltype_peakmeter then exit; cdetails.cChannels:=1; cdetails.paDetails:=@details; fillstruct(control,cdetails); result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0; end; function setvolume(control:Pmixercontrol; volume:Tvolume):boolean; var details:array[0..30] of integer; cdetails:tMIXERCONTROLDETAILS; begin fillstruct(control,cdetails); cdetails.cChannels:=2; cdetails.paDetails:=@details; details[0]:=volume.left; details[1]:=volume.right; result:=mixerSetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0; volume.left:=details[0]; volume.right:=details[1]; end; function getvolume(control:Pmixercontrol; volume:Tvolume):boolean; var details:array[0..30] of integer; cdetails:tMIXERCONTROLDETAILS; begin fillstruct(control,cdetails); cdetails.cChannels:=2; cdetails.paDetails:=@details; result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0; volume.left:=details[0]; volume.right:=details[1]; end; end. // 调用方法: procedure TForm1.Button1Click(Sender: TObject); var s : Tvolume; kz : Pmixercontrol; begin new(kz); //<------------ 此处一定要分配内存 kz.dwControlID := 0; s.left := 0; s.right := 0; try setvolume(kz,s); except end; freemem(kz); end;
//音量控制 procedure TForm1.TrackBar1Change(Sender: TObject); var t,v:Longint; begin // if a=0 then Exit; t:=TrackBar1.Position; v:=(t shl 8)or(t shl 24); waveOutSetVolume(0,v); end;procedure tform1.trackbar1changer (sender:tobject);//左声道 var t,v:longint; begin t:=trackbar1.postion; wavoutgetvolume(0,@v); v:=v and $ffff0000 or (t shl 8); wavoutsetvolume(0,v); end;procedure tform1.trackbar2changer (sender:tobject);//右声道 var t,v:longint; begin t:=trackbar2.postion; wavoutgetvolume(0,@v); v:=v and $0000ffff or (t shl 24); wavoutsetvolume(0,v); end;//获得当前音量值 procedure TForm1.FormCreate(Sender: TObject); var v:longint; begin waveOutGetVolume(0,@v); TrackBar2.Position:=hi(v); TrackBar3.Position:=hi(v shr 16); if hi(v)>hi(v shr 16) then TrackBar1.Position:=hi(v) else TrackBar1.Position:=hi(v shr 16); end;end. 函数说明:waveOutSetVolume 第一个参数是波形文件输出设备标识符; 第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量, 高16位表示右声道的音量。waveOutGetVolume 第一个参数是波形文件输出设备标识符; 第二个参数是一个32位整数的指针。
有相应的API函数可查(声音相关)
waveInAddBuffer 向声音输入设备发送缓冲区
waveInClose 关闭声音输入设备
waveInGetDevCaps 获取声音输入设备性能
waveInGetErrorText 获取声音出错的信息文本
waveInGetID 获取声音输入设备ID
waveInGetNumDevs 返回声音输入设备数量
waveInGetPosition 获取声音设备输入位置
waveInMessage 向声音输入设备发送信息
waveInOpen 打开声音输入设备
waveInPrepareHeader 预备声音输入缓冲区
waveInReset 停止声音输入设备工作
waveInStart 停止声音输入设备工作
waveInStop 停止声音输入
waveInUnprepareHeader 清除预备的声音文件头
waveOutBreakLoop 中断声音输出循环
waveOutClose 关闭声音输出设备
waveOutGetDevCaps 获取声音输出设备性能
waveOutGetErrorText 获取声音出错文本
waveOutGetID 获取声音输出设备ID
waveOutGetNumDevs 获取声音输出设备数量
waveOutGetPitch 获取声音输出的强度
waveOutGetPlaybackRate 获取声音回放率
waveOutGetPosition 获取声音回放位置
waveOutGetVolume 获取声音音量
waveOutMessage 向声音输出设备发送消息
waveOutOpen 打开声音输出设备
waveOutPause 暂停声音回放
waveOutPrepareHeader 预备声音回放数据块
waveOutReset 停止声音回放
waveOutRestart 重开始声音回放
waveOutSetPitch 设置波形输出强度
waveOutSetPlaybackRate 设置回放率
waveOutSetVolume 设置输出音量
waveOutUnprepareHeader 清除预备声音数据块
waveOutWrite 写入声音输出设备
控制音量要用到waveOutSetVlume函数,此函数的声明在MMSystem.h单元中。
此单放在Delphi目录下的Source\rtl\win中主意这儿用到两个函数waveOutSetVlume和waveOutGetVolume,不要用混,
我第一次用它们时就给搞混了,好费事。程序如下:三个TrackBar的属性设置:Max:=255;Frequency:=16;unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, mmsystem;type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
TrackBar2: TTrackBar;
TrackBar3: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
procedure TrackBar2Change(Sender: TObject);
procedure TrackBar3Change(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}//音量控制
procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin
// if a=0 then Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
waveOutSetVolume(0,v);
end;//左声道控制
procedure TForm1.TrackBar2Change(Sender: TObject);
var
t,v:Longint;
begin
t:=TrackBar2.Position;
waveOutGetVolume(0,@v);
v:=v and $ffff0000 or (t shl 8);
waveOutSetVolume(0,v);
end;//右声道控制
procedure TForm1.TrackBar3Change(Sender: TObject);
var
t,v:Longint;
begin
t:=TrackBar3.Position;
waveOutGetVolume(0,@v);
v:=v and $0000ffff or (t shl 24);
waveOutSetVolume(0,v);
end;//获得当前音量值
procedure TForm1.FormCreate(Sender: TObject);
var
v:longint;
begin
waveOutGetVolume(0,@v);
TrackBar2.Position:=hi(v);
TrackBar3.Position:=hi(v shr 16);
if hi(v)>hi(v shr 16) then
TrackBar1.Position:=hi(v)
else
TrackBar1.Position:=hi(v shr 16);
end;end.
函数说明:waveOutSetVolume
第一个参数是波形文件输出设备标识符;
第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
高16位表示右声道的音量。waveOutGetVolume
第一个参数是波形文件输出设备标识符;
第二个参数是一个32位整数的指针。
留下个妹儿我发给你个控件,有源码
auxoutsetvolume 是控制CD音量的
waveOutSetVolume 是控制波形的
midiOutSetVolume 是控制FM或者是synthesizerunit Volume; interface uses windows,mmsystem; type
Tvolume=record
left,right:word; // 取值范围 0--65535
end; procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS);
function getpeak(control:PMixerControl;var peak:integer):boolean;
function setvolume(control:Pmixercontrol; volume:Tvolume):boolean;
function getvolume(control:Pmixercontrol; volume:Tvolume):boolean; var
mcontrols:array of array of array of PMixerControl; //mixer的数组,单声卡可以不用
fmixerhandle:HMIXER; //mixer的句柄 implementation procedure fillstruct(control:PMixerControl;var Cdetails:tMIXERCONTROLDETAILS);
begin
Cdetails.cbStruct:=sizeof(cdetails);
cdetails.dwControlID:=Control.dwControlID;
cdetails.cbDetails:=sizeof(integer);
cdetails.hwndOwner:=0;
end; function getpeak(control:PMixerControl;var peak:integer):boolean;
var
details:TMixerControlDetailsSigned;
cdetails:tMIXERCONTROLDETAILS;
begin
Result:=false;
if control.dwControlType<> mixercontrol_controltype_peakmeter then exit;
cdetails.cChannels:=1;
cdetails.paDetails:=@details;
fillstruct(control,cdetails);
result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0;
end; function setvolume(control:Pmixercontrol; volume:Tvolume):boolean;
var
details:array[0..30] of integer;
cdetails:tMIXERCONTROLDETAILS;
begin
fillstruct(control,cdetails);
cdetails.cChannels:=2;
cdetails.paDetails:=@details;
details[0]:=volume.left;
details[1]:=volume.right;
result:=mixerSetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0;
volume.left:=details[0];
volume.right:=details[1];
end; function getvolume(control:Pmixercontrol; volume:Tvolume):boolean;
var
details:array[0..30] of integer;
cdetails:tMIXERCONTROLDETAILS;
begin
fillstruct(control,cdetails);
cdetails.cChannels:=2;
cdetails.paDetails:=@details;
result:=mixerGetControlDetails(fmixerhandle,@cdetails,MIXER_GETCONTROLDETAILSF_VALUE)=0;
volume.left:=details[0];
volume.right:=details[1];
end; end. // 调用方法:
procedure TForm1.Button1Click(Sender: TObject);
var s : Tvolume;
kz : Pmixercontrol;
begin
new(kz); //<------------ 此处一定要分配内存
kz.dwControlID := 0;
s.left := 0;
s.right := 0;
try
setvolume(kz,s);
except
end;
freemem(kz);
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin
// if a=0 then Exit;
t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
waveOutSetVolume(0,v);
end;procedure tform1.trackbar1changer (sender:tobject);//左声道
var t,v:longint;
begin
t:=trackbar1.postion;
wavoutgetvolume(0,@v);
v:=v and $ffff0000 or (t shl 8);
wavoutsetvolume(0,v);
end;procedure tform1.trackbar2changer (sender:tobject);//右声道
var t,v:longint;
begin
t:=trackbar2.postion;
wavoutgetvolume(0,@v);
v:=v and $0000ffff or (t shl 24);
wavoutsetvolume(0,v);
end;//获得当前音量值
procedure TForm1.FormCreate(Sender: TObject);
var
v:longint;
begin
waveOutGetVolume(0,@v);
TrackBar2.Position:=hi(v);
TrackBar3.Position:=hi(v shr 16);
if hi(v)>hi(v shr 16) then
TrackBar1.Position:=hi(v)
else
TrackBar1.Position:=hi(v shr 16);
end;end.
函数说明:waveOutSetVolume
第一个参数是波形文件输出设备标识符;
第二个参娄是音量大小。这是一个32位的整数,低16位表示左声道的音量,
高16位表示右声道的音量。waveOutGetVolume
第一个参数是波形文件输出设备标识符;
第二个参数是一个32位整数的指针。