VB.NET-Tipp 0021: Einfache Sounds mit Direct Sound 8 abspielen
von Herfried Wagner
Beschreibung
Das Beispiel zeigt wie man über COM-Interop mit DirectSound eine Sounddatei abspielen kann.
Schwierigkeitsgrad: | 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: |
' 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.