Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0134: Windows Media Player Visualisierungen im eigenen Programm verwenden

 von 

Beschreibung

Dieses Beispiel zeigt unter Verwendung der Schnittstellen IWMPEffects und IWMPEffects2 wie die Visualisierungen des Windows Media Player im eigenen Programm verwendet werden können.

Wichtig: Die Visualisierungen, die in der WMPLOC.DLL enthalten sind, können mit diesem Beispiel nicht geladen und angezeigt werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Framework-Version(en):

.NET Framework 1.0, .NET Framework 1.1, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, .NET Compact Framework 1.0, .NET Compact Framework 2.0, .NET Framework 4

.NET-Version(en):

Visual Basic 2002, Visual Basic 2003, Visual Basic 2005, Visual Basic 2008, Visual Basic 2010

Download:

Download des Beispielprojektes [16,9 KB]

' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Deployment
'  - System.Drawing
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ################################# Form1.vb ###################################
' ##############################################################################
Option Strict On
Option Explicit On

Imports Microsoft.Win32

Public Class Form1

    Private Const EffectsRoot As String = _
        "SOFTWARE\Microsoft\MediaPlayer\Objects\Effects"

    Private Structure InstWmpVis
        Dim VisName As String
        Dim ClassID As Guid
    End Structure

    Private rnd As New Random()
    Private bolRenderWin As Boolean = False
    Private cVis As New WmpVisual
    Private tRect As New WmpVisual.RECT
    Private tTimedLevel As New WmpVisual.TimedLevel
    Private bDummyFreq As Byte() = New Byte(WmpVisual.SA_BUFFER_SIZE - 1) {}
    Private bDummyWave As Byte() = New Byte(WmpVisual.SA_BUFFER_SIZE - 1) {}
    Private tInstWmpVis As InstWmpVis() = New InstWmpVis() {}

    Private Sub Form1_FormClosed(ByVal sender As Object, _
            ByVal e As System.Windows.Forms.FormClosedEventArgs) _
            Handles Me.FormClosed

        ' Timer stoppen
        Timer1.Enabled = False

        ' Ist ein Renderfenster vorhanden?
        If bolRenderWin = True Then
            ' Renderfenster löschen
            If cVis.Destroy = True Then
                bolRenderWin = False
            End If
        End If

        ' Visualisierung entladen
        cVis.DestroyVis()

        ' Klasse
        cVis = Nothing

    End Sub

    Private Sub Form1_Load(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Load

        cmdPropPage.Enabled = False
        cmdPropPage.Text = "Show Propertypage"
        cmdPresetDown.Enabled = False
        cmdPresetDown.Text = "<< Preset"
        cmdPresetUp.Enabled = False
        cmdPresetUp.Text = "Preset >>"

        ' RegistryKey, wo die Visualisierungen aufgelistet sind, öffnen
        Using VisRoot As RegistryKey = _
                Registry.LocalMachine.OpenSubKey(EffectsRoot)

            ' alle SubKeys auslesen
            Dim VisSubKeyNames As String() = VisRoot.GetSubKeyNames()

            ' Anzahl der SubKeys auslesen
            Dim VisCount As Integer = VisRoot.SubKeyCount

            ' Array zur Aufnahme der Werte dimensionieren
            Array.Resize(tInstWmpVis, VisCount)

            ' alle Visualisierungen auslesen
            For VisItem As Integer = 0 To VisCount - 1

                ' Name der Visualisierung auslesen
                tInstWmpVis(VisItem).VisName = VisSubKeyNames(VisItem)

                ' Name in die ComboBox einfügen
                cbInstVis.Items.Add(VisSubKeyNames(VisItem))

                ' RegistryKey, wo die ClassID der Visualisierungen ist, öffnen
                Using VisProp As RegistryKey = _
                    Registry.LocalMachine.OpenSubKey( _
                        EffectsRoot & "\" & VisSubKeyNames(VisItem) & _
                        "\Properties")

                    ' ClassID auslesen
                    tInstWmpVis(VisItem).ClassID = _
                        New Guid(VisProp.GetValue("classid").ToString)
                End Using
            Next
        End Using

        ' Erste Visualisierung selektieren
        cbInstVis.SelectedIndex = 0
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Timer1.Tick

        ' Nur symbolisch ein paar Zufallsdaten generieren die in der 
        '  Visualisierung angezeigt werden sollen. Normalerweise würden die 
        '  Daten vom WMP kommen. Hier müssen wir uns aber selbst um das befüllen
        '  der Daten kümmern. Zum Beispiel könnte man sich die Daten per 
        '  waveInAddBuffer von der Soundkarte holen.
        rnd.NextBytes(bDummyFreq)
        rnd.NextBytes(bDummyWave)

        ' Genaue Informationen welche Daten in der Struktur TimedLevel, speziell
        '  für Frequency und Waveform, erwartet werden, findet man in der 
        '  MSDN unter
        ' http://msdn.microsoft.com/en-us/library/dd564504%28VS.85%29.aspx

        ' TimedLevel Struktur füllen
        With tTimedLevel
            .State = WmpVisual.PlayerState.Play_State
            .Frequency.Data0 = bDummyFreq
            .Frequency.Data1 = bDummyFreq
            .Waveform.Data0 = bDummyWave
            .Waveform.Data1 = bDummyWave
        End With

        ' Timer stoppen damit die Visualisierung Zeit bekommt die Daten 
        '  zu rendern
        Timer1.Enabled = False

        ' ist ein Renderfenster vorhanden (IWmpEffects2)
        If bolRenderWin = True Then
            ' Visualisierung mit IWmpEffects2 auf dem Fenster rendern
            If cVis.RenderWindowed(tTimedLevel, True) = True Then
                ' war das Rendern erfolgreich, dann Timer wieder starten
                ' um die nächsten Daten zu rendern
                Timer1.Enabled = True
            End If
        Else
            ' ansonsten mit IWmpEffects rendern

            ' Rect Struktur füllen
            ' Größe und Position der Renderausgabe
            With tRect
                .Left = 0
                .Top = 0
                .Right = pbRenderVis.Size.Width
                .Bottom = pbRenderVis.Size.Height
            End With

            ' Visualisierung mit IWmpEffects auf dem Fenster rendern
            If cVis.Render(tTimedLevel, pbRenderVis.Handle, tRect) = True Then
                ' war das Rendern erfolgreich, dann Timer wieder starten
                ' um die nächsten Daten zu rendern
                Timer1.Enabled = True
            End If
        End If
    End Sub

    Private Sub cmdPropPage_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPropPage.Click

        ' Einstellungsfenster der Visualisierung anzeigen
        cVis.DisplayPropertyPage(Me.Handle)
    End Sub

    Private Sub cmdPresetUp_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPresetUp.Click

        ' ist die Nummer des aktuellen Preset kleiner der vorhandenen Presets
        If cVis.GetCurrentPreset < cVis.GetPresetCount - 1 Then
            ' Button aktivieren
            cmdPresetDown.Enabled = True

            ' nächsten Preset anzeigen
            If cVis.SetCurrentPreset(cVis.GetCurrentPreset + 1) = True Then
                ' ist die Nummer des aktuellen Preset gleich der 
                '  vorhandenen Presets
                If cVis.GetCurrentPreset = cVis.GetPresetCount - 1 Then
                    ' Button deaktivieren
                    cmdPresetUp.Enabled = False
                End If
            End If
        Else
            ' Button aktivieren
            cmdPresetUp.Enabled = True
        End If

        ' Anzeigen des aktuellen Presetnamen und die Anzahl der 
        '  vorhandenen Presets
        SetLblPresetName()
    End Sub

    Private Sub cmdPresetDown_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles cmdPresetDown.Click

        ' ist die aktuelle Presetnummer größer 0
        If cVis.GetCurrentPreset > 0 Then
            ' Button aktivieren
            cmdPresetUp.Enabled = True

            ' vorhergehenden Preset anzeigen
            If cVis.SetCurrentPreset(cVis.GetCurrentPreset - 1) = True Then
                ' ist die aktuelle Presetnummer gleich 0
                If cVis.GetCurrentPreset = 0 Then
                    ' Button deaktivieren
                    cmdPresetDown.Enabled = False
                End If
            End If
        Else
            ' Button aktivieren
            cmdPresetDown.Enabled = True
        End If

        ' Anzeigen des aktuellen Presetnamen und die Anzahl der 
        '  vorhandenen Presets
        SetLblPresetName()
    End Sub

    Private Sub SetLblPresetName()
        ' Anzeigen des aktuellen Presetnamen und die Anzahl der 
        '  vorhandenen Presets
        lblPresetName.Text = cVis.GetPresetTitle(cVis.GetCurrentPreset) & _
            " [Preset " & (cVis.GetCurrentPreset + 1).ToString & _
            " von " & cVis.GetPresetCount.ToString & "]"
    End Sub

    Private Sub cbInstVis_SelectedIndexChanged(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles cbInstVis.SelectedIndexChanged

        ' Timer stoppen
        Timer1.Enabled = False

        ' ist ein Renderfenster vorhnden
        If bolRenderWin = True Then
            ' Renderfenster löschen
            If cVis.Destroy = True Then
                bolRenderWin = False
            End If
        End If

        ' Visualisierung entladen
        cVis.DestroyVis()

        cmdPropPage.Enabled = False
        cmdPresetDown.Enabled = False
        cmdPresetUp.Enabled = False

        ' Visualisierung initialisieren
        ' Was nicht geht sind die Visualisierungen aus der wmploc.dll.
        If cVis.InitVis( _
                tInstWmpVis(cbInstVis.SelectedIndex).ClassID) = True Then

            ' Titel der Visualisierung auslesen
            Me.Text = cVis.GetTitle

            ' Ein Visualisierungsobjekt kann mehrere unterschiedliche 
            '  Visualisierungen enthalten. Diese werden Presets genannt.

            ' sind mehrere Presets vorhanden
            If cVis.GetPresetCount - 1 > 0 Then
                ' dann den Button PresetUp aktivieren
                cmdPresetUp.Enabled = True
            End If

            ' besitzt diese Visualisierung ein Einstellungsfenster
            If (cVis.GetCapabilities And _
                    WmpVisual.Capabilities.EFFECT_HASPROPERTYPAGE) = _
                    WmpVisual.Capabilities.EFFECT_HASPROPERTYPAGE Then

                ' dann Button PropPage aktivieren
                cmdPropPage.Enabled = True
            End If

            ' Anzeigen des aktuellen Presetnamen und die Anzahl der 
            '  vorhandenen Presets
            SetLblPresetName()

            ' unterstützt die Visualisierung das Interface IWmpEffects2
            If cVis.UsedIWmpEffects2 = True Then
                ' dann verwenden wir auch die Möglichkeiten dieses Interfaces

                ' ein Renderfenster erstellen
                bolRenderWin = cVis.Create(pbRenderVis.Handle)
            End If

            ' Timer starten
            Timer1.Interval = 25
            Timer1.Enabled = True
        Else
            pbRenderVis.Invalidate()
            lblPresetName.Text = _
                "Diese Visualisierung lässt sich nicht anzeigen."
            Me.Text = "Error"
        End If
    End Sub

End Class

' ##############################################################################
' ############################### WmpVisual.vb #################################
' ##############################################################################
Option Strict On
Option Explicit On

Imports System.Runtime.InteropServices

Public Class WmpVisual

    Public Const SA_BUFFER_SIZE As Integer = 1024
    Private Const TimedLevelMaxFrequency As Single = 22050
    Private Const TimedLevelMinFrequency As Single = 20
    Private Const S_OK As Integer = 0
    Private Const CLSCTX_INPROC_SERVER As Integer = 1
    Private IID_IUnknown As New Guid("00000000-0000-0000-C000-000000000046")
    Private WmpVis As Object = Nothing ' Visualisierungs-Objekt
    Private Effects As IWmpEffects ' Interface IWmpEffects
    Private Effects2 As IWmpEffects2 ' Interface IWmpEffects2

    <DllImport("ole32.dll", EntryPoint:="CoCreateInstance")> _
    Private Shared Function CoCreateInstance(ByRef clsid As Guid, _
        <MarshalAs(UnmanagedType.IUnknown)> ByVal inner As Object, _
        ByVal context As Integer, ByRef uuid As Guid, _
        <MarshalAs(UnmanagedType.IUnknown)> _
            ByRef rReturnedComObject As Object) As Integer
    End Function

    <DllImport("user32.dll", EntryPoint:="GetDC")> _
    Private Shared Function GetDC(ByVal hwnd As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll", EntryPoint:="ReleaseDC")> _
    Private Shared Function ReleaseDC(ByVal hwnd As IntPtr, _
            ByVal hdc As IntPtr) As Integer
    End Function

    ''' <summary>
    ''' Übergabewerte für dem Member State in der Struktur TimedLevel
    ''' </summary>
    ''' <remarks>
    '''   http://msdn.microsoft.com/en-us/library/dd564012%28VS.85%29.aspx
    ''' </remarks>
    Public Enum PlayerState As Integer
        Stop_State = 0
        Pause_State = 1
        Play_State = 2
    End Enum

    ''' <summary>
    ''' Rückgabewerte der Funktion GetCapabilities
    ''' </summary>
    ''' <remarks>
    '''   http://msdn.microsoft.com/en-us/library/dd563262%28VS.85%29.aspx
    ''' </remarks>
    Public Enum Capabilities As Integer
        EFFECT_CANGOFULLSCREEN = &H1
        EFFECT_HASPROPERTYPAGE = &H2
        EFFECT_VARIABLEFREQSTEP = &H4
        EFFECT_WINDOWED_ONLY = &H8
        EFFECT2_FULLSCREENEXCLUSIVE = &H10
    End Enum

    ''' <summary>
    ''' Wird benötigt um die Position und Größe des Visualisierungsfensters 
    ''' festzulegen, z.B. für die Funktion Render
    ''' </summary>
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure RECT
        Public Left As Integer
        Public Top As Integer
        Public Right As Integer
        Public Bottom As Integer
    End Structure

    ''' <summary>
    ''' Hilfsstruktur für TimedLevel als Ersatz für die zweidimensionalen Arrays
    ''' In VBC würde die Struktur TimedLevel so auschauen
    ''' Type TimedLevel
    '''     Frequency(1, SA_BUFFER_SIZE - 1) As Byte
    '''     Waveform(1, SA_BUFFER_SIZE - 1) As Byte
    '''     State As Long ' Enum PlayerState
    '''     TimeStamp As Currency ' Type LARGE_INTEGER
    ''' End Type
    ''' </summary>
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure Data
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=SA_BUFFER_SIZE)> _
        Public Data0() As Byte
        <MarshalAs(UnmanagedType.ByValArray, SizeConst:=SA_BUFFER_SIZE)> _
        Public Data1() As Byte
    End Structure

    ''' <summary>
    ''' Nimmt die Daten auf die dann gerendert werden sollen.
    ''' </summary>
    ''' <remarks>
    '''  http://msdn.microsoft.com/en-us/library/dd564504%28VS.85%29.aspx
    ''' </remarks>
    <StructLayout(LayoutKind.Sequential)> _
    Public Structure TimedLevel
        Public Frequency As Data
        Public Waveform As Data
        Public State As PlayerState
        Public TimeStamp As Int64
    End Structure

    ''' <summary>
    ''' Interface IWmpEffects
    ''' </summary>
    ''' <remarks>
    '''  http://msdn.microsoft.com/en-us/library/dd563253%28VS.85%29.aspx
    ''' </remarks>
    <Guid("D3984C13-C3CB-48e2-8BE5-5168340B4F35")> _
    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IWmpEffects

        Function Render(ByRef pLevels As TimedLevel, ByVal Hdc As IntPtr, _
                ByRef pRC As RECT) As Integer
        Function MediaInfo(ByVal lChannelCount As Integer, _
                ByVal lSampleRate As Integer, _
                ByVal bstrTitle As String) As Integer
        Function GetCapabilities(ByRef pdwCapabilities As Integer) As Integer
        Function GetTitle(ByRef bstrTitle As String) As Integer
        Function GetPresetTitle(ByVal nPreset As Integer, _
                ByRef bstrPresetTitle As String) As Integer
        Function GetPresetCount(ByRef count As Integer) As Integer
        Function SetCurrentPreset(ByVal currentpreset As Integer) As Integer
        Function GetCurrentPreset(ByRef currentpreset As Integer) As Integer
        Function DisplayPropertyPage(ByVal hwndOwner As IntPtr) As Integer
        Function GoFullScreen(ByVal fFullscreen As Boolean) As Integer
        Function RenderFullScreen(ByRef pLevels As TimedLevel) As Integer

    End Interface

    ''' <summary>
    ''' Interface IWmpEffects2
    ''' </summary>
    ''' <remarks>
    '''  http://msdn.microsoft.com/en-us/library/dd563254%28VS.85%29.aspx
    ''' </remarks> 
    <Guid("695386EC-AA3C-4618-A5E1-DD9A8B987632")> _
    <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IWmpEffects2

        Inherits IWmpEffects
        Shadows Function Render(ByRef pLevels As TimedLevel, _
            ByVal Hdc As IntPtr, ByRef pRC As RECT) As Integer
        Shadows Function MediaInfo(ByVal lChannelCount As Integer, _
            ByVal lSampleRate As Integer, ByVal bstrTitle As String) As Integer
        Shadows Function GetCapabilities( _
            ByRef pdwCapabilities As Integer) As Integer
        Shadows Function GetTitle(ByRef bstrTitle As String) As Integer
        Shadows Function GetPresetTitle(ByVal nPreset As Integer, _
            ByRef bstrPresetTitle As String) As Integer
        Shadows Function GetPresetCount(ByRef count As Integer) As Integer
        Shadows Function SetCurrentPreset( _
            ByVal currentpreset As Integer) As Integer
        Shadows Function GetCurrentPreset( _
            ByRef currentpreset As Integer) As Integer
        Shadows Function DisplayPropertyPage( _
            ByVal hwndOwner As IntPtr) As Integer
        Shadows Function GoFullScreen(ByVal fFullscreen As Boolean) As Integer
        Shadows Function RenderFullScreen( _
            ByRef pLevels As TimedLevel) As Integer
        Function SetCore(ByVal pPlayer As IntPtr) As Integer
        Function Create(ByVal hwndParent As IntPtr) As Integer
        Function Destroy() As Integer
        Function NotifyNewMedia(ByVal pMedia As IntPtr) As Integer
        Function OnWindowMessage(ByVal Msg As Integer, _
            ByVal WParam As Integer, ByVal LParam As Integer, _
            ByRef plResultParam As Integer) As Integer
        Function RenderWindowed(ByRef pData As TimedLevel, _
            ByVal fRequiredRender As Boolean) As Integer

    End Interface

    ''' <summary>
    ''' Lädt und initialisiert eine Visualisierung
    ''' </summary>
    ''' <param name="VisGUID">GUID einer Visualisierung</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    Public Function InitVis(ByVal VisGUID As Guid) As Boolean

        If WmpVis Is Nothing Then

            ' Visualisierung erstellen
            If CoCreateInstance(VisGUID, Nothing, _
                CLSCTX_INPROC_SERVER, IID_IUnknown, WmpVis) = S_OK Then

                ' Versuch auf IWmpEffects zu casten. Bei einem Fehlschlag,
                ' wird Nothing zurück gegeben und das Objekt WmpVis
                ' unterstützt das Interface IWmpEffects nicht.
                Effects = TryCast(WmpVis, IWmpEffects)

                If Effects IsNot Nothing Then

                    ' Versuch auf IWmpEffects2 zu casten. Bei einem Fehlschlag,
                    ' wird Nothing zurück gegeben und das Objekt WmpVis
                    ' unterstützt das Interface IWmpEffects2 nicht.
                    Effects2 = TryCast(WmpVis, IWmpEffects2)

                    ' wird das Interface IWmpEffects2 unterstützt, brauchen 
                    ' wir das Interface IWmpEffects nicht mehr.
                    If Effects2 IsNot Nothing Then
                        Effects = Nothing
                    End If

                    ' Erstes Preset setzen. Das muss sein da es ansonsten bei
                    ' einigen Visualisierungen zu einer AccessViolationException
                    ' führt.
                    Me.SetCurrentPreset(0)

                    InitVis = True

                End If
            End If
        End If

    End Function

    ''' <summary>
    ''' mit InitVis initialisierte Visualisierung löschen
    ''' </summary>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    Public Function DestroyVis() As Boolean

        ' ist ein Visualisierungs-Objekt vorhanden
        If WmpVis IsNot Nothing Then

            ' dann freigeben
            If Marshal.FinalReleaseComObject(WmpVis) = 0 Then

                If Effects2 IsNot Nothing Then
                    Effects2 = Nothing
                End If

                If Effects IsNot Nothing Then
                    Effects = Nothing
                End If

                WmpVis = Nothing
                DestroyVis = True

            End If
        End If

    End Function

    ''' <summary>
    ''' Ermittelt ob die Visualisierung das Interface IWmpEffects2 unterstützt
    ''' </summary>
    ''' <returns>
    '''   True = wird unterstützt / False = wird nicht unterstützt
    ''' </returns>
    Public Function UsedIWmpEffects2() As Boolean

        If Effects2 IsNot Nothing Then
            UsedIWmpEffects2 = True
        End If

    End Function

    ''' <summary>
    ''' Rendert die Visualisierung auf ein Fenster
    ''' </summary>
    ''' <param name="pLevels">Struktur TimedLevel</param>
    ''' <param name="hwndParent">Handle eines Fensters</param>
    ''' <param name="pRC">Struktur RECT</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function Render(ByRef pLevels As TimedLevel, _
            ByVal hwndParent As IntPtr, _
            ByRef pRC As RECT) As Boolean

        ' einen DC vom Handle holen
        Dim dcParent As IntPtr = GetDC(hwndParent)

        ' ist ein DC vorhanden
        If dcParent <> IntPtr.Zero Then

            ' wenn nicht das Interface IWmpEffects2 unterstützt wird
            If Effects2 Is Nothing Then

                ' dann Funktion aus IWmpEffects verwenden
                If Effects.Render(pLevels, dcParent, pRC) = S_OK Then
                    Render = True
                End If
            Else

                ' wenn doch, dann Funktion aus IWmpEffects2 verwenden
                If Effects2.Render(pLevels, dcParent, pRC) = S_OK Then
                    Render = True
                End If
            End If

            ' DC freigeben
            ReleaseDC(hwndParent, dcParent)
        End If

    End Function

    ''' <summary>
    ''' Sendet die Anzahl der Kanäle,Samplerate und einen Text an die 
    '''  Visualisierung
    ''' </summary>
    ''' <param name="lChannelCount">
    '''  Anzahl der Kanäle(1 für Mono, 2 für Stereo)
    ''' </param>
    ''' <param name="lSampleRate">
    '''  Samplerate in Hertz (Hz). Bsp. 22500 = 22.5KHz
    ''' </param>
    ''' <param name="bstrTitle">einen Text</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function MediaInfo(ByVal lChannelCount As Integer, _
        ByVal lSampleRate As Integer, ByVal bstrTitle As String) As Boolean

        If Effects2 Is Nothing Then
            If Effects.MediaInfo(lChannelCount, lSampleRate, _
                    bstrTitle) = S_OK Then

                MediaInfo = True
            End If
        Else
            If Effects2.MediaInfo(lChannelCount, lSampleRate, _
                    bstrTitle) = S_OK Then

                MediaInfo = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Eigenschaften der Visualisierung auslesen
    ''' </summary>
    ''' <returns>Enum Capabilities</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function GetCapabilities() As Integer

        Dim intRet As Integer = -1

        If Effects2 Is Nothing Then
            If Effects.GetCapabilities(intRet) = S_OK Then
                GetCapabilities = intRet
            End If
        Else
            If Effects2.GetCapabilities(intRet) = S_OK Then
                GetCapabilities = intRet
            End If
        End If

    End Function

    ''' <summary>
    ''' Namen der Visualisierung auslesen
    ''' </summary>
    ''' <returns>Name der Visualisierung</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function GetTitle() As String

        Dim strRet As String = ""

        If Effects2 Is Nothing Then
            If Effects.GetTitle(strRet) = S_OK Then
                GetTitle = strRet
            Else
                GetTitle = ""
            End If
        Else
            If Effects2.GetTitle(strRet) = S_OK Then
                GetTitle = strRet
            Else
                GetTitle = ""
            End If
        End If

    End Function

    ''' <summary>
    ''' Namen des aktuellen Presets auslesen
    ''' </summary>
    ''' <param name="nPreset">Presetnummer</param>
    ''' <returns>Name des Preset</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function GetPresetTitle(ByVal nPreset As Integer) As String

        Dim strRet As String = ""

        If Effects2 Is Nothing Then
            If Effects.GetPresetTitle(nPreset, strRet) = S_OK Then
                GetPresetTitle = strRet
            Else
                GetPresetTitle = ""
            End If
        Else
            If Effects2.GetPresetTitle(nPreset, strRet) = S_OK Then
                GetPresetTitle = strRet
            Else
                GetPresetTitle = ""
            End If
        End If

    End Function

    ''' <summary>
    ''' Anzahl der vorhandenen Presets in der Visualisierung auslesen
    ''' </summary>
    ''' <returns>Anzahl der vorhandenen Presets</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function GetPresetCount() As Integer

        Dim intRet As Integer = -1

        If Effects2 Is Nothing Then
            If Effects.GetPresetCount(intRet) = S_OK Then
                GetPresetCount = intRet
            End If
        Else
            If Effects2.GetPresetCount(intRet) = S_OK Then
                GetPresetCount = intRet
            End If
        End If

    End Function

    ''' <summary>
    ''' Setzt den Preset einer Visualisierung
    ''' </summary>
    ''' <param name="currentpreset">Presetnummer</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function SetCurrentPreset(ByVal currentpreset As Integer) As Boolean

        If Effects2 Is Nothing Then
            If Effects.SetCurrentPreset(currentpreset) = S_OK Then
                SetCurrentPreset = True
            End If
        Else
            If Effects2.SetCurrentPreset(currentpreset) = S_OK Then
                SetCurrentPreset = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Aktuelle Presetnummer der Visualisierung auslesen
    ''' </summary>
    ''' <returns>aktuelle Presetnummer</returns>
    ''' <remarks>IWMPEffects</remarks>
    Public Function GetCurrentPreset() As Integer

        Dim intRet As Integer = -1

        If Effects2 Is Nothing Then
            If Effects.GetCurrentPreset(intRet) = S_OK Then
                GetCurrentPreset = intRet
            End If
        Else
            If Effects2.GetCurrentPreset(intRet) = S_OK Then
                GetCurrentPreset = intRet
            End If
        End If

    End Function

    ''' <summary>
    ''' Öffnet das Einstellungsfenster der Visualisierung wenn vorhanden.
    ''' </summary>
    ''' <param name="hwndOwner">Handle eines Fensters</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function DisplayPropertyPage(ByVal hwndOwner As IntPtr) As Boolean

        If Effects2 Is Nothing Then
            If Effects.DisplayPropertyPage(hwndOwner) = S_OK Then
                DisplayPropertyPage = True
            End If
        Else
            If Effects2.DisplayPropertyPage(hwndOwner) = S_OK Then
                DisplayPropertyPage = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Schaltet die Visualisierung in den Vollbildmodus wenn unterstützt
    ''' </summary>
    ''' <param name="fFullscreen">
    '''  True = Vollbildmodus / False = Fenstermodus
    ''' </param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function GoFullScreen(ByVal fFullscreen As Boolean) As Boolean

        If Effects2 Is Nothing Then
            If Effects.GoFullScreen(fFullscreen) = S_OK Then
                GoFullScreen = True
            End If
        Else
            If Effects2.GoFullScreen(fFullscreen) = S_OK Then
                GoFullScreen = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Rendert die Visualisierung im Vollbildmodus
    ''' </summary>
    ''' <param name="pLevels">Struktur TimedLevel</param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects</remarks>
    Public Function RenderFullScreen(ByRef pLevels As TimedLevel) As Boolean

        If Effects2 Is Nothing Then
            If Effects.RenderFullScreen(pLevels) = S_OK Then
                RenderFullScreen = True
            End If
        Else
            If Effects2.RenderFullScreen(pLevels) = S_OK Then
                RenderFullScreen = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Ermöglicht den Zugriff auf die Windows Media Player APIs
    ''' </summary>
    ''' <param name="pPlayer">
    '''  normalerweise ein Pointer auf ein IWMPCore Interface
    ''' </param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function SetCore(ByVal pPlayer As IntPtr) As Boolean

        ' nur wenn die Visualisierung das Interface IWmpEffects2 unterstützt
        If Effects2 IsNot Nothing Then
            If Effects2.SetCore(pPlayer) = S_OK Then
                SetCore = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Erstellt ein Visualisierungsfenster
    ''' </summary>
    ''' <param name="hwndParent">
    '''  Handle eines Fensters, auf dem die Visualisierung
    '''   angezeigt werden soll. 
    ''' </param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function Create(ByVal hwndParent As IntPtr) As Boolean

        If Effects2 IsNot Nothing Then
            If Effects2.Create(hwndParent) = S_OK Then
                Create = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Das Visualisierungsfenster, das mit Create erstellt wurde, löschen.
    ''' </summary>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function Destroy() As Boolean

        If Effects2 IsNot Nothing Then
            If Effects2.Destroy = S_OK Then
                Destroy = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Informiert die Visualisierung das ein neues Media-Objekt geladen wurde
    ''' </summary>
    ''' <param name="pMedia">
    '''  normalerweise einen Pointer auf ein IWMPMedia Interface
    ''' </param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function NotifyNewMedia(ByVal pMedia As IntPtr) As Boolean

        If Effects2 IsNot Nothing Then
            If Effects2.NotifyNewMedia(pMedia) = S_OK Then
                NotifyNewMedia = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Sendet Nachrichten an das Visualisierungsfenster
    ''' </summary>
    ''' <param name="Msg">Message</param>
    ''' <param name="WParam">WParam</param>
    ''' <param name="LParam">LParam</param>
    ''' <returns>Rückgabewert der Funktion</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function OnWindowMessage(ByVal Msg As Integer, _
            ByVal WParam As Integer, ByVal LParam As Integer) As Integer

        Dim intRet As New Integer

        If Effects2 IsNot Nothing Then
            If Effects2.OnWindowMessage(Msg, WParam, LParam, intRet) = S_OK Then
                OnWindowMessage = intRet
            End If
        End If

    End Function

    ''' <summary>
    ''' Rendert eine Windowed Visualisierung
    ''' </summary>
    ''' <param name="pData">Struktur TimedLevel</param>
    ''' <param name="fRequiredRender">
    '''  True = muss sich selbst neu zeichnen / 
    '''   False = muss sich nicht selbst neu zeichnen
    ''' </param>
    ''' <returns>True = erfolgreich / False = nicht erfolgreich</returns>
    ''' <remarks>IWmpEffects2</remarks>
    Public Function RenderWindowed(ByRef pData As TimedLevel, _
            ByVal fRequiredRender As Boolean) As Boolean

        If Effects2 IsNot Nothing Then
            If Effects2.RenderWindowed(pData, fRequiredRender) = S_OK Then
                RenderWindowed = True
            End If
        End If

    End Function

    ''' <summary>
    ''' Umrechnung einer Frequenz zu einem Index für den Member Frequency 
    '''  in der Struktur TimedLefel
    ''' </summary>
    ''' <param name="Freq">Frequenz: min 20 Hz / max 22050 Hz</param>
    ''' <returns>
    '''  Index für den Member Frequency in der Struktur TimedLefel
    ''' </returns>
    Public Function Frequency_Index(ByVal Freq As Single) As Integer

        Frequency_Index = CInt((Freq - TimedLevelMinFrequency) / (( _
            TimedLevelMaxFrequency - TimedLevelMinFrequency) / _
            SA_BUFFER_SIZE))

    End Function

End Class

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

EffectsRoot ändern unter Win7/64Bit - VBFan 12.04.12 12:38 6 Antworten

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Frank Schüler am 10.08.2011 um 07:28

Hallo Roland

Sorry das ich Deine Frage erst jetzt entdeckt habe. Aber besser spät als nie. ;-)

Wie in den Kommentaren zum Code zu lesen reagiert die Visualisierung hier nicht auf gerade abgespielte Sounds. Dies funktioniert nur wenn die Visualisierung direkt im WMP aufgerufen wird. In diesem Bsp., wo die Visualisierung außerhalb des WMP läuft, muss man sich selbst um das befüllen der Struktur TimedLevel kümmern. Alles wichtige zur Struktur TimedLevel und wie die Daten vorliegen müssen findest Du in der MSDN.

Mfg Frank

Kommentar von Roland am 08.07.2010 um 11:02

Hallo,

ich habe den Quellcode in ein Programm von mir übernommen.
Ich muss sagen, das ist spitze. Nur habe ich eine Frage wo ich nicht weiterkomme.

Die Visualisierung reagiert nicht auf Sounds. Wenn ich den Code richtig gelesen habe sollte dies aber funktionieren.
Meine Frage: Was muss ich am Code eintragen um diesen Effekt zu erzielen bzw. sind die genannten parameter der Hrz Zahlen doch zuständig. Wie müssen diese eingetragen werden?

Über eine Antwort freue ich mich.

Gruß, Roland