Windows Media Player Control Titel wird wiederholt bzw. gar nicht abgespielt

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Windows Media Player Control Titel wird wiederholt bzw. gar nicht abgespielt

    Guten Tag allerseits,

    ich habe folgendes Problem. Ich habe einen Code gebastelt, über den man steuern kann, ob ein Musiktitel oder die ganze Playlist wiederholt (oder eben nicht wiederholt) wiedergegeben wird. In HilfslisteDateinamen sind dabei die den entsprechenden Dateinamen der Titel aus der Playlist lstPlaylist gespeichert.

    Folgende Probleme:
    (1) Wenn Wiederholen = "Nein" dann springt der Index zwar zum nächsten Titel, und es kommt die MessageBox, dass der Titel abgespielt wird und wird dann abgespielt, doch nach dem drücken von OK kommt die Messagebox nochmal und die Wiedergabe hört dann wieder auf.
    (2) Wenn Wiederholen = "Track" oder Wiederholen = "Alles" wird der entsprechende Index auch richtig ausgewählt und es kommt die MessageBox, dass der richtige Titel abgespielt wird, jedoch wird nix abgespielt und der das WMP Control Player bleibt stumm.

    Hier mein Code:

    VB.NET-Quellcode

    1. Private Sub Player_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles Player.PlayStateChange
    2. If Player.playState = WMPLib.WMPPlayState.wmppsPlaying Then
    3. Timer1.Start()
    4. TrackBar1.Maximum = CInt(Player.currentMedia.duration)
    5. TrackBar1.Value = CInt(Player.Ctlcontrols.currentPosition)
    6. ElseIf Player.playState = WMPLib.WMPPlayState.wmppsMediaEnded Then
    7. If Wiederholen = "Nein" Then
    8. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    9. Else
    10. NächsterTrack()
    11. End If
    12. ElseIf Wiederholen = "Alles" Then
    13. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    14. lstPlaylist.SelectedIndex = 0
    15. Else
    16. lstPlaylist.SelectedIndex = lstPlaylist.SelectedIndex + 1
    17. End If
    18. End If
    19. Abspielen()
    20. End If
    21. End Sub
    22. Public Sub Abspielen()
    23. If Player.playState <> WMPLib.WMPPlayState.wmppsPlaying Then
    24. If lstPlaylist.Items.Count = 0 Then
    25. MessageBox.Show("Du musst zuerst mindestens einen Musiktitel der Playlist zufügen!")
    26. Else
    27. Dim FileMp3WithPath As String
    28. If lstPlaylist.SelectedIndex = -1 Then lstPlaylist.SelectedIndex = 0
    29. FileMp3WithPath = HilfslisteDateinamen(lstPlaylist.SelectedIndex)
    30. Me.ToolTip1.SetToolTip(picPlay, "Pausiere hier den aktuell gespielten Musiktitel...")
    31. If Player.URL <> FileMp3WithPath Then Player.URL = FileMp3WithPath
    32. MessageBox.Show("Der Titel " & Player.URL & " wird jetzt von Sub Abspielen() abgespielt.")
    33. Player.Ctlcontrols.play()
    34. picPlay.Image = My.Resources.Pause
    35. End If
    36. ElseIf Player.playState = WMPLib.WMPPlayState.wmppsPlaying Then
    37. Me.ToolTip1.SetToolTip(picPlay, "Spiele hier den ausgewählten Musiktitel aus der Playlist ab...")
    38. Player.Ctlcontrols.pause()
    39. picPlay.Image = My.Resources.Play
    40. End If
    41. End Sub


    Ich hoffe ich hab das ausführlich genug beschrieben, wenn nicht bitte kurz melden :)
    Wie kommt der Wert von Wiederholen zustande bzw. woher kommt der?
    Wo ist die Methode NächsterTrack?
    btw: lstPlaylist.SelectedIndex = lstPlaylist.SelectedIndex + 1 -> lstPlaylist.SelectedIndex += 1

    Drückst Du bei der MessageBox Enter oder klicks Du auf [OK]? Bei ersterem hab ich es schon (in anderen Programmen) erlebt, dass das dann nochmal verarbeitet wird. Musst Du schauen, ob der Play/Pause-Button mehrmals sein Click-Event feuert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Sry mein Fehler. Wiederholen kommt durch Klick auf eine PictuteBox zu Stande:

    VB.NET-Quellcode

    1. Private Sub picWiederholen_Click(sender As Object, e As EventArgs) Handles picWiederholen.Click
    2. If Wiederholen = "Nein" Then
    3. Wiederholen = "Track"
    4. Me.ToolTip1.SetToolTip(picWiederholen, "Der aktuelle Musiktitel wird wiederholt wiedergegeben...")
    5. ElseIf Wiederholen = "Track" Then
    6. Wiederholen = "Alles"
    7. Me.ToolTip1.SetToolTip(picWiederholen, "Die komplette Playlist wird wiederholt wiedergegeben...")
    8. ElseIf Wiederholen = "Alles" Then
    9. Wiederholen = "Nein"
    10. Me.ToolTip1.SetToolTip(picWiederholen, "Wiederholen: ausgeschaltet...")
    11. End If
    12. End Sub


    Und die Methode NächsterTrack:

    VB.NET-Quellcode

    1. Private Sub NächsterTrack()
    2. Player.Ctlcontrols.stop()
    3. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    4. lstPlaylist.SelectedIndex = 0
    5. Else
    6. lstPlaylist.SelectedIndex = lstPlaylist.SelectedIndex + 1
    7. End If
    8. Abspielen()
    9. End Sub


    OK jetzt hab ichs gemerkt. Ich rufe Abspielen() zwei Mal auf... Daher wenn keine Wiederholung eingestellt ist, die zwei MessageBoxen. Und dass der Track nach der zweiten MessageBox wieder aufhört zu spielen wird der gleiche Grund sein, dass wenn Alles oder Track gewählt ist, gar nichts abgespielt wird. Mir ist bloss noch nicht klar warum nicht??

    kafffee schrieb:

    Mir ist bloss noch nicht klar warum??
    Da hilft nur Debuggen (hatten wir schon):
    Debuggen, Fehler finden und beseitigen
    Dein Fehler besteht darin, dass Du glaubst, Dein Code würde genau so funktionieren, wie Du glaubst, dass er es tun soll.
    Du überzeugst Dich nicht davon, dass es so ist, und schon ist da ein Fehler.
    Und je weiteer Du programmierst, ohne Dich von der Richtigkeit Deines Codes zu überzeugen, um so verschachtelter werden die Fehler.
    ====
    Du musst so was wie eine Spezifikation machen, und gegen die kannst Du dann testen.
    Wenn Du das nicht machst, testest Du gegen Gutdünken.
    Ob die Spezifikation selbst korrekt ist, steht auf einem anderen Blatt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    z.B. ein Zustandsablaufplan:
    • zu Beginn: Player ist aus
    • wenn man [>] drückt, soll die Buttonbeschriftung zu [||] werden und der Song soll abgespielt werden
    • wenn man [||] drückt, soll das Abspielen angehalten werden und der Button wird mit [>] beschriftet
    • wenn man auf Stop drückt, soll das Aspielen abgebrochen werden und die Songwiedergabeposition auf 0:00 gesetzt werden
    ne Checklsite von Punkten, die Dein Programm erfüllen soll. Mit der solltest Du testen, was Dein Programm (schon) kann und was (noch) nicht. Oder auch, was falsch läuft.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou.
    @kafffee Nenn es meinetwegen "Bedienungsanleitung". ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    OK hab mich mal ein bisschen reingehängt. Hier meine Checkliste:

    (1) Ganz normal über meine PictureBox absielen und pausieren --> funzt

    VB.NET-Quellcode

    1. Private Sub picPlay_Click(sender As Object, e As EventArgs) Handles picPlay.Click
    2. Abspielen()
    3. End Sub


    (2) Wenn der Track zu Ende ist, wird Player.playState = WMPLib.WMPPlayState.wmppsMediaEnded ausgelöst und dementsprechend Sub Abspielen() aufgerufen und die relevanten Parameter stimmen (Player.URL in Zeile 34 und lstPlaylist.SelectedIndex in Zeile 32). Ganz egal, ob Wiederholen = "Nein" oder "Track" oder "Alles". Das funktioniert wie gewünscht. Bloss es kommt halt keine Musik, wenn Sub Abspielen() von Private Sub Player_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles Player.PlayStateChange her aufgerufen wird.

    Daher ist mein Gedanke: Der Windows Media Player ist wohl bei Punkt (2) in irgend einem Zustand, der das Abspielen nicht zulässt oder macht irgendwas in einem anderen Thread
    oder so. Und anstatt eine Fehlermeldung auszulösen wird das einfach ignoriert.

    Was meint ihr dazu?
    @kafffee Kannst Du mal das bereinigte und gezippte Projekt posten (ohne obj, bin und vs-Verzeichnisse)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee ohne die geht nix: HundredMilesSoftware.UltraID3Lib
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee AxWMPLib ist per Link eingebettet, gibt es da eine AxWMPLib.Interop.dll oder so was?
    ====

    Du solltest Dich noch mal hiermit befassen:
    Visual Studio - Empfohlene Einstellungen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Bei Ordner suchen solltest Du ein sinnvolles Verzeichnis voreinstellen.
    Die Klassen und die Dateien, in denen sie abgelegt sind, tragen denselben Namen.
    Lösch einen Titel in der PlayList, füge danach einen anderen hinzu (knallt)
    Klassen werden im Projektmappenexplorer umbenannt. Draufklicken, F2.
    Verstehe, wie Dialoge instanziiert werden:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    ====
    Ich behaupte mal:
    Im Sub

    VB.NET-Quellcode

    1. Private Sub Player_PlayStateChange(sender As Object, e As _WMPOCXEvents_PlayStateChangeEvent) Handles Player.PlayStateChange
    rufst Du unten Abspielen() auf.
    Player.playState hat da den falschen Wert.
    Erst, wenn man auf das ||-Bild klickt, spielt er richtig weiter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Die Klassen und die Dateien, in denen sie abgelegt sind, tragen denselben Namen.

    Du meinst sie sollten den glleichen Namen tragen?? Meine ClassMP3Datei wird ja im Projektmappenexplorer z.B. nur Class1 genannt...

    RodFromGermany schrieb:

    Lösch einen Titel in der PlayList, füge danach einen anderen hinzu (knallt)

    Du meinst der Fehler, dass die DataSource schon gesetzt ist? Das ist mir auch schon aufgefallen, da bin ich dran...

    RodFromGermany schrieb:

    rufst Du unten Abspielen() auf.
    Player.playState hat da den falschen Wert.
    Erst, wenn man auf das ||-Bild klickt, spielt er richtig weiter.

    Jep so ist es bei mir auch... Also lag ich richtig in der Vermutung, dass der WinMediaPlayer in einem PlayState ist der kein Abspielen zulässt... Was ich nicht verstehe ist, warum das dann funktioniert wenn man auf picPlay drückt, aber nicht, wenn man die Sub Abspielen aus dem PlayStateChange-Ecent heraus aufruft. GIbt es da eine Abhilfe? Ansonsten muss ich dann wohl doch auf die WindowsMediaPlayer-eigene Playlist zurückgreifen, obwohl ich das eigentlich vermeiden wollte...

    kafffee schrieb:

    Du meinst sie sollten den glleichen Namen tragen??
    Klassen und kommunizierende Dateien MÜSSEN den gleichen Namen tragen. Punkt.

    kafffee schrieb:

    GIbt es da eine Abhilfe?
    Muss ich mal in Ruhe probieren.
    Möglicherweise genügt es, wenn Du im Eventhandler vor Aufruf der Abspiel-Routine einfach Player.play() aufrufst, das wäre dann allerdings ein Arbeitsdrumherum.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @kafffee Wenn beide Namen verschieden sind, kopierst Du den Namen aus dem vb-Code und benennst damit die vb-Datei im Projektmappenexplorer um.
    Danach geht es wie vorgesehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Guck mal hier ich hab im Internet ein paar Lösungsansätze gefunden. Obwohls teilweise ein bisschen getrickst ist...

    (1) Die Autostart-Eigenschaft des Controls auf True setzen...
    Oder
    (2) Die Methode statt direkt aufzurufen über ein Timer.Tick-Event. Wobei den Intervall so zu setzen dass es auf jeder Maschine funktioniert eine Herausforderung werden wird.

    Ich probier das mal aus und melde mich dann nochmal...