自己写的一个控制音量的类,能控制所有音量。(没完成,期待大家共同探讨)-没分的,我也穷啊!

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

用amixer   在xp下不正常,参照相关资料自己写了一个。  
  但是目前还不能实现设置静音和获取静音的函数。  
  本来想继续弄的,发现头好疼。看来今天是弄不出来了。  
  要睡觉了。  
  如果大虾们觉得有意思,帮忙弄一下咯。也好造福scdn的鸟鸟们。  
   
  ps:我就是一个绝对的菜鸟。  
   
  代码如下:  
   
  发现一个问题,当前音频设备的id号如果为1,那么控制他是否静音的就是2。但是不知道如果该设备有除了静音以外的另外一个选项的时候,是不是还是这样的。  
  期待ing,实在要睡觉了!  
   
  ---------------------------------  
   
   
   
   
   
   
   
  unit   setvol;  
   
   
  interface    
   
  uses   windows,mmsystem;    
   
  type  
  tvolume=record  
  left,right:word;  
  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;  
  function   setism(control:pmixercontrol;   volume:tvolume;mute:boolean   =   true):boolean;  
  function   getism(control:pmixercontrol;   volume:tvolume):boolean;  
   
  var  
  mcontrols:array   of   pmixercontrol;    
  fmixerhandle:hmixer;  
   
  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;  
   
   
  ///--------------------------  
  ///   设置静音的函数           没弄出来  
  ///--------------------------  
  function   setism(control:pmixercontrol;   volume:tvolume;mute:boolean   =   true):boolean;  
  var  
  details:array[0..30]   of   integer;  
  cdetails:tmixercontroldetails;  
   
  begin  
  control.dwcontrolid   :=   control.dwcontrolid   +1;       //把id加上1就是对当前的设备静音控制??  
  fillstruct(control,cdetails);  
  cdetails.cchannels:=2;  
    case   integer(mute)   of  
        0:begin  
            volume.left   :=   0;  
            volume.right   :=   0;  
            end;  
        1:begin  
            volume.left   :=   1;  
            volume.right   :=   1;  
   
            end;  
    end;  
  cdetails.padetails:=@details;  
  result:=mixersetcontroldetails(fmixerhandle,@cdetails,mixer_getcontroldetailsf_value)=0;  
  volume.left:=details[0];  
  volume.right:=details[1];  
  end;  
   
   
  ///--------------------------  
  ///   获取静音的函数               只是复制下来的,还没弄  
  ///--------------------------  
  function   getism(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.    
   
   
 

.

· 网友精彩回答:

处理 SSI 文件时出错
© 2006-2008 All Rights Reserved