|
Das nachfolgende Klassenmodul für VB.Net kapselt den Windows Media Player via Late Binding. Dadurch entsteht keine Abhängigkeit zu einer speziellen Version des WMPs. Auch wird nicht mit Interop-Dlls gedealt :-)
Die Klasse kann dafür genutzt werden, um Musik Dateien (MP3 Files) oder Live Streams wie bspw. Web-Radio Sreams abzuspielen.
''' <summary>
''' Aufzählung der Player Rückgabewerte
''' </summary>
Public Enum PlayState
Undefined = 0
Stopped = 1
Paused = 2
Playing = 3
ScanForward = 4
ScanReverse = 5
Buffering = 6
Waiting = 7
MediaEmbed = 8
Busy = 9
Ready = 10
Reconnecting = 11
Last = 12
End Enum
''' <summary>
''' WMPNetWrapper Klassenmodul
''' ==========================
''' Das Klassenmodul erzeugt eine Instanz des Windows Media Players.
''' Die Instanz wird über "Late Binding" erzeugt, so dass keine Abhängigkeit
''' zu einer speziellen Version des WMPs besteht. Das Klassenmodul kann
''' dazu genutzt werden, um Musik Dateien oder Streams aus dem Internet
''' abzuspielen - z.B. Web-Radio Streams.
''' </summary>
Public Class WMPNetWrapper
Private m_Player As Object
Private isInitialized As Boolean = False
Private m_PlayerStatus As Integer = PlayState.Undefined
Private m_Timer As New Timer With {.Interval = 250, .Enabled = False}
Public Event ErrorOccured(ByVal sender As WMPNetWrapper, ByVal e As Exception)
Public Event CurrentStatus(ByVal sender As WMPNetWrapper, ByVal Msg As String)
Public Event StatusChange(ByVal sender As WMPNetWrapper, ByVal e As PlayState)
Public Sub New()
Me.InitializeComponent()
End Sub
''' <summary>
''' Initialisiert die Klasse und erstellt ein "Late Binding"
''' Objekt zur Laufzeit.
''' </summary>
Private Sub InitializeComponent()
Dim t As Type = Type.GetTypeFromProgID("WMPlayer.OCX")
If t IsNot Nothing Then
Try
m_Player = CreateObject("WMPlayer.OCX")
m_Player.settings.autoStart = True
m_Timer.Enabled = True
AddHandler m_Timer.Tick, AddressOf TimerTick
isInitialized = True
Catch ex As Exception
isInitialized = False
Throw New Exception(ex.Message)
End Try
End If
End Sub
''' <summary>
''' Legt fest, ob beim Aufruf der Open Methode der Stream sofort abgespielt
''' werden soll. Bei False muss dann nach dem Open Aufruf noch die Play
''' Methode ausgeführt werden.
''' </summary>
Public Property AutoStart() As Boolean
Get
Return m_Player.settings.autostart
End Get
Set(ByVal value As Boolean)
Try
m_Player.settings.autostart = value
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Set
End Property
''' <summary>
''' Regelt die Lautsprecher Balance, oder liest diese aus.
''' </summary>
''' <value>Ein gültiger Wert zwischen 0 - 100</value>
Public Property Balance() As Integer
Get
Return m_Player.settings.balance
End Get
Set(ByVal value As Integer)
Try
m_Player.settings.balance = value
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Set
End Property
''' <summary>
''' Gibt die Spieldauer des aktuellen Streams zurück.
''' </summary>
Public ReadOnly Property Duration() As Double
Get
Return m_Player.currentMedia.duration
End Get
End Property
''' <summary>
''' Schaltet die Lautsprecher ein oder aus.
''' </summary>
''' <remarks>Die aktuelle Wiedergabe wird dabei nicht unterbrochen.</remarks>
Public Property Mute() As Boolean
Get
Return m_Player.settings.mute
End Get
Set(ByVal value As Boolean)
Try
m_Player.settings.mute = value
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Set
End Property
''' <summary>
''' Öffnet einen Mediastream zur Wiedergabe.
''' </summary>
''' <param name="MediaStream">Einen gültigen Pfad oder URL zum Mediastream.</param>
''' <remarks>Der Media Player unterstützt ebenfalls Web-Radio Streams.
''' Hierbei können nur direkte URLs angegeben werden. SHOUTcast und ICEcast
''' Playlists werden nicht unterstützt. Diese müssen separat geparst werden,
''' um die Kanäle zu Ermitteln. Die ermittelten Kanäle können dann zur Wiedergabe
''' geöffnet werden.</remarks>
Public Sub Open(ByVal MediaStream As String)
If Not isInitialized Then Exit Sub
Try
Me.Stop()
m_Player.url = MediaStream
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Sub
''' <summary>
''' Unterbricht die aktuelle Wiedergabe.
''' </summary>
Public Sub Pause()
Try
If m_PlayerStatus <> PlayState.Paused Then
m_Player.controls.pause()
End If
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Sub
''' <summary>
''' Spielt den aktuell geöffneten Stream ab.
''' </summary>
Public Sub Play()
Try
If m_PlayerStatus <> PlayState.Playing Then
m_Player.controls.play()
End If
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Sub
''' <summary>
''' Gibt den Player-Status als PlayState Enum zurück.
''' </summary>
Public ReadOnly Property PlayerStatus() As PlayState
Get
Return m_PlayerStatus
End Get
End Property
''' <summary>
''' Positioniert den aktuellen Wiedergabepointer, oder liest diesen aus.
''' </summary>
''' <value>Ein gültiger Wert zwischen 0 - Duration (Spieldauer)</value>
''' <remarks>Siehe auch die Eigenschaft "Duration"</remarks>
Public Property Position() As Double
Get
Return m_Player.controls.currentPosition
End Get
Set(ByVal value As Double)
Try
m_Player.controls.currentPosition = value
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Set
End Property
''' <summary>
''' Gibt den Player-Status als Text zurück.
''' </summary>
Public ReadOnly Property Status() As String
Get
Return m_Player.status
End Get
End Property
''' <summary>
''' Stoppt die Wiedergabe des aktuellen Streams.
''' </summary>
Public Sub [Stop]()
Try
If m_PlayerStatus <> PlayState.Stopped Then
m_Player.controls.stop()
End If
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Sub
''' <summary>
''' Fährt mit der unterbrochenen Wiedergabe fort.
''' </summary>
Public Sub [Resume]()
Try
If m_PlayerStatus = PlayState.Paused Then
Me.Play()
End If
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Sub
''' <summary>
''' Setzt den Lautstärkepegel, oder liest diesen aus.
''' </summary>
''' <value>Ein gültiger Wert zwischen 0 - 100</value>
Public Property Volume() As Integer
Get
Return m_Player.settings.volume
End Get
Set(ByVal value As Integer)
Try
m_Player.settings.volume = value
Catch ex As Exception
m_PlayerStatus = PlayState.Undefined
RaiseEvent ErrorOccured(Me, ex)
End Try
End Set
End Property
''' <summary>
''' Delegate TimerTick
''' </summary>
''' <remarks>Der Timer feuert den Status als Event in die aufrufende Form zurück
''' </remarks>
Private Sub TimerTick(ByVal sender As Object, ByVal e As System.EventArgs)
Static LastState As PlayState = -1
Static CurrentState As PlayState = -1
CurrentState = m_Player.playstate
If LastState <> CurrentState Then
m_PlayerStatus = CurrentState
LastState = CurrentState
RaiseEvent StatusChange(Me, m_PlayerStatus)
End If
RaiseEvent CurrentStatus(Me, Me.Status)
End Sub
End Class
Letzte Änderung: 01 Feb 2009 at 09:20
Zurück |