关于waveoutgetvolume和waveoutSetvolume的问题(200分)

  • 主题发起人 主题发起人 DreamTiger
  • 开始时间 开始时间
D

DreamTiger

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是一个简单的程序,在我的机器上,(Win2000 SP2,Delphi6),运行
时,无论Window的音量大小怎么样,在InitOutValume中取到的V只永远是
0,但是返回的Res却是MMSYSERR_NOERROR。而在tbrOutChange中,返回的
Res是MMSYSERR_NOTSUPPORTED。谁能帮我看看程序有什么问题?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls;

type
TForm1 = class(TForm)
tbrOut: TTrackBar;
procedure FormCreate(Sender: TObject);
procedure tbrOutChange(Sender: TObject);
private
procedure InitInOutValume;
{ Private declarations }
public
{ Public declarations }
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

uses mmsystem;

procedure TForm1.FormCreate(Sender: TObject);
begin

InitInOutValume;
end;


procedure TForm1.InitInOutValume;
var
v,leftv,rightv:Longint;
Res:MMRESULT;
begin

v := 0;
Res := waveoutgetvolume(0,@v);
if Res <> MMSYSERR_NOERROR then

begin

leftv := hi(v);
rightv:= hi(v shr 16);
tbrOut.OnChange := nil;
if leftv > rightv then

tbrOut.Position := leftv
else

tbrOut.Position := rightv;
tbrOut.OnChange := tbrOutChange;
end;

end;


procedure TForm1.tbrOutChange(Sender: TObject);
var
t, v: Longint;
Res:MMRESULT;
s:string;
begin

t := tbrOut.Position;
v := (t shl 8) or (t shl 24);
Res := waveOutSetVolume(0, v);
if Res <> MMSYSERR_NOERROR then

begin

case Res of
MMSYSERR_INVALHANDLE:s:= ' Specified device handle is invalid.';
MMSYSERR_NODRIVER:s := ' No device driver is present.';
MMSYSERR_NOMEM:s := ' Unable to allocate or lock memory.';
MMSYSERR_NOTSUPPORTED:s := ' Function is not supported.';
end;

ShowMessage(s);
end;

end;


end.

 
在initInOutwave 过程中

因该是 if Res [red]=[/red] MMSYSERR_NOERROR then
吧。。

看看你的机子上有没有装Modem。 如果有的话,可能是设备选择到了 modem上的wave设备了。
 
我的方法与你差不多,但是没有遇到过你说的问题。
 
xwings,是的,这里是我写错了。
修改后发现出错跟后面一样,都是Function not supported。
我用的是DELL的笔记本,上面声卡和Modem都有。不知道怎么
才能够修改主音量的大小。

我实验了下面的方法:
procedure TForm1.InitInOutValume;
。。。
if MediaPlayer1.DeviceID = 0 then

exit;

v := 0;
Res := waveOutGetVolume(MediaPlayer1.DeviceID,@v);
这样是可以取到值,但是Trackbar的移动,改变的不是主音量,
而是该设备的最大值为主音量大小,TrackBar位置是相对于
主音量的大小。这里监测到的MediaPlayer1.DeviceID是1

还有什么方法么?
 
你的程序是没有错的.我已经试过了.
你也可以用另外一台机器试试,(不要带modem的)
我想主要原因是波形设备选择的问题.
至于deviceID 我记得好像一般有2个选项的. -1 是系统默认的设备(wave mapper)
0 是第一个设备, 1 是第二个设备.
我这里没有办法可以测试. 你可以试试看看是不是这样的.
 
后退
顶部