AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Noch ein Problem mit TMediaPlayer
Thema durchsuchen
Ansicht
Themen-Optionen

Noch ein Problem mit TMediaPlayer

Ein Thema von Amateurprofi · begonnen am 29. Jan 2025 · letzter Beitrag vom 29. Jan 2025
Antwort Antwort
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#1

Noch ein Problem mit TMediaPlayer

  Alt 29. Jan 2025, 05:37
Ich hatte hier https://www.delphipraxis.net/216394-...diaplayer.html über ein Problem berichtet und nach Lösungen gesucht.
Ein weiteres Problem, das gelöst ist, das ich aber schildern nöchte, falls mal jemand ähnliche Erfahrungen macht:

Das Problem:
In meinem Programm zum Abspielen von .mp3's gibt es eine Option, dass beim Öffnen des Programms die .mp3, die vor dem letzem Schließen des Programms gespielt wurde, automatisch abgespielt wird.
Wenn die Option gesetzt ist, wird am Ende von Main.FormCreate das Abspielen dieser Datei veranlasst, und alles ist gut.
Ist dagegen die Option nicht gesetzt, wird keine .mp3 abgespielt.
Wenn ich später durch Doppelklick auf einen Eintrag in der Playerliste diese Datei abspielen will, kommt die Fehlermeldung
"Der Befehl erfordert einen Parameter. Geben Sie einen an."

Die Ursache:
In TMediaPlayer.Open wird ein
OpenParm.dwCallback := Handle; gemacht.
Vor Ausführung ist die Variable FFlags = 514 (MCI_OPEN_ELEMENT + mci_Wait)
Nach der Ausführung ist FFlags =258 (mci_Open_Shareable+ mci_Wait)
und im folgenden
FError := mciSendCommand(0, mci_Open, FFlags, UIntPtr(@OpenParm)); wird FError=273 gesetzt und dann mit
Delphi-Quellcode:
  if FError <> 0 then {problem opening device}
    raise EMCIDeviceError.Create(ErrorMessage)
die besagte Fehlermeldung ausgelöst.
Wohlgemerkt:
Das passiert nur, wenn nicht bereits im Main.FormCreate eine .mp3 abgespielt wurde, und nur beim ersten Versuch, eine .mp3 abzuspielen.
Nach tagelanger Suche habe ich herausgefunden, dass im
TMediaPlayer.GetMode: TMPModes; FFlags gesetzt wird.
M.E. ist es ein Fehler im Design, dass für FFlags keine lokale Variable verwendet wird.

Die Lösung des Problems:
Wenn im FormCreate nicht automatisch eine .mp3 abgespielt wird, mache ich ein
Dummy:=MPlayer.Player.Handle; was bewirkt, dass ein Handle existiert und bei OpenParm.dwCallback := Handle; nicht der im Aufrufstack gezeigte Rattenschwanz an Funktionsaufrufen gemacht wird.

Frage am Rande:
Gibt es (mit Bordmitteln) eine Möglichkeit eine bestimmte Speicherstelle zu überwachen und bei einer Änderung automatisch an der Stelle, die die Änderung durchführt anzuhalten.
Ich hatte mir so geholfen dass ich in der Liste der überwachten Ausdrücke
1) Die Adresse von FFlags ermittelte.
2) Einen Speicherauszug von der Adresse zeigen ließ.
und dann mit F7 solange weitergegangen bin, bis sich an dieser Adresse etwas geändert hat.
(war recht zeitaufwendig).

Der Übeltäter
Delphi-Quellcode:
function TMediaPlayer.GetMode: TMPModes;
var
  StatusParm: TMCI_Status_Parms;
begin
  FFlags := mci_Wait or mci_Status_Item;
  StatusParm.dwItem := mci_Status_Mode;
{$IF DEFINED(CLR)}
  FError := mciSendCommand( DeviceID, mci_Status, FFlags, StatusParm);
{$ELSE}
  FError := mciSendCommand( FDeviceID, mci_Status, FFlags, UIntPtr(@StatusParm));
{$IFEND}
  Result := TMPModes(StatusParm.dwReturn - 524); {MCI Mode #s are 524+enum}
end;

Der Aufrufstack
Code:
Vcl.MPlayer.TMediaPlayer.GetMode
Music_Player.TMPlayer.GetMode
Music_Main.TMain.FormCanResize($2966C50,1267,572,True)
Vcl.Controls.TControl.CanResize(???,???)
Vcl.Controls.TWinControl.CanResize(???,???)
Vcl.Controls.TControl.DoCanResize(1632096,???)
Vcl.Controls.TControl.CheckNewSize(1267,1631964)
Vcl.Controls.TWinControl.WMWindowPosChanging((70, (), 0, (), $18EB20, 0))
Vcl.Forms.TCustomForm.WMWindowPosChanging((70, (), 0, (), $18EB20, 0))
Vcl.Controls.TControl.WndProc((70, 0, 1633056, 0, 0, 0, (), 60192, 24, (), 0, 0, ()))
Vcl.Controls.TWinControl.WndProc((70, 0, 1633056, 0, 0, 0, (), 60192, 24, (), 0, 0, ()))
Vcl.Forms.TCustomForm.WndProc((70, 0, 1633056, 0, 0, 0, (), 60192, 24, (), 0, 0, ()))
Vcl.Controls.TWinControl.MainWndProc(???)
System.Classes.StdWndProc(328612,70,0,1633056)
:00492cf4 TControl.CanResize + $28
Vcl.Controls.TWinControl.AlignControls($29227B0,(0, 0, 1259, 492, (0, 0), (1259, 492)))
Vcl.Forms.TScrollingWinControl.AlignControls($29227B0,???)
Vcl.Forms.TCustomForm.AlignControls(???,(0, 0, 1259, 492, (0, 0), (1259, 492)))
Vcl.Controls.TWinControl.AlignControl($29227B0)
Vcl.Controls.TControl.RequestAlign
Vcl.Controls.TWinControl.RequestAlign
Vcl.Controls.TWinControl.SetBounds(???,???,29,30)
Vcl.MPlayer.TMediaPlayer.WMSize((1633904, (), 4813467, 61012, 24, (), 4813491))
Vcl.Controls.TControl.WndProc((5, 0, 1966080, 0, 0, 0, (), 0, 30, (), 0, 0, ()))
Vcl.Controls.TWinControl.WndProc((5, 0, 1966080, 0, 0, 0, (), 0, 30, (), 0, 0, ()))
Vcl.Controls.TWinControl.MainWndProc(???)
System.Classes.StdWndProc(853926,5,0,1966080)
Winapi.Windows.CreateWindowEx(???,???,nil {#0},1140916224,925,3,0,30,328612,0,4194304,nil)
Vcl.Controls.TWinControl.CreateWindowHandle($18F464)
Vcl.Controls.TWinControl.CreateWnd
Vcl.Controls.TWinControl.CreateHandle
Vcl.Controls.TWinControl.HandleNeeded
Vcl.Controls.TWinControl.GetHandle
Vcl.MPlayer.TMediaPlayer.Open
Music_Player.TMPlayer.PlayFile(9)
Music_Main.TMain.PlayFile(9)
Music_Main.TMain.lbPlayListDblClick($2913D10)
Miniaturansicht angehängter Grafiken
fehlermeldung.png   ueberwachte-ausdruecke.png  
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.788 Beiträge
 
Delphi 12 Athens
 
#2

AW: Noch ein Problem mit TMediaPlayer

  Alt 29. Jan 2025, 08:03
TMediaPlayer ist eben im Vergleich zu heutigen Mitteln sehr rudimentär. Und es kann sein, dass es auf anderen Rechnern andere Probleme gibt, auch abhängig davon, was dort an Codecs installiert ist. Außerdem kannst du vieles nur über MCI-Befehle steuern, das du in Bass und anderen Bibliotheken direkt machen kannst, z.B. das Gerät zur Wiedergabe auswählen.

Dazu kommt, dass Seeking nicht immer richtig funktioniert und eine recht hohe Verzögerung hat.

Insofern machst du dir mit TMediaPlayer viel Aufwand, ohne zu wissen, ob es hinterher auf allen Rechnern funktioniert. Zumal Fehlerangaben bei MCI unspezifisch sind, Multithreading nicht möglich ist, es seit Jahren als veraltet markiert ist und seit 20 Jahren nicht mehr weiterentwickelt wurde (es stammt ja aus Windows 3.1 von 1992), während z.B. Bass DirectSound, WASAPI, ASIO usw. unterstützt.

Frage am Rande:
Gibt es (mit Bordmitteln) eine Möglichkeit eine bestimmte Speicherstelle zu überwachen und bei einer Änderung automatisch an der Stelle, die die Änderung durchführt anzuhalten.
Du kannst einfach einen Datenhaltepunkt auf die Speicherstelle setzen. Das geht in der Liste der Haltepunkte (neben dem Knopf zum Hinzufügen das Dropdown aufklappen).
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Noch ein Problem mit TMediaPlayer

  Alt 29. Jan 2025, 09:26
TMediaPlayer ist eben im Vergleich zu heutigen Mitteln sehr rudimentär. Und es kann sein, dass es auf anderen Rechnern andere Probleme gibt, auch abhängig davon, was dort an Codecs installiert ist. Außerdem kannst du vieles nur über MCI-Befehle steuern, das du in Bass und anderen Bibliotheken direkt machen kannst, z.B. das Gerät zur Wiedergabe auswählen.

Dazu kommt, dass Seeking nicht immer richtig funktioniert und eine recht hohe Verzögerung hat.

Insofern machst du dir mit TMediaPlayer viel Aufwand, ohne zu wissen, ob es hinterher auf allen Rechnern funktioniert. Zumal Fehlerangaben bei MCI unspezifisch sind, Multithreading nicht möglich ist, es seit Jahren als veraltet markiert ist und seit 20 Jahren nicht mehr weiterentwickelt wurde (es stammt ja aus Windows 3.1 von 1992), während z.B. Bass DirectSound, WASAPI, ASIO usw. unterstützt.

Frage am Rande:
Gibt es (mit Bordmitteln) eine Möglichkeit eine bestimmte Speicherstelle zu überwachen und bei einer Änderung automatisch an der Stelle, die die Änderung durchführt anzuhalten.
Du kannst einfach einen Datenhaltepunkt auf die Speicherstelle setzen. Das geht in der Liste der Haltepunkte (neben dem Knopf zum Hinzufügen das Dropdown aufklappen).
Danke, jaenicke, besonders für den Tipp zum Haltepunkt.
Ja, TMediaPlayer ist schon sehr alt, wie auch mein Programm, das immer wenn ich am Rechner sitze, vor sich hin dudelt.
Ich bin im Prinzip zufrieden damit, und abgesehen von kleinen, vernachlässigbaren Macken, macht es alles so, wie ich es möchte.
Es muss auch nicht auf anderen Rechnern laufen können, weil ich das nur für meinen eigenen Bedarf geschrieben habe.
Davor, alles umzuschreiben (also nur mit Bass), scheue ich zurück, weil 1) recht aufwendig, 2) bringt mir nichts, oder nur wenig.

Schade, dass ich das mit dem Datenhaltepunkt nicht wusste; hätte viel Zeit gespart.
Noch einmal : Danke
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  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 09:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz