Musik Spieler/Code

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ChOoSeMyNaMe.

    Musik Spieler/Code

    Schönen Abend Community!!
    Ich bin seit einigen Stunden an einem kleinen Programm am schreiben und bin schon weit gekommen. Es wird mal ein Musik Player, der mit Hilfe des Windows Media Player AddOn alle möglichen Formate abspielen kann (ich weiß, dass diese Formate vorinstalliert sein müssen, aber ich werde das Programm nur Privat verwenden, höchstens meinen Freunden zeigen).
    Ich werde euch mal den Code zeigen, dass ihr mal drüber gucken könnt. Ich weiß das der Code nicht perfekt geschrieben ist und nicht wirklich professionell wirkt... Aber mein "Schnupperkurs", den ich mal über VB 2010 gemacht habe, ist auch ein paar Tage her :D
    Also hier ist der Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
    5. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    6. End Sub
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. Me.Text = "All In One Player"
    9. End Sub
    10. Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenBTN.Click
    11. OpenFileDialog1.FileName = Nothing
    12. OpenFileDialog1.Multiselect = True
    13. If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    14. For Each Liste As String In OpenFileDialog1.FileNames
    15. ListBox1.Items.Add(Liste)
    16. Next
    17. ListBox1.SelectedIndex = 0
    18. Timer1.Enabled = True
    19. AxWindowsMediaPlayer1.Ctlenabled = True
    20. End If
    21. Label3.Text = "Anzahl: " _
    22. & ListBox1.Items.Count
    23. End Sub
    24. Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayBTN.Click
    25. If AxWindowsMediaPlayer1.URL = CStr(ListBox1.SelectedItem) Then
    26. AxWindowsMediaPlayer1.URL = ListBox1.Text
    27. DurationTimer.Enabled = True
    28. Me.Text = "All In One Player - " & IO.Path.GetFileNameWithoutExtension(AxWindowsMediaPlayer1.URL)
    29. End If
    30. 'Alle Lieder aus der Playlist wiederholen
    31. If CheckBox2.Checked Then
    32. Me.AxWindowsMediaPlayer1.URL = ListBox1.Items(ListBox1.SelectedIndex).ToString
    33. Do Until Me.AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped
    34. Application.DoEvents()
    35. If Me.AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
    36. If ListBox1.SelectedIndex < ListBox1.Items.Count - 1 Then
    37. ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
    38. Me.AxWindowsMediaPlayer1.URL = ListBox1.Items(ListBox1.SelectedIndex).ToString
    39. Else
    40. End If
    41. End If
    42. Loop
    43. End If
    44. End Sub
    45. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopBTN.Click
    46. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    47. Me.Text = "All In One Player"
    48. Label1.Text = "00:00"
    49. DurationTimer.Enabled = False
    50. TrackBar1.Value = 0
    51. Timer1.Enabled = False
    52. End Sub
    53. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PauseBTN.Click
    54. AxWindowsMediaPlayer1.Ctlcontrols.pause()
    55. End Sub
    56. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayListDEL.Click
    57. If ListBox1.Items.Count = 0 Then
    58. Exit Sub
    59. End If
    60. If MessageBox.Show(Me, "Willst du die angezeigten Lieder wirklich entfernen?", "Löschen", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) = DialogResult.OK Then
    61. ListBox1.Items.Clear()
    62. End If
    63. Label3.Text = "Anzahl: " _
    64. & ListBox1.Items.Count
    65. If WMPLib.WMPPlayState.wmppsPlaying Then
    66. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    67. Me.Text = "All In One Player"
    68. End If
    69. Timer1.Enabled = False
    70. AxWindowsMediaPlayer1.Ctlenabled = False
    71. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    72. End Sub
    73. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayListLOAD.Click
    74. If Not My.Settings.PlayList Is Nothing Then
    75. MessageBox.Show(Me, "Du hast noch keine PlayList erstellt!", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    76. Exit Sub
    77. End If
    78. ListBox1.Items.Clear()
    79. For Each item As String In My.Settings.PlayList
    80. ListBox1.Items.Add(item)
    81. Next
    82. End Sub
    83. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PlayListSAVE.Click
    84. If ListBox1.Items.Count = 0 Then
    85. MessageBox.Show(Me, "Füge erst Lieder in die Playlist ein, dann kannst du speichern!", "Negativ", MessageBoxButtons.OK, MessageBoxIcon.Information)
    86. Exit Sub
    87. Else
    88. Dim PlayList As New System.Collections.Specialized.StringCollection
    89. For Each item As String In ListBox1.Items
    90. PlayList.Add(item)
    91. Next
    92. My.Settings.PlayList = PlayList
    93. My.Settings.Save()
    94. MessageBox.Show(Me, "Deine PlayList wurde gespeichert. Beim nächsten Start der Anwendung auf 'Laden' Klicken.", "Gespeichert!", MessageBoxButtons.OK, MessageBoxIcon.Information)
    95. End If
    96. End Sub
    97. Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar2.Scroll
    98. AxWindowsMediaPlayer1.settings.volume = TrackBar2.Value
    99. Dim trackBarPercentageInteger As Integer = TrackBar2.Value * 100 \ TrackBar2.Maximum
    100. Label4.Text = String.Format(" {0}%", trackBarPercentageInteger)
    101. End Sub
    102. Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop
    103. Dim filePaths = CType(e.Data.GetData(DataFormats.FileDrop), String())
    104. For Each s As String In filePaths
    105. ListBox1.Items.Add(s)
    106. Next s
    107. Label3.Text = "Anzahl: " _
    108. & ListBox1.Items.Count
    109. End Sub
    110. Private Sub ListBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter
    111. If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    112. e.Effect = DragDropEffects.Copy
    113. End If
    114. Label3.Text = "Anzahl: " _
    115. & ListBox1.Items.Count
    116. End Sub
    117. Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    118. End Sub
    119. Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
    120. AxWindowsMediaPlayer1.URL = ""
    121. AxWindowsMediaPlayer1.URL = CStr(ListBox1.SelectedItem)
    122. AxWindowsMediaPlayer1.URL = ListBox1.Text
    123. If CheckBox2.Checked Then
    124. Me.AxWindowsMediaPlayer1.URL = ListBox1.Items(ListBox1.SelectedIndex).ToString
    125. Do Until Me.AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped
    126. Application.DoEvents()
    127. If Me.AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
    128. If ListBox1.SelectedIndex < ListBox1.Items.Count - 1 Then
    129. ListBox1.SelectedIndex = ListBox1.SelectedIndex + 1
    130. Me.AxWindowsMediaPlayer1.URL = ListBox1.Items(ListBox1.SelectedIndex).ToString
    131. Else
    132. End If
    133. End If
    134. Loop
    135. End If
    136. Timer1.Enabled = True
    137. DurationTimer.Enabled = True
    138. Me.Text = "All In One Player - " & IO.Path.GetFileNameWithoutExtension(AxWindowsMediaPlayer1.URL)
    139. End Sub
    140. Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
    141. AxWindowsMediaPlayer1.settings.setMode("loop", True)
    142. End Sub
    143. Private Sub Lautlos_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Lautlos.CheckedChanged
    144. If AxWindowsMediaPlayer1.settings.mute = True Then
    145. AxWindowsMediaPlayer1.settings.mute = False
    146. Else
    147. AxWindowsMediaPlayer1.settings.mute = True
    148. End If
    149. End Sub
    150. Private Sub DurationTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DurationTimer.Tick
    151. If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
    152. Label1.Text = "00:00"
    153. DurationTimer.Enabled = False
    154. TrackBar1.Value = 0
    155. End If
    156. End Sub
    157. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    158. Timer1.Enabled = True
    159. AxWindowsMediaPlayer1.Ctlenabled = True
    160. TrackBar1.Value = 0
    161. End Sub
    162. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    163. If CheckBox2.Checked And AxWindowsMediaPlayer1.Ctlcontrols.currentPosition >= AxWindowsMediaPlayer1.currentMedia.duration - 1 Then
    164. If (ListBox1.SelectedIndex + 1) = ListBox1.Items.Count Then
    165. ListBox1.SelectedIndex = 0
    166. Else
    167. ListBox1.SelectedIndex += 1
    168. End If
    169. End If
    170. If AxWindowsMediaPlayer1.Ctlcontrols.currentPosition >= AxWindowsMediaPlayer1.currentMedia.duration - 1 Then
    171. If (ListBox1.SelectedIndex + 1) = ListBox1.Items.Count Then
    172. AxWindowsMediaPlayer1.Ctlcontrols.stop()
    173. TrackBar1.Value = 0
    174. Else
    175. ListBox1.SelectedIndex += 1
    176. End If
    177. End If
    178. Label7.Text = " " & AxWindowsMediaPlayer1.currentMedia.durationString
    179. Label1.Text = " " & AxWindowsMediaPlayer1.Ctlcontrols.currentPositionString
    180. TrackBar1.Maximum = Format(CDbl(AxWindowsMediaPlayer1.currentMedia.duration), ".00")
    181. TrackBar1.Value = Format(CDbl(AxWindowsMediaPlayer1.Ctlcontrols.currentPosition), ".00")
    182. End Sub
    183. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    184. AxWindowsMediaPlayer1.Ctlcontrols.currentPosition = TrackBar1.Value
    185. End Sub
    186. End Class



    Es ist relativ viel zum lesen, da ich einige interessante Dinge mit eingebaut habe.
    Ich hoffe, dass ihr mir ein paar Ratschlöge geben könnt, was ich an dem Code verbessern kann :)

    Schönen Abend noch!

    Verschoben und Spoiler eingefügt. ~Trade
    Bilder
    • All In One Player.PNG

      16,28 kB, 1.131×610, 371 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    Also sry aber dieser Code is wirklich grausig, ich erkläre mal warum:
    -Du nutzt VB6-Gedöhns
    -Du gibst keinem deiner Controls richtige Namen, von daher ist dein Code allein schon ohne GUI nicht zu verstehen
    -Du hast scheinbar keine Ahnung von Events, wie man sie einsetzt, abonniert und wahrscheinlich auch kaum in die Doku des WMP geguckt und weisst von daher nichtmal was der alles bietet
    -Diese Timer sind ganz einfach durch Events ersetzbar
    -Du benutzt Settings, für Playlists ist XML oder gar ne DB einfach viel geeigneter
    -Du nutzt kein Parse/TryParse

    Und mMn finde ich, dass wenn man schon einen Musikplayer schreibt, dass man sich auch selbst um die Soundwiedergabe kümmert bspw mit CSCORE, wenn man den WMP nutzt und noch dazu einfach nur die selben Funktionen einbaut, wie der WMP selbst schon hat, warum sollte man dann den von dir programmierten nutzen?

    LG
    @ChOoSeMyNaMe Ich habe teilweise sogar Codes hier aus dem Forum verwendet, wenn ich an einer Stelle nicht weiter kam.. Also verstehe ich nicht ganz wieso du meinst, das ich "VB6-Gedöhns" nutze..
    Ansonsten weiß ich jetzt durch dich, dass mein Code Sch***e ist und das ich als "Anfänger" jetzt den kompletten Code neu schreiben darf, weil es zu unprofessionell ist.
    Trotzdem danke für deine Bemühung.
    Er ist nicht zu unprofessionell, er ist einfach nur schlecht. Hier mal ein paar Tipps:Übrigens: Viele hier im Forum nutzen VB6-Zeug, einfach, weil sie es nicht besser wissen. Daher der obige Thread.

    Ich muss aber @ChOoSeMyNaMe recht geben: Wenn du einen Button bspw. btnStopPlayback anstatt Button6 nennst, wird der Code deutlich übersichtlicher und verständlicher.

    ChOoSeMyNaMe schrieb:

    Und mMn finde ich, dass wenn man schon einen Musikplayer schreibt, dass man sich auch selbst um die Soundwiedergabe kümmert bspw mit CSCORE, wenn man den WMP nutzt und noch dazu einfach nur die selben Funktionen einbaut, wie der WMP selbst schon hat, warum sollte man dann den von dir programmierten nutzen?
    Auch hier hat er recht, denn warum sollte man deinen Player nutzen, wenn er genau das gleiche wie der Windows Media Player kann? Da kann man auch gleich den nutzen, und muss ihn sich nicht einmal installieren. Wenn du bspw. NAudio oder CSCore von @thefiloe nutzen würdest, hast du zwar etwas mehr Arbeit, könntest aber viel coolere Sachen mit deinem Player machen, so wie es bspw. @VincentTB mit Hurricane gemacht hat. Das ist übrigens nicht böse gemeint.

    LG :)

    ~ides

    Edit:

    VB.NET-Quellcode

    1. CStr(ListBox1.SelectedItem)
    könntest du durch

    VB.NET-Quellcode

    1. ListBox1.SelectedItem.ToString
    ersetzen. Dies ist nicht so fehleranfällig, denn die von Option Strict vorgeschlagenen Fehlerverbesserungen sind vollkommener Bullshit. Wenn du später mal bspw. auf C++ oder C# umsteigen möchtest, fliegst du durch Basic und Option Strict bei den Datentypen mächtig auf die Schnauze. Du solltest einfach immer schauen, wie du einen Fehler beheben könntest, ohne direkt die -schlechte- vorgeschlagene Verbesserung (für Faule) zu benutzen, welche die Option Strict eigentlich komplett nutzlos macht.

    Man sieht übrigens, dass du den Code 1zu1 kopiert hast, denn ein paar Zeilen später hast "du" es deutlich besser gelöst:

    VB.NET-Quellcode

    1. ListBox1.Items(ListBox1.SelectedIndex).ToString


    Weitergehend: Wie @ChOoSeMyNaMe ebenfalls erwähnt hat, hättest du die Timer durch Events ersetzen können: Alles über Events Deutlich sauberer, übersichtlicher und besser.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ichduersie“ ()

    Also sry aber das kaufe ich dir nicht ab. In dem Link von @ichduersie steht ALLES drin. Eine Featuresliste, eine Liste mit Projekten und eine Umfangreiche Doku mit Tutorials. Das ist zwar in C# aber das kann man problemlos konvertieren. Bei CSCore hast du ebenfalls eine recht umfangreiche Doku, viele Beispiele (auch in VB) und wird in mehreren Projekten verwendet. Du hast halt bei den Libraries keinen Soundplayer, den musst du selber schreiben, aber das ist weitaus sinnvoller als den WMP zu nutzen. Du kannst das nach deinen Vorstellungen programmieren und verstehst vorallem die Logik dahinter.

    LG