关于歌曲的Delphi MediaPlayer通知已停止

时间:2017-10-09 07:08:46

标签: delphi notifications

我需要在Delphi7应用程序中嵌入一个简单的MP3播放器。 我将简单地扫描目录并以随机顺序播放所有文件。

我找到了两种可能的解决方案:一种使用Delphi MediaPlayer,一种使用PlaySound Windows API。

没有工作。

问题似乎在于缺失"停止"通知。 像这样使用PlaySound:

playsound(pchar(mp3[r].name), 0, SND_ASYNC or SND_FILENAME);

我无法找到一种方法(礼貌地)要求Windows在歌曲停止播放时通知我。

使用Delphi MediaPlayer,互联网上有很多建议从另一个中复制/粘贴,如下所示:

http://www.swissdelphicenter.ch/en/showcode.php?id=689

http://delphi.cjcsoft.net/viewthread.php?tid=44448

procedure TForm1.FormCreate(Sender: TObject);
begin
  MediaPlayer1.Notify   := True;
  MediaPlayer1.OnNotify := NotifyProc;
end;

procedure TForm1.NotifyProc(Sender: TObject);
begin
  with Sender as TMediaPlayer do 
  begin
    case Mode of
      mpStopped: {do something here};
    end;
    //must set to true to enable next-time notification
    Notify := True;
  end;
end;
{
  NOTE that the Notify property resets back to False when a
  notify event is triggered, so inorder for you to recieve
  further notify events, you have to set it back to True as in the code.
  for the MODES available, see the helpfile for MediaPlayer.Mode;
}

我的问题是,当歌曲结束时,我确实得到了NotifyValue == nvSuccessfull 但是当我开始播放歌曲时,我也不能依赖它。 此外,我永远不会改变"模式的状态"属性,根据我找到的所有例子,应该成为 mpStopped

这里有一个类似的问题

How can I repeat a song?

但它不起作用,因为如上所述,我收到了两次nvSuccessfull,没有办法区分开始和停止。

最后但同样重要的是,这款应用应该可以在XP到Win10之间运行,这就是我在WinXP上使用Delphi7进行开发的原因。

谢谢你,对于这篇文章的篇幅感到抱歉,但在寻求帮助之前,我确实尝试了很多解决方案。

1 个答案:

答案 0 :(得分:2)

要检测何时加载新文件以进行播放,您可以使用OnNotify事件以及TMediaPlayer的EndPosPosition属性(以下称为MP)

首先设置MP并选择TimeFormat,例如

MediaPlayer1.Wait := False;
MediaPlayer1.Notify := True;
MediaPlayer1.TimeFormat := tfFrames;
MediaPlayer1.OnNotify := NotifyProc;

加载要播放的文件时,请设置EndPos属性

MediaPlayer1.FileName := OpenDialog1.Files[NextMedia];
MediaPlayer1.Open;
MediaPlayer1.EndPos := MediaPlayer1.Length;
MediaPlayer1.Play;

OnNotify()程序

procedure TForm1.NotifyProc(Sender: TObject);
var
  mp: TMediaPlayer;
begin
  mp:= Sender as TMediaPlayer;

  if not (mp.NotifyValue = TMPNotifyValues.nvSuccessful) then Exit;

  if mp.Position >= mp.EndPos then
  begin
    // Select next file to play
    NextMedia := (NextMedia + 1) mod OpenDialog1.Files.Count;
    mp.FileName := OpenDialog1.Files[NextMedia];
    mp.Open;
    mp.EndPos := mp.Length;
    mp.Position := 0;
    mp.Play;
    // Set Notify, important
    mp.Notify := True;
  end;
end;

最后评论您尝试使用MP.Mode = mpStopped模式更改为新歌曲。操作按钮时模式改变,当用户按下停止按钮时,{i} mpStopped。更改歌曲并开始播放可能不是用户所期望的。