求控制左右声道的控件或算法(10分)

  • 主题发起人 主题发起人 陈锡震
  • 开始时间 开始时间

陈锡震

Unregistered / Unconfirmed
GUEST, unregistred user!
email:cxz@gsta.com
 
uses
..., MMsystem,...

//调节全部音量
procedure TForm1.TrackBar1Change(Sender: TObject);
var t, v: longint;
{ v 表示音量大小,高16位表示右声道音量,低16位表示左声道的音量}
begin
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的指针(32位),
调用此函数的用意就是得到右声道的值,做到在调节左声道的
时候,不改变右声道的值 }
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;
 
谢谢
:)
其实可以解决一个很实际的问题。
 
v := v and $ffff0000 or ( t shl 8);


请教:这个是什么意思?
 
ths,可能是我没说清楚,我是要左右平衡的算法,例如,trackbar的poistion在中间时,两个声道是
平衡的,拖动trackbar向左,右声道就没声...
 
你减小左声道的声音,增大右声道的声音,不就等于将 trackbar 拖向右边了吗?
 
好象左右的控制不对哦
 
知道了上述的v,这样转换为0-255范围内的数啊?
 
benzol 说的很全面.只是你的要求简单了一点,呵呵.
这样:
WaveoutSetVolume(0,v);
V:=FFFF 右声道;
V:=FFFF0000 左声道;
V:=FFFFFFFF 立体声.

 
应该是0-65535之间的转换才对.
 
试试这个:
uses mmsystem;
mcisendstring('set all audio all off',nil,0,handle);
mcisendstring('set all audio left on',nil,0,handle);
//左声道的例子;

mcisendstring('set all audio all off',nil,0,handle);
mcisendstring('set all audio right on',nil,0,handle);
//右声道的例子;
[:)]

 
to :D影子D
好象没什么反应

最后一个问题:
用benzol的做法是可以的,但是不是对系统音量起永久的影响,如:正在播发一首mp3时
我用这个调好音量后,播放下一首的时候,音量就恢复到调整以前的了,什么回事啊
 
接受答案了.
 
后退
顶部