CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

windwos下怎么控制音量大小?

楼主crazyz(乘风)2002-07-06 15:36:31 在 Delphi / VCL组件开发及应用 提问

windwos怎么控制音量大小? 问题点数:20、回复次数:6Top

1 楼debussy(debussy)回复于 2002-07-06 15:39:04 得分 5

mixerSetControlDetails  
  auxoutsetvolume   是控制CD音量的      
  waveOutSetVolume   是控制波形的      
  midiOutSetVolume   是控制FM或者是synthesizer  
   
  unit   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;    
   
   
  Top

2 楼crazyz(乘风)回复于 2002-07-06 15:51:54 得分 0

这么复杂有没有简单的,我只是想控制在任务栏上的音量调节Top

3 楼crazyz(乘风)回复于 2002-07-06 16:06:11 得分 0

还有人回答吗?Top

4 楼ZengXi(var Mm: TObject)回复于 2002-07-06 16:11:02 得分 5

当你做一个多媒体播放器时,难免少不了控制音量的大小和左右声道的播放,下面就介绍一种控制Wave波形输出设备音量的方法,该方法不是设置主音量。先在窗体上放两个TTrackBar,分别命名为TrackBar1,TrackBar2,属性Max都设置为65535,如果觉得刻度太密了,可以把Frequency属性值设置大一些,然后在Uses段加入MMSystem,并在TrackBar1和TrackBar2的OnChange事件都写上下列语句:    
   
  procedure   TForm1.TrackBar1Change(Sender:   Tobject);    
  var   Wave:string;    
  begin    
  Wave:='$'+inttohex(TrackBar1.Position,4)+inttohex(TrackBar2.Position,4);    
  waveoutsetvolume(0,strtoint(Wave));    
  end;    
  Top

5 楼ZengXi(var Mm: TObject)回复于 2002-07-06 16:11:57 得分 5

//音量控制    
  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);    
  Top

6 楼wzrlover(无语无声无欲无泪吾独行!)回复于 2002-07-06 16:13:49 得分 5

给你抄一段文章:  
   
   已经有很多文章介绍过控制总音量的方法,但控制左右声道音量的方法却很少有  
  文章介绍,本人介绍一种用Delphi实现控制左右声道音量的妙法,希望能给你的程序添  
  彩。  
    一、调节全部音量  
    1.先在窗体中添加一个trackbar控件,可通过改变它的位置来调节音量,在track  
  bar1的属性中,我们把Max属性修改成255,改成这个值是为了便于进行二进制的音量调  
  节操作。  
    2.为了调用一个Windows函数,在uses子句里加上Mmsystem。  
    3.为trackbar1的Onchange事件编写如下代码:  
    procedure   Tform1.TrackBar1change(Sender:Tobject);  
    var   t,v:longint;//   t的最大值为8位的二进制:11111111;用v来表示音量的大  
  小,这是个32位的整数,高16位表示右声道的音量,低16位表示左声道的音量  
    begin  
    t:=trackbar1.Position;//得到Trackbar的位置,可用这个值来表示音量的大小  
   
    v:=(t   shl   8)   or   (t   shl   24);//将t左移8位、24位  
    waveoutsetvolume(0,v);//设置音量  
    end;  
    二、分别控制两个声道的方法  
    1.控制左声道  
    procedure   Tform1.TrackBar1change(Sender:Tobject);  
    var   t,v:longint;  
    begin  
    t:=trackbar1.Position;  
    waveoutgetvolume(0,@v);//@表示指向变量v的指针(32位),调用此函数的用意  
  就是得到右声道的值,做到在调节左声道的时候,不改变右声道  
    v:=v   and   $ffff0000   or   (t   shl   8);//数字前面加$表示是十六进制数字  
    waveoutsetvolume(0,v);  
    end;  
    2.控制右声道  
    procedure   Tform1.TrackBar2change(Sender:Tobject);  
    var   t,v:longint;//它的原理同上  
    begin  
    t:=trackbar2.Position;  
    waveoutgetvolume(0,@v);  
    v:=v   and   $0000ffff   or   (t   shl   24);  
    waveoutsetvolume(0,v);  
    end;  
    三、设置滑块的初始位置  
    1.程序开始执行时,缺省情况下,Trackbar的位置在0,但我们希望程序开始执行  
  时,这两个滑块能自动得到当前的音量,而处在相应的位置。  
    procedure   TForm1.FormCreate(Sender:   TObject);  
    var   v:longint;  
    begin  
    waveoutgetvolume(0,@v);//得到现在音量  
    trackbar1.Position:=hi(v);//设置左滑块的正确位置  
    trackbar2.Position:=hi(v   shr   16);//设置右声道滑块的正确位置  
    end;  
    注:函数hi(v)的作用为:返回一个16位无符号整数的高8位值。如果v为32位,则高  
  16位自动被忽略了。  
    2.只使用高8位时,可使调节效果更明显。  
    3.对波形文件可以用waveoutgetvolume函数,对cd文件可以用auxgetvolume函数。  
   
   
   
  Top

相关问题

  • 如何控制话筒音量大小?
  • 如何控制音量的大小
  • 如何控制系统音量大小
  • 为什么音量控制里的音量大小在重启后会还原?
  • 怎样控制音量的大小!!!(输出与录入)) 谢谢!!!!!!!
  • 请问如何用slider控制音量大小
  • 如何控制播放音量的大小????
  • 怎样用VB控制音量大小?(在线等待...)
  • 音量控制
  • 控制音量

关键词

  • 音量
  • 函数
  • 控制
  • cdetails
  • trackbar
  • pmixercontrol
  • waveoutgetvolume
  • 声道
  • fillstruct
  • tvolume

得分解答快速导航

  • 帖主:crazyz
  • debussy
  • ZengXi
  • ZengXi
  • wzrlover

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo