AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist
Thema durchsuchen
Ansicht
Themen-Optionen

Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist

Ein Thema von dstein · begonnen am 9. Okt 2024 · letzter Beitrag vom 14. Okt 2024
Antwort Antwort
dstein

Registriert seit: 28. Jul 2005
Ort: Dormagen
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist

  Alt 9. Okt 2024, 11:55
Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist.
Hierfür habe ich ein kleines Prog geschrieben, eigendlich recht simpel.
Ich frage über einen TTimer die MediaPlayer1.Position ab und wenn diese >= MediaPlayer1.Length ist
wird der etwas gemacht.. Doch hier quitscht es; die Bedingung ist erfüllt und springt in den
Proc-Teil hier sollte auch der TTimer.Enabled := False; sein. Doch scheint der weiterzulaufen und immer wieder
in dem Procteil landet so das eine Endlosschleife entsteht.
Mir gehen die Optionen aus was hier falsch läuft.
Hoffentlich kann einer von euch mich in die richtige Richtung schubsen.
Oder haut eine bessere Idee wie ich feststelle wann das Musikstück im TMediaPlayer zu Ende ist.


## Auszug... gesamter Code in der ANlage

procedure TfrmMain.TimerNotifyTimer(Sender: TObject);
const
EndTolerance = 1000; // 1 Sekunde Toleranz
begin
lbl_Pos.Caption := IntToStr(MediaPlayer1.Position);

if MediaPlayer1.Position >= (MediaPlayer1.Length-EndTolerance) then
begin
MediaPlayer1.Stop;
ShowMessage('Das Musikstück ist zu Ende.');
MediaPlayer1.Notify := False;

// Timer explizit freigeben und deaktivieren
TimerNotify.Enabled := False;
end
else
begin
MediaPlayer1.Notify := True;
end;
end;
Angehängte Dateien
Dateityp: zip MP3PlayerTest.zip (1,00 MB, 4x aufgerufen)
Dirk
- Lang ist der Weg durch Lehren, kurz und wirksam durch Beispiele.
(Seneca, röm. Dichter u. Phil., 4 v. Chr. - 65 n.Chr.) -
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#2

AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist

  Alt 9. Okt 2024, 13:06
Eine Möglichkeit wäre das
 TimerNotify.Enabled := False; vor das
Delphi-Quellcode:
  MediaPlayer1.Stop;
  ShowMessage('Das Musikstück ist zu Ende.');
zu setzen.
ich weiß zwar nicht, welches Interval du im Timer gesetzt hast, aber der läuft halt immer weiter, auch wenn das ShowMessage angezeigt wird.
Tritt nun der nächste Interval ein bevor du den Dialog bestätigt hat, landet er zwangläufig wieder in der OnTimer-Methode.

Dialoge in einem Timerevent sind immer so ein Sache, das der Timer immer weiterläuft, wärend jedoch die OnTimer-Procedure auf eine Bestätigen des Dialogs warten könnte.
Wird der Timer jedoch vor dem Dialog angehalten, so spielt das im Grunde keine Rolle mehr.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder ( 9. Okt 2024 um 13:18 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
342 Beiträge
 
#3

AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist

  Alt 9. Okt 2024, 13:22
Not sure if i do understand the question at all, but ...

You are disabling MediaPlayer1.Notify, while it might be way better keep it true and enabled it every time MediaPlayer1Notify being called.

Also you are checking the wrong state in MediaPlayer1Notify, Notify and OnNotify are associated with
https://learn.microsoft.com/en-us/wi...a/mm-mcinotify
Either i don't know how to find/browse documentation or TMediaPlayer.NotifyValue is missing stuff
https://docwiki.embarcadero.com/Libr...er.NotifyValue

if you need to check if the audio play is finished then check for nvSuccessful like this
Delphi-Quellcode:
procedure TfrmMain.MediaPlayer1Notify(Sender: TObject);
var
  sModeString: string;
begin
  // Ьberprьfen des aktuellen Modes und in einen lesbaren String umwandeln
 { case MediaPlayer1.Mode of
    mpNotReady:
      sModeString := 'Not Ready';
    mpStopped:
      sModeString := 'Stopped';
    mpPlaying:
      sModeString := 'Playing';
    mpRecording:
      sModeString := 'Recording';
    mpSeeking:
      sModeString := 'Seeking';
    mpPaused:
      sModeString := 'Paused';
    mpOpen:
      sModeString := 'Open';
  else
    sModeString := 'Unknown';
  end;}


  MediaPlayer1.Notify := True;
  if MediaPlayer1.NotifyValue = nvSuccessful then
  begin
    // here check if the the mode was paused or not , the following might be wrong ! and should store the state from OnClick
    case MediaPlayer1.Mode of
      mpPaused:
        MediaPlayer1.Pause;
    else
      MediaPlayer1.Play;
    end;
  end;

end;

{-------------------------------------------------------
  Procedure: TimerNotifyTimer
  Arguments: Sender: TObject
  Result:    None
  ### ChangeLog
  09.10.2024
------------------------------------------------------}


procedure TfrmMain.TimerNotifyTimer(Sender: TObject);
const
  EndTolerance = 1000; // 1 Sekunde Toleranz
begin
 { lbl_Pos.Caption := IntToStr(MediaPlayer1.Position);

  if MediaPlayer1.Position >= (MediaPlayer1.Length-EndTolerance) then
  begin
    MediaPlayer1.Stop;
    ShowMessage('Das Musikstьck ist zu Ende.');
    MediaPlayer1.Notify := False;
    MediaPlayer1.Close;

    // Timer explizit freigeben und deaktivieren
    TimerNotify.Enabled := False;
    end
  else
  begin
    MediaPlayer1.Notify := True;
  end;  }

end;
And that is it, don't mess with playing and timer for checking it is useless, and as i commented above for pause and continue you need to store the status from different place and distinguish Play vs Pause.

Hope that helps, for me question is still not clear !
Kas
  Mit Zitat antworten Zitat
dstein

Registriert seit: 28. Jul 2005
Ort: Dormagen
53 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Testprog zum feststellen wann ein Musikstück im TMediaPlayer zu Ende ist

  Alt 14. Okt 2024, 15:05
Danke Problem ist gelöst. Es lag tatsächlich an dem Showmessage.
Werde mich mit dem Schleifenthema wohl noch beschäftigen müssen
Danke nochmal an alle.
Dirk
Dirk
- Lang ist der Weg durch Lehren, kurz und wirksam durch Beispiele.
(Seneca, röm. Dichter u. Phil., 4 v. Chr. - 65 n.Chr.) -
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz