Einfacher Audio-Player

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von rotherford.

    Einfacher Audio-Player

    Hallo zusammen!

    Ich habe einen einfachen Player programmiert:

    VB.NET-Quellcode

    1. Public Class Player
    2. Private playlist As New List(Of String)
    3. Private songIndex As Byte
    4. Private Sub play(ByVal songPath As String)
    5. My.Computer.Audio.Play(songPath)
    6. End Sub
    7. Sub New(ByVal path As String)
    8. For Each foundFile As String In My.Computer.FileSystem.GetFiles(path)
    9. If System.IO.Path.GetExtension(foundFile) = ".wav" Then
    10. playlist.Add(foundFile)
    11. End If
    12. Next
    13. End Sub
    14. Sub startSong()
    15. play(playlist.Item(songIndex))
    16. End Sub
    17. Sub stopSong()
    18. My.Computer.Audio.Stop()
    19. End Sub
    20. Sub nextSong()
    21. songIndex = (songIndex + 1) Mod playlist.Count
    22. play(playlist.Item(songIndex))
    23. End Sub
    24. End Class


    Dabei möchte ich den Windows Media Player nicht verwenden, welchen ich auch nicht installiert habe.
    Nun habe ich folgende Schwierigkeiten:
    1) Die Wiedergabe endet nachdem die erste Audiodatei abgespielt ist. Ist es möglich die Wiedergabe automatisch mit der nächsten Datei fortzusetzten?
    Ich habe mir überlegt, dass ein Timer mit der Länge des Stückes gestartet werden könnte, welcher das nächste Stück aufruft. Allerdings ist die Länge des Stückes nicht bekannt und es ist auch nicht gerade eine schöne Lösung.
    2) Es sind nur wav-Dateien unterstützt.
    Via API wäre wohl auch das vorherige Problem lösbar, allerdings habe ich damit noch keine Erfahrung... Mit diesem Code lassen sich wohl nur wav-Dateien abspielen.

    Verschiedene Erweiterungen wie das Pausieren der Wiedergabe oder das auslesen von Informationen der Audiodatei wären toll aber nicht notwendig. Die Idee wäre ein möglichst schlanker Player, welcher im Hintergrund einer Applikation eine Playlist abspielen kann.

    lg marx

    Marx schrieb:

    Die Wiedergabe endet nachdem die erste Audiodatei abgespielt ist. Ist es möglich die Wiedergabe automatisch mit der nächsten Datei fortzusetzten?

    Für dein Vorhaben ist der My-Namespace unpassend. Wenn du etwas WMP-Unabhängiges willst, solltest du dich mit mci od. der Bass.dll beschäftigen.
    Wenn du Beispiel dazu suchst solltest du auf CodeProject gucken. (Stichwort : MciSendString)

    Es werden auf deine Weise halt nur .wav Dateien unterstützt.
    Liebe Grüße
    /nicht getestet
    hey & danke für den Beitrag.
    ich habe nun mit der BasicAudio.dll folgende Klasse Programmiert:

    VB.NET-Quellcode

    1. Public Class Player
    2. Private argusPlayer As Argus.Audio.AudioFile
    3. Private playlist As New List(Of String)
    4. Private songIndex As Byte
    5. Private songHasFinished As Boolean
    6. Sub New(ByVal path As String)
    7. For Each foundFile As String In My.Computer.FileSystem.GetFiles(path)
    8. If System.IO.Path.GetExtension(foundFile) = ".mp3" Then
    9. playlist.Add(foundFile)
    10. End If
    11. Next
    12. argusPlayer = New Argus.Audio.AudioFile(playlist.Item(0))
    13. End Sub
    14. Sub playSong()
    15. argusPlayer.Play()
    16. songHasFinished = True
    17. End Sub
    18. Sub stopSong()
    19. argusPlayer.Stop()
    20. songHasFinished = False
    21. End Sub
    22. Private Sub pauseSong()
    23. argusPlayer.Pause()
    24. End Sub
    25. Private Sub resumeSong()
    26. argusPlayer.Resume()
    27. End Sub
    28. Sub pauseResumeSong()
    29. If Not argusPlayer.IsPaused Then
    30. pauseSong()
    31. Else
    32. resumeSong()
    33. End If
    34. End Sub
    35. Private Sub changeSong()
    36. songHasFinished = False
    37. argusPlayer.Close()
    38. argusPlayer.Filename = playlist.Item(songIndex)
    39. playSong()
    40. End Sub
    41. Sub nextSong()
    42. songIndex = (songIndex + 1) Mod playlist.Count
    43. changeSong()
    44. End Sub
    45. Sub previousSong()
    46. songIndex = (songIndex + playlist.Count - 1) Mod playlist.Count
    47. changeSong()
    48. End Sub
    49. Private Sub autoProceed() 'argusPlayer.Status-Changed-Event
    50. If argusPlayer.Status.Remove(7) = "stopped" And songHasFinished Then
    51. nextSong()
    52. End If
    53. End Sub
    54. End Class


    Mit dem argusPlayer.Status-String wird auch die automatische Wiedergabe der Playlist realisierbar. Liesse sich da ein Event auslösen, wenn der Wert der Status-Variable geändert wird (Z 60)?

    lg Marx
    hmm ich habe einmal folgendes versucht:

    VB.NET-Quellcode

    1. Dim WithEvents argusPlayer As Argus.Audio.AudioFile
    2. Sub eventHandler Handles argusPlayer.
    3. End Sub


    Nach dem „Handles“ sollte doch eig. ein Event angegeben werden, doch da wird vom Editor keins vorgeschlagen… Es ist heute zum ersten Mal, dass ich mich mit Events auseinandersetzte, auch wenn ich diese schon häufiger verwendet habe.
    Die erweiterte Klasse:

    VB.NET-Quellcode

    1. Private Class ExtendedAudioFile
    2. Inherits Argus.Audio.AudioFile
    3. Implements System.ComponentModel.INotifyPropertyChanged
    4. Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    5. End Class


    Und die Sub, welche den nächsten Song abspielt:

    VB.NET-Quellcode

    1. Private Sub autoProceed() Handles argusPlayer.PropertyChanged
    2. If argusPlayer.Status.Remove(7) = "stopped" And songHasFinished Then
    3. nextSong()
    4. End If
    5. End Sub


    Das Event PropertyChanged wird allerdings nicht aufgerufen,
    wenn eine Eigenschaft des Players geändert wird. Muss ich da noch ein RaiseEvent
    einbauen oder kann man AudioFile.Filename als Property deklarieren?
    Ja,

    VB.NET-Quellcode

    1. Private Class ExtendedAudioFile
    2. Inherits Argus.Audio.AudioFile
    3. Implements INotifyPropertyChanged
    4. Public Event PropertyChanged As PropertyChangedEventHandler _
    5. Implements INotifyPropertyChanged.PropertyChanged
    6. Private Sub NotifyPropertyChanged(ByVal info As String)
    7. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
    8. End Sub
    9. Public Overloads Property PlayState As String
    10. Get
    11. Return MyBase.PlayState
    12. End Get
    13. Set(ByVal value As String)
    14. MyBase.PlayState = value
    15. NotifyPropertyChanged("PlayState")
    16. End Set
    17. End Property
    18. End Class
    /nicht getestet