这次是DirectSound的最后一章节了,把剩下的功能在一个演示里面一起讲完。
这次实现的是声音的全局播放和频率改变。
===============华丽的分割线===============
DirectX与VB.NET编程(九)*全局播放和频率控制学习要点
·设置声音的全局播放
·改变声音的播放频率
===============华丽的分割线===============
在先前的例子中,您可能发现了所有的声音在程序失去焦点后都暂停了播放,这是由于声音的播放范围控制了,在DirectSound中有三种播放范围:NormalFocus、StickyFocus和GlobalFocus,其中NormalFocus是当程序失去焦点后将暂停播放,StickyFocus虽然在失去焦点不会使声音暂停,但是如果此时焦点切换到另外一个使用DirectSound的程序时,那么声音将暂停播放,最后在GlobalFocus无论程序是否失去焦点,或无论焦点切换到的程序是否使用DirectSound,声音都将继续播放。
===============华丽的分割线===============
在DirectSound的缓冲区中,可以通过Frequency属性来设置或获得声音的播放频率,不过这事先需要对描述中的ControlFrequency属性设置为True。
===============华丽的分割线===============
首先在窗口上放置一个滑槽(TrackBar),窗口布局请参考图1或最后的代码。
===============华丽的分割线===============
通过上面的讲解,您应该很清楚代码应该怎样写了,这里就不慢慢熬述,直接给出全部代码:
Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectSound
Public Class Form1
Inherits System.Windows.Forms.Form
Dim Dev As Device
Dim SB As SecondaryBuffer
Dim SBDes As BufferDescription
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents TrackBar1 As System.Windows.Forms.TrackBar
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()DirectX与VB.NET编程(九)*全局播放和频率控制
Me.TrackBar1 = New System.Windows.Forms.TrackBar
CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'TrackBar1
'
Me.TrackBar1.Location = New System.Drawing.Point(8, 0)
Me.TrackBar1.Maximum = 200000
Me.TrackBar1.Minimum = 100
Me.TrackBar1.Name = "TrackBar1"
Me.TrackBar1.Size = New System.Drawing.Size(464, 45)
Me.TrackBar1.TabIndex = 0
Me.TrackBar1.TickStyle = System.Windows.Forms.TickStyle.None
Me.TrackBar1.Value = 100
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(480, 46)
Me.Controls.Add(Me.TrackBar1)
Me.Name = "Form1"
Me.Text = "演示"
CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dev = New Device
Dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
SBDes = New BufferDescription
SBDes.ControlFrequency = True
SBDes.GlobalFocus = True
sbdes.
SB = New SecondaryBuffer("D:\魔兽争霸2\DRIVERS\DIGTEST.wav", SBDes, Dev)
SB.Play(0, BufferPlayFlags.Looping)
TrackBar1.Value = SB.Frequency
End Sub
Private Sub TrackBar1_ValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.ValueChanged
SB.Frequency = TrackBar1.Value
End Sub
End Class
===============华丽的分割线===============
DirectSound的篇章全部结束了,不久我将把一个DirectSound全方面的演示(一个播放器)发送上来,希望您在DirectSound领域有所收获,如果本人有任何错误疏漏的地方,还请谅解。DirectX与VB.NET编程(九)*全局播放和频率控制
DirectSound后面将会是DirectInput,但是由于本人的新作《骑士殿》正在加紧制作中,因此目前无法估计下一篇章的开始时间。不过感谢您对我的支持。