![]() |
Noch ein Problem mit TMediaPlayer
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hatte hier
![]() 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
Delphi-Quellcode:
das Abspielen dieser Datei veranlasst, und alles ist gut.
Main.FormCreate
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
Delphi-Quellcode:
wird ein
TMediaPlayer.Open
Delphi-Quellcode:
gemacht.
OpenParm.dwCallback := Handle;
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
Delphi-Quellcode:
wird FError=273 gesetzt und dann mit
FError := mciSendCommand(0, mci_Open, FFlags, UIntPtr(@OpenParm));
Delphi-Quellcode:
die besagte Fehlermeldung ausgelöst.
if FError <> 0 then {problem opening device}
raise EMCIDeviceError.Create(ErrorMessage) Wohlgemerkt: Das passiert nur, wenn nicht bereits im
Delphi-Quellcode:
eine .mp3 abgespielt wurde, und nur beim ersten Versuch, eine .mp3 abzuspielen.
Main.FormCreate
Nach tagelanger Suche habe ich herausgefunden, dass im
Delphi-Quellcode:
FFlags gesetzt wird.
TMediaPlayer.GetMode: TMPModes;
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
Delphi-Quellcode:
was bewirkt, dass ein Handle existiert und bei
Dummy:=MPlayer.Player.Handle;
Delphi-Quellcode:
nicht der im Aufrufstack gezeigte Rattenschwanz an Funktionsaufrufen gemacht wird.
OpenParm.dwCallback := Handle;
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) |
AW: Noch ein Problem mit TMediaPlayer
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. Zitat:
|
AW: Noch ein Problem mit TMediaPlayer
Zitat:
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:45 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