请教MCI的问题 :控制单独的声道 (100分)

  • 主题发起人 主题发起人 cheka
  • 开始时间 开始时间
C

cheka

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=191992

谢谢Pipi, 不过还剩下一个问题,就是我可以用lpSet.dwAudio:=MCI_SET_AUDIO_ALL;
然后开启和关闭两个声道可是用
lpSet.dwAudio:=MCI_SET_AUDIO_Right 或lpSet.dwAudio:=MCI_SET_AUDIO_Left
却不能控制单独声道 ,效果与MCI_SET_AUDIO_ALL一样。

再次请教了。
 
现在我在上班,没有声卡可以试。
不过先告诉你 MCI_SETVIDEO 在 digitalv.h 和 vcr.h 两个 文件都有
mmsystem 没有
 
所有常数在bcb下include找:digitalv.h (就是digital video的意思了)

命令用 MCI_SETAUDIO ( $0873 )

var
s:MCI_DGV_SETAUDIO_PARMS;
//此结构在帮助文件 mmedia.hlp 有

mciSendCommand(dev_id, MCI_SETAUDIO , MCI_DGV_SETAUDIO_LEFT or MCI_SET_OFF, integer(@s))

MCI_DGV_SETAUDIO_LEFT 是 $00200000
MCI_DGV_SETAUDIO_RIGHT 是 $00400000
 
上面是纸上谈兵,后来一试,发现也是不能分别关一个声道,也是同时关
可能是xing驱动程序没支持分别关吧

找到一个替代方法,将要关的声道的音量设置为0,不知道符合你的要求吗
下面关右声道音量:

const
MCI_SETAUDIO= $873;
MCI_DGV_SETAUDIO_VOLUME=$4002;
MCI_DGV_SETAUDIO_VALUE=$01000000;
MCI_DGV_SETAUDIO_LEFT=$200000;
MCI_DGV_SETAUDIO_RIGHT=$400000;
MCI_DGV_SETAUDIO_ITEM=$00800000;

type MCI_DGV_SETAUDIO_PARMS=record
dwCallback:DWORD;
dwItem:DWORD;
dwValue:DWORD;
dwOver:DWORD;
lpstrAlgorithm:PChar;
lpstrQuality:PChar;
end

procedure TForm1.Button3Click(Sender: TObject);
var
s: MCI_DGV_SETAUDIO_PARMS
err:integer;
buf:array[0..1000] of char;
begin


s.dwValue:=0;
s.dwItem:=MCI_DGV_SETAUDIO_VOLUME;

err:=mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_RIGHT or MCI_DGV_SETAUDIO_ITEM or MCI_DGV_SETAUDIO_VALUE,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;



end;

 
再次谢谢Pipi,不过我还是没得到想要的效果。
也许是我前面没说清楚,我指的声道是卡拉OK碟里的歌曲和伴乐,
也就是说,必须关闭歌曲只播放伴乐。而不是关闭一个喇叭。

后来我发现有MCI_DGV_SETAUDIO_SOURCE_LEFT ,就试着这样做:
SetAudio.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
SetAudio.dwValue:=MCI_DGV_SETAUDIO_SOURCE_LEFT;
FError:=mciSendCommand(MediaPlayer1.DeviceID ,
MCI_SETAUDIO,
MCI_DGV_SETAUDIO_ITEM or
MCI_SET_OFF
DWORD(@SetAudio)
);
结果命令有错,

Xing Player 是可以播放卡拉OK的。



 
下面已经测试通过的:

const
MCI_SETAUDIO= $873;
MCI_SETVIDEO=$0876;
MCI_DGV_SETAUDIO_SOURCE_LEFT=1;
MCI_DGV_SETAUDIO_SOURCE_STEREO=0;
MCI_DGV_SETAUDIO_SOURCE_RIGHT=2;
MCI_DGV_SETAUDIO_SOURCE=$4004;
MCI_DGV_SETAUDIO_VALUE=$01000000;
MCI_DGV_SETAUDIO_ITEM=$00800000;


type MCI_DGV_SETAUDIO_PARMS=record
dwCallback:DWORD;
dwItem:DWORD;
dwValue:DWORD;
dwOver:DWORD;
lpstrAlgorithm:PChar;
lpstrQuality:PChar;
end

procedure TForm1.Button3Click(Sender: TObject);
var
s: MCI_DGV_SETAUDIO_PARMS
err:integer;
buf:array[0..1000] of char;
begin


//播放中一定要先关闭声音,否则没效果
err:=mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_SET_OFF ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;



s.dwValue:=MCI_DGV_SETAUDIO_SOURCE_RIGHt;
//右声道源
s.dwItem:=MCI_DGV_SETAUDIO_SOURCE;
//下面的MCI_DGV_SETAUDIO_VALUE 一定不能少
err:=mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE or MCI_DGV_SETAUDIO_ITEM ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;


//再打开声音,就是你所要的
err:=mciSendCommand(MediaPlayer1.DeviceID,MCI_SETAUDIO, MCI_SET_ON ,integer(@s));
if(err<>0)then

begin

mciGetErrorString(err,buf,sizeof(buf) );
ShowMessage(buf);
end;


end;

 
1、上面可能加上 MCI_WAIT 好一点

2、以前那个问题我看你用了MCI_NOTIFY,那就会向 MCI_SET_PARMS.dwCallBack
指定的窗口发 MM_MCINOTIFY 消息,如果没准备处理这个消息,又没有设置
MCI_SET_PARMS.dwCallBack 的值,还是不要MCI_NOTIFY这个属性比较好,
免得到处乱发消息,不知道发到谁那里去了
 
谢谢,以前从没碰过MCI,第一回用,有点模不着北的感觉,
幸亏有你指点,效果我很满意,更重要的是学了很多东西。

再次感谢!
 
其实我也谢谢你,我以前也没搞过mci,看到有那么多分,
就...速成了一下
 

Similar threads

后退
顶部