控制音量-->yzhshi劳驾 (15分)

  • 主题发起人 主题发起人 D影子D
  • 开始时间 开始时间
D

D影子D

Unregistered / Unconfirmed
GUEST, unregistred user!
请问有谁知道控制音量大小的程序怎么编?
注:不用控件
 
我自己写了一个,不是很完善。如果你要请留下你的E-MAIL。
 
好啊!email:wcdxyl@chinaren.com
我要程序哟!
谢了,好我会再加分的![:)]
 
procedure TForm1.TrackBar1Change(Sender: TObject);
var
t,v:Longint;
begin

t:=TrackBar1.Position;
v:=(t shl 8)or(t shl 24);
//设置音量大小
waveOutSetVolume(0,v);
end;
 
to 小唐:
你好哈,你说的两个MEMO比较的问题,我现在还没做出来,至于你的源码么我在学习,问
题不是已经解决了吗?
上贴中提到的方法有点怪异,我一点TrackBar1Change,声音就设成最大了。
 
我试过了好像没什么反应!
还有更好的吗?
 
to kingdeezj:
能再发一个给我吗?你以前发的那个有点问题!
谢谢了!
记得带源码哟!
 
email:wcdxyl@chinaren.com
 
to: D影子D
我试过了好像没什么反应!
还有更好的吗?

小唐的源码没问题, 把TrackBar1.Max 改成255就可以了。这是网上下载的一个音量控件
的源码,你可以分析一下。

unit Volumes;

interface

uses
Windows, Messages, Classes, ExtCtrls, ComCtrls, MMSystem;

const
CDVolume = 0;
WaveVolume = 1;
MidiVolume = 2;

type
TVolumeControl = class(TComponent)
private
FDevices : array[0..2] of Integer;
FTrackBars : array[0..2] of TTrackBar;
FTimer : TTimer;
function GetInterval: Integer;
procedure SetInterval(AInterval: Integer);
function GetVolume(AIndex: Integer): Byte;
procedure SetVolume(AIndex: Integer;
aVolume: Byte);
procedure InitVolume;
procedure SetTrackBar(AIndex: Integer;
ATrackBar: TTrackBar);
{ Private declarations }
procedure Update(Sender: TObject);
procedure Changed(Sender: TObject);
protected
{ Protected declarations }
procedure Notification(AComponent: TComponent;
AOperation: TOperation);
override;
public
{ Public declarations }
constructor Create(AOwner: TComponent);
override;
destructor Destroy;
override;
published
{ Published declarations }
property Interval: Integer read GetInterval write SetInterval default 500;
property CDVolume: Byte index 0 read GetVolume write SetVolume stored False;
property CDTrackBar: TTrackBar index 0 read FTrackBars[0] write SetTrackBar;
property WaveVolume: Byte index 1 read GetVolume write SetVolume stored False;
property WaveTrackBar: TTrackBar index 1 read FTrackBars[1] write SetTrackBar;
property MidiVolume: Byte index 2 read GetVolume write SetVolume stored False;
property MidiTrackBar: TTrackBar index 2 read FTrackBars[2] write SetTrackBar;
end;


procedure Register;

implementation

procedure Register;
begin

RegisterComponents('Athen
a3', [TVolumeControl]);
end;


type
TVolumeRec = record
case Integer of
0: (LongVolume: Longint);
1: (LeftVolume,
RightVolume : Word);
end;


function TVolumeControl.GetInterval: Integer;
begin

Result := FTimer.Interval;
end;


procedure TVolumeControl.SetInterval(AInterval: Integer);
begin

FTimer.Interval := AInterval;
end;


function TVolumeControl.GetVolume(AIndex: Integer): Byte;
var Vol: TVolumeRec;
begin

Vol.LongVolume := 0;
if FDevices[AIndex] <> -1 then

case AIndex of
0: auxGetVolume(FDevices[AIndex], @Vol.LongVolume);
1: waveOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
2: midiOutGetVolume(FDevices[AIndex], @Vol.LongVolume);
end;

Result := (Vol.LeftVolume + Vol.RightVolume) shr 9;
end;


procedure TVolumeControl.SetVolume(aIndex: Integer;
aVolume: Byte);
var Vol: TVolumeRec;
begin

if FDevices[AIndex] <> -1 then

begin

Vol.LeftVolume := aVolume shl 8;
Vol.RightVolume := Vol.LeftVolume;
case AIndex of
0: auxSetVolume(FDevices[AIndex], Vol.LongVolume);
1: waveOutSetVolume(FDevices[AIndex], Vol.LongVolume);
2: midiOutSetVolume(FDevices[AIndex], Vol.LongVolume);
end;

end;

end;


procedure TVolumeControl.SetTrackBar(AIndex: Integer;
ATrackBar: TTrackBar);
begin

if ATrackBar <> FTrackBars[AIndex] then

begin

FTrackBars[AIndex] := ATrackBar;
Update(Self);
end;

end;


procedure TVolumeControl.Notification(AComponent: TComponent;
AOperation: TOperation);
var I: Integer;
begin

inherited Notification(AComponent, AOperation);
if (AOperation = opRemove) then

for I := 0 to 2do
if (AComponent = FTrackBars)
then
FTrackBars := Nil;
end;


procedure TVolumeControl.Update(Sender: TObject);
var I: Integer;
begin

for I := 0 to 2do

if Assigned(FTrackBars) then

with FTrackBarsdo

begin

Min := 0;
Max := 255;
if Orientation = trVertical
then
Position := 255 - GetVolume(I)
else
Position := GetVolume(I);
OnChange := Self.Changed;
end;

end;


constructor TVolumeControl.Create(AOwner: TComponent);
begin

inherited Create(AOwner);
FTimer := TTimer.Create(Self);
FTimer.OnTimer := Update;
FTimer.Interval := 500;
InitVolume;
end;


destructor TVolumeControl.Destroy;
var I: Integer;
begin

FTimer.Free;
for I := 0 to 2do

if Assigned(FTrackBars) then

FTrackBars.OnChange := Nil;
inherited Destroy;
end;


procedure TVolumeControl.Changed(Sender: TObject);
var I: Integer;
begin

for I := 0 to 2do

if Sender = FTrackBars then

with FTrackBarsdo

begin

if Orientation = trVertical
then
SetVolume(I, 255 - Position)
else
SetVolume(I, Position);
end;

end;


procedure TVolumeControl.InitVolume;
var AuxCaps : TAuxCaps;
WaveOutCaps : TWaveOutCaps;
MidiOutCaps : TMidiOutCaps;
I,J : Integer;
begin

FDevices[0] := -1;
for I := 0 to auxGetNumDevs - 1do

begin

auxGetDevCaps(I, @AuxCaps, SizeOf(AuxCaps));
if (AuxCaps.dwSupport and AUXCAPS_VOLUME) <> 0 then

begin

FTimer.Enabled := True;
FDevices[0] := I;
break;
end;

end;

FDevices[1] := -1;
for I := 0 to waveOutGetNumDevs - 1do

begin

waveOutGetDevCaps(I, @WaveOutCaps, SizeOf(WaveOutCaps));
if (WaveOutCaps.dwSupport and WAVECAPS_VOLUME) <> 0 then

begin

FTimer.Enabled := True;
FDevices[1] := I;
break;
end;

end;

FDevices[2] := -1;
for I := 0 to midiOutGetNumDevs - 1do

begin

MidiOutGetDevCaps(I, @MidiOutCaps, SizeOf(MidiOutCaps));
if (MidiOutCaps.dwSupport and MIDICAPS_VOLUME) <> 0 then

begin

FTimer.Enabled := True;
FDevices[2] := I;
break;
end;

end;

end;


end.
 
var
per: integer;
v: integer;
begin

v := ValueSlider.Value * 255;
//high 16 bits:right Blast;
v's low 16 bits:left blast
waveOutSetVolume(0, v + v * 65536);

per := trunc(ValueSlider.Value * 100 / 255 + 0.5);
Voicetext.Caption := '音量:' + Format('%3d', [per]) + '%';
 
好像不能控制mp3文件的声音阿!
我要的是能控制mp3文件的声音!
wav和其他文件的我不需要!
 
我倒!
mp3声音是怎么发出来的?还是要通过声卡的wave通道的。
你试试在放mp3的时候调节音量设置中的wave时,声音有变化吗?

上面的代码绝对正确,这可是给公司开发的软件中的代码。
 
ValueSlider是什么?没定义阿!
有的程序可以控制wav但对mp3不管用的!
[:)]
 
trxslider控件。
我设的最小值0,最大值255。
 
唉!yzhshi不是万能的呀,这个就不会,只能帮你查一下资料,主要是hubdog的葵花宝典里面的。你可以自己看一下。
还有,以上几位的回答已经基本够了。
另外,最好以后不要在标题上那么写,大家会反感的吆。[:)]
 
to yzhshi:
好了,yzhshi这是我对你的信任。你会不会不要紧,只要你肯回答我就好了!
我相信大家也想看看你的建议。
to 远帆
我再试试!
[:)]
 
楼上说得非常全面,你难道还有更好的吗?
 
trxslider控件。
在哪?
 
是rxlib中的控件,你可以用trackbar代替,我用那个只是因为它可以做得更好看一些。

to yzhshi:
开始看见上面指你的名回答,所以就没有回答,不过转念一想,你不会是那种小气
的人:)
 
后退
顶部