阅读背景:

VB.net DirectSound 中 New SecondaryBuffer 多个实例 如何控制其中某个指定实例或者全部实例?

来源:互联网 
在VB.net中引用DirectSound创建一个窗体应用,点击按钮会播放sound
在VB.net中引用DirectSound创建一个窗体应用,点击按钮会播放sound\1.wav。
不停的点击Button1,会重叠播放声音。
点击Button2,会停止播放。

我的问题是:
每次点击Button2时只有最后一个New产生的SecondaryBuffer实例会停止,之前的SecondaryBuffer仍然会继续播放,无论点击多少次Button2,也不会停止。
可能是因为Buf = New SecondaryBuffer("sound\1.wav", desc, ad) 这条语句建立的多个实例全部都叫"Buf",当执行Buf.Stop()时就不知道Stop的是哪个实例了。

那么请问使用NEW创建的多个同名的实例,是否有序号?是否能够根据序号单独控制某个特定的实例?
或者有什么其他的方法?谢谢大家了。


代码如下:
Imports Microsoft.DirectX.DirectSound

Public Class Form1

    Dim ad As Device '创建设备 
    Dim Buf As SecondaryBuffer '创建缓冲
    Dim desc As BufferDescription  '创建缓冲

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ad = New Device '实力化设备对象
        ad.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal) '关联
        desc = New BufferDescription
        desc.GlobalFocus = True
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Buf = New SecondaryBuffer("sound\1.wav", desc, ad) '实力化缓冲区 
        Buf.Play(0, BufferPlayFlags.Default) '播放,同时指定开始位置跟方式
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Buf.stop()
    End Sub

End Class

5 个解决方案

#1


放进List里啊

#2


引用 1 楼 Z65443344 的回复:
放进List里啊


谢谢,能不能告诉我下详细的方法?

#3


比如你的对象类型是A
那么定义一个全局List<A> Alist=new List<A>();

然后每次new一个对象,不要丢弃,把它加入list
A a=new A();
Alist.Add(a);

然后你就可以遍历List去操作每一个实例化出来的对象了

#4


对应你的代码,应该是
Dim DList As List<Device>=new List<Device>()


ad = New Device;
DList.Add(ad);

#5


引用 3 楼 Z65443344 的回复:
比如你的对象类型是A
那么定义一个全局List<A> Alist=new List<A>();

然后每次new一个对象,不要丢弃,把它加入list
A a=new A();
Alist.Add(a);

然后你就可以遍历List去操作每一个实例化出来的对象了


十分感谢!

.wav。 在VB.net中引用DirectSound创建一个窗体应用,点击按钮会播放sound
在VB.net中引用DirectSound创建一个窗体应用,点击按钮会播放sound\1.wav。
不停的点击Button1,会重叠播放声音。
点击Button2,会停止播放。

我的问题是:
每次点击Button2时只有最后一个New产生的SecondaryBuffer实例会停止,之前的SecondaryBuffer仍然会继续播放,无论点击多少次Button2,也不会停止。
可能是因为Buf = New SecondaryBuffer("sound\1.wav", desc, ad) 这条语句建立的多个实例全部都叫"Buf",当执行Buf.Stop()时就不知道Stop的是哪个实例了。

那么请问使用NEW创建的多个同名的实例,是否有序号?是否能够根据序号单独控制某个特定的实例?
或者有什么其他的方法?谢谢大家了。


代码如下:
Imports Microsoft.DirectX.DirectSound

Public Class Form1

    Dim ad As Device '创建设备 
    Dim Buf As SecondaryBuffer '创建缓冲
    Dim desc As BufferDescription  '创建缓冲

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ad = New Device '实力化设备对象
        ad.SetCooperativeLevel(Me.Handle, CooperativeLevel.Normal) '关联
        desc = New BufferDescription
        desc.GlobalFocus = True
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Buf = New SecondaryBuffer("sound\1.wav", desc, ad) '实力化缓冲区 
        Buf.Play(0, BufferPlayFlags.Default) '播放,同时指定开始位置跟方式
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Buf.stop()
    End Sub

End Class

5 个解决方案

#1


放进List里啊

#2


引用 1 楼 Z65443344 的回复:
放进List里啊


谢谢,能不能告诉我下详细的方法?

#3


比如你的对象类型是A
那么定义一个全局List<A> Alist=new List<A>();

然后每次new一个对象,不要丢弃,把它加入list
A a=new A();
Alist.Add(a);

然后你就可以遍历List去操作每一个实例化出来的对象了

#4


对应你的代码,应该是
Dim DList As List<Device>=new List<Device>()


ad = New Device;
DList.Add(ad);

#5


引用 3 楼 Z65443344 的回复:
比如你的对象类型是A
那么定义一个全局List<A> Alist=new List<A>();

然后每次new一个对象,不要丢弃,把它加入list
A a=new A();
Alist.Add(a);

然后你就可以遍历List去操作每一个实例化出来的对象了


十分感谢!

.wa



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: