Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0021: Einfache Sounds mit Direct Sound 8 abspielen

 von 

Beschreibung

Das Beispiel zeigt wie man über COM-Interop mit DirectSound eine Sounddatei abspielen kann.

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-Version(en):

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

Download:

Download des Beispielprojektes [138,27 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 2002/2003
' Option Strict:    An
' Option Explicit:  An
'
' Referenzen: 
'  - System
'  - System.Drawing
'  - System.Windows.Forms
'  - DxVBLibA
'

' ##############################################################################
' ################################ DxSound.vb ##################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports DxVBLibA
Imports System

' <remarks>
'   Stellt grundlegende Funktionalität zum Abspielen 
'   von Wave-Dateien über die
'   Visual Basic-Bibliothek für DirectX 8 bereit.
' </remarks>
Public Class DxSound
    Private m_dx As New DirectX8()
    Private m_ds As DirectSound8
    Private m_dsb As DirectSoundSecondaryBuffer8
    Private m_bdscr As New DSBUFFERDESC()
    Private m_strFileName As String
    Private m_intVolume As Integer
    Private m_hWnd As System.IntPtr

    ' <summary>
    '   Erstellt eine neue Instanz der Klasse.
    ' </summary>
    Public Sub New()
    End Sub

    ' <summary>
    '   Erstellt eine neue Instanz der Klasse und 
    '   weist den Eigenschaften die in den Parametern
    '   übergebenen Werte zu.
    ' </summary>
    ' <param name="hWnd">Fenster-Handle, an das 
    '   die Instanz der Klasse gebunden werden soll.</param>
    ' <param name="intVolume">Lautstärke des Abspielvorgangs.</param>
    ' <param name="strFileName">Name der abzuspielenden Musikdatei.</param>
    Public Sub New( _
      ByVal hWnd As IntPtr, _
      ByVal intVolume As Integer, _
      ByVal strFileName As String)
        Me.hWnd = hWnd
        Me.Volume = intVolume
        Me.FileName = strFileName
    End Sub

    ' <summary>
    '   Beendet den Abspielvorgang.
    ' </summary>
    Public Sub [Stop]()
        If Not m_dsb Is Nothing Then
            m_dsb.Stop()
        End If
    End Sub

    ' <summary>
    '   Startet den Abspielvorgang.
    ' </summary>
    ' <exception cref="Exception">
    '   Wird ausgelöst, wenn ein Fehler beim 
    '   Erstellen des Sound-Puffers für die in der
    '   Eigenschaft <c>FileName</c> angegebene Datei auftritt.
    ' </exception>
    Public Sub Play()
        m_bdscr.lFlags = CONST_DSBCAPSFLAGS.DSBCAPS_STATIC Or _
          CONST_DSBCAPSFLAGS.DSBCAPS_STICKYFOCUS
        m_ds = m_dx.DirectSoundCreate("")
        m_ds.SetCooperativeLevel(m_hWnd.ToInt32(), _
          CONST_DSSCLFLAGS.DSSCL_NORMAL)
        m_bdscr.lFlags = CONST_DSBCAPSFLAGS.DSBCAPS_CTRLPAN Or _
          CONST_DSBCAPSFLAGS.DSBCAPS_CTRLVOLUME Or _
          CONST_DSBCAPSFLAGS.DSBCAPS_CTRLFREQUENCY
        Try
            m_dsb = m_ds.CreateSoundBufferFromFile( _
              Me.FileName, m_bdscr)
        Catch ex As Exception
            Throw ex
        End Try
        m_dsb.SetVolume(Me.Volume)
        m_dsb.Play(CONST_DSBPLAYFLAGS.DSBPLAY_DEFAULT)
    End Sub

    ' <summary>
    '   Gibt den Namen der Musikdatei, die abgespielt werden 
    '   soll, an oder gibt ihn zurück.
    ' </summary>
    ' <value>Name der abzuspielenden Musikdatei.</value>
    Public Property FileName() As String
        Get
            Return m_strFileName
        End Get
        Set(ByVal Value As String)
            m_strFileName = Value
        End Set
    End Property

    ' <summary>
    '   Gibt die Lautstärke, mit der die in der 
    '   Eigenschaft <c>FileName</c> angegebene Musikdatei
    '   abgespielt werden soll, an oder gibt sie zurück.
    ' </summary>
    ' <value>Lautstärke des Abspielvorgangs.</value>
    ' <exception cref="Exception">
    '   Wird ausgelöst, wenn ein ungültiger Wert für 
    '   die Laufstärke angegeben wird.
    ' </exception>
    Public Property Volume() As Integer
        Get
            Return m_intVolume
        End Get
        Set(ByVal Value As Integer)
            If Value >= -1000 And Value <= 0 Then
                m_intVolume = Value
            Else
                Throw New Exception("Volume must be an " & _
                  "Integer between -1000 and 0.")
            End If
        End Set
    End Property

    ' <summary>
    '   Gibt das Fenster-Handle, an das die Instanz 
    '   der Klasse gebunden werden soll, an oder
    '   gibt es zurück.
    ' </summary>
    ' <value>Fenster-Handle, an das die Instanz der 
    '   Klasse gebunden werden soll.</value>
    Public Property hWnd() As IntPtr
        Get
            Return m_hWnd
        End Get
        Set(ByVal Value As IntPtr)
            m_hWnd = Value
        End Set
    End Property
End Class
' ##############################################################################
' ################################ MainForm.vb #################################
' ##############################################################################
Option Explicit On 
Option Strict On
Option Compare Binary

Imports System
Imports System.Windows.Forms

' <remarks>
'   Hauptformular der Anwendung.
' </remarks>
Public Class MainForm
    Inherits System.Windows.Forms.Form

    Private m_snd As DxSound


    Private Sub btnPlay_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnPlay.Click
        Try
            m_snd.Play()
        Catch ex As Exception
            MessageBox.Show("Error: " & ex.Message, _
              Application.ProductName, _
              MessageBoxButtons.OK, _
              MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub btnStop_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles btnStop.Click
        m_snd.Stop()
    End Sub

    Private Sub sldVolume_Scroll( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) _
      Handles sldVolume.Scroll
        m_snd.Volume = Me.sldVolume.Value
    End Sub
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.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 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 BloodySword am 11.07.2008 um 13:25

Wie ist es möglich gestreamte Sounds zu wiedergeben? Zum Beispiel eine lange Wave-Datei oder ein block für block dekodierendes File?

Kommentar von swat am 17.05.2007 um 18:17

DirectShow kann auch Mp3's abspielen, allerdings hat DirectShow keine Soundeffekte integriert.
Ein Beispiel von Rm_Code (Arne Elster) lässt sich im Upload finden, wenn man nach DirectShow sucht.

Kommentar von Timo am 08.09.2006 um 15:02

Hallo

das geht einfacher um sounds abzuspielen in meinem Fall:

Dim S As New Media.SoundPlayer(My.Resources.sync_start)'Meine Wavedatei heisst sync_start.wav
S.Play()'Abspielen

Kommentar von jeffrey am 07.02.2006 um 12:44

Und wenn mann ein Sound benutz ne wave die grösser ist sagt er .. keun speicher mehr frei und bricht ab-

Kommentar von Jeffrey am 07.02.2006 um 12:25

So weit sogut , bei mir kommt nur immer die Meldung


Objektverweis wurde nicht auf eine Objektinstanz Festgelegt..

Was mus ich nich dazu schreiben = oder wo ändere ich das

Kommentar von Eckard Ahlers am 20.10.2005 um 23:46

Zwei Fragen:
Welchen Vorteil hat dieses Verfahren gegenüber dem Einsatz der mciSendString()-API?
Die kann nämlich auch MP3 spielen, oder geht das hiermit auch (undwennjawie)?

Kommentar von Schubert am 18.06.2005 um 12:19

Bei euch ist immer alles so kompliziert und aufgeblasen.
Das Ganze ist in 5 Zeilen erledigt, wenn ich Sound abspielen
will.