×

DirectX与VB.NET编程(九)*全局播放和频率控制

Kalet Kalet 发表于2009-03-20 12:00:14 浏览328 评论0

抢沙发发表评论

这次是DirectSound的最后一章节了,把剩下的功能在一个演示里面一起讲完。
这次实现的是声音的全局播放和频率改变。


===============华丽的分割线===============

DirectX与VB.NET编程(九)*全局播放和频率控制

学习要点
·设置声音的全局播放
·改变声音的播放频率


===============华丽的分割线===============


在先前的例子中,您可能发现了所有的声音在程序失去焦点后都暂停了播放,这是由于声音的播放范围控制了,在DirectSound中有三种播放范围:NormalFocus、StickyFocus和GlobalFocus,其中NormalFocus是当程序失去焦点后将暂停播放,StickyFocus虽然在失去焦点不会使声音暂停,但是如果此时焦点切换到另外一个使用DirectSound的程序时,那么声音将暂停播放,最后在GlobalFocus无论程序是否失去焦点,或无论焦点切换到的程序是否使用DirectSound,声音都将继续播放。


===============华丽的分割线===============


在DirectSound的缓冲区中,可以通过Frequency属性来设置或获得声音的播放频率,不过这事先需要对描述中的ControlFrequency属性设置为True。


===============华丽的分割线===============


首先在窗口上放置一个滑槽(TrackBar),窗口布局请参考图1或最后的代码。



图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,但是由于本人的新作《骑士殿》正在加紧制作中,因此目前无法估计下一篇章的开始时间。不过感谢您对我的支持。



群贤毕至

访客