如何获知当前播放的CD是第几曲?为何不能关闭设备?(100分)

S

Sachow

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个CD播放器,现在最头痛的问题就是在CD播放完一首曲子,放
下一首的时候,如何让程序判断出这一变化来。我设了MediaPlayer.notify
为True,但它并不能反映出这一变化来,它只能反映出人工编写代码造成的
变化来! 而且我也找不到MediaPlayer里有能够测出当前播放的曲子是第几
曲的procedure或function来,我看了MCI API,其中有关MCI_Status的命令
中有一个MCI_Status_Current_Track,照帮助文件中它是用来返回当前是第
几Track的,但返回结果很怪:1567!这是什么东西?!
相关代码如下:

procedure TMainForm.Button1Click(Sender: TObject);
var
StatusParm: TMCI_STATUS_PARMS;
Flags: Longint;
FError: LongInt;
begin

Flags := mci_Notify;
StatusParm.dwCallback := Player.Handle;
FError := mciSendCommand(Player.DeviceID,
MCI_STATUS_ITEM+MCI_STATUS_CURRENT_TRACK,
Flags,
Longint(@StatusParm));
if FError <> 0 then

ShowMessage('Failed')
else
begin

Label3.Caption := IntToStr(StatusParm.dwReturn);
end;

end;


后来我又想到用计时器来监测,如果
Player.Position > Player.Trackposition[当前曲目] then
当前曲目加1,
觉得颇费周章,各位有没有更好的算法?另外,为什么在放CD的时候调用
Player.Close过程不能关闭Player?程序提示没有MCI设备打开!怎么办?
 
用汇编啦,要得华我敲下来贴出来.
 
虽然俺不怎么懂汇编,但也想看看,烦劳您贴上来吧。
 
翻一下……
 
没人回答……
 
真的看不出什么问题啊,把MCI_STATUS_ITEM去掉试下。或者考虑用MciSendString
改写一下程序,这个函数用起来简单很多。
关闭不了也是很奇怪的事情,是不是设备号给错了?
都是莫名其妙的错误。
 
用Mediaplayer的position属性即可
 
Position如何不用计时器怎么测得出它在变化呢?
 
控制CD的音量是要用auxGetVolume和auxSetVolume两个函数。

****************
左声道:
var
v,t:LOngint;
begin
g:
t:=55-TrackBar1.Positinon;
auxGetVolume(MediaPlayer.DeviceID-1,@v);
v:=((t shl 8)or(v and $ffff0000));
auxSetVolume(MediaPlayer.DeviceID-1,v);
end;

****************
右声道:
var
v,t:LOngint;
begin
g:
t:=55-TrackBar2.Positinon;
auxGetVolume(MediaPlayer.DeviceID-1,@v);
v:=((t shl 24)or(v and $0000ffff));
auxSetVolume(MediaPlayer.DeviceID-1,v);
end;


注:TrackBar.max:=255;
MediaPlayer是SYSTEM页中的那个MediaPlayer;
并设定MediaPlayer的播发设备。
 
为什么第一个参数是MediaPlayer.DeviceID-1, 我测得MediaPlayer的DeviceID
为1,再减1就是零了,DeviceID会不会变?比如说有时是1,有时是2?
 
你用mci_status命令的返回值里面应该包括了tracknum , minutes, seconds and
frames 四个东东吧(与你所设的时间格式有关),具体怎么分解,msdn里面有详细说明
的,仔细看看
 
上一次竟然没有发分成功!
 
顶部