国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.NET 實現DirectSound9 (5) DS3D2

2024-07-10 13:00:51
字體:
來源:轉載
供稿:網友


關鍵字: vb .net directx directsound 3d 作者:董含君

經過一下午的奮戰,走了若干彎路,終于可以播放3d聲音效果了

感動 ~ ~

大體按照下列的步驟來:

1 關聯設備 setcooperativelevel
2 設置3d硬件效果 dsoundhelper.guid3dalgorithmhrtffull
3 格式要求 soundformat 必須是單聲道,不能是立體聲
4 主要緩沖區描述
5 創建listenner
6 輔助緩沖區讀取wav
7 創建3d緩沖區
8 播放
9 控制空間位置,以及設置多普勒效應因子,衰減因子
10 停止播放

以下代碼注釋比較全,順序比微軟的例子簡單不少

由于csdn的blog不能上傳貼圖以及rar,只能帖代碼了,有兩個button 一個picturebox,還有若干label


==================================================================================

imports microsoft.directx
imports microsoft.directx.directsound
imports system.drawing
imports system.drawing.graphics


public class form1
inherits system.windows.forms.form

dim dev as device '設備
dim buff as buffer '主要緩沖
dim sbuff as secondarybuffer '二級緩沖
dim buff3d as buffer3d '3d緩沖
dim descbuff as bufferdescription '緩沖區描述
dim buff3dset as buffer3dsettings '3d緩沖設置
dim listenner as listener3d '聽眾
dim listennerset as listener3dsettings '聽眾設置
dim pic as graphics
dim bmp as bitmap
const fn = "g:/media/wav/rod2m.wav" '要播放的文件,必須是單聲道
#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 button1 as system.windows.forms.button
friend withevents button2 as system.windows.forms.button
friend withevents picturebox1 as system.windows.forms.picturebox
friend withevents label1 as system.windows.forms.label
friend withevents label2 as system.windows.forms.label
friend withevents label3 as system.windows.forms.label
friend withevents label4 as system.windows.forms.label
friend withevents textbox1 as system.windows.forms.textbox
friend withevents textbox2 as system.windows.forms.textbox
friend withevents textbox3 as system.windows.forms.textbox
friend withevents textbox4 as system.windows.forms.textbox
friend withevents label5 as system.windows.forms.label
friend withevents textbox5 as system.windows.forms.textbox
friend withevents label6 as system.windows.forms.label
<system.diagnostics.debuggerstepthrough()> private sub initializecomponent()
me.button1 = new system.windows.forms.button
me.button2 = new system.windows.forms.button
me.picturebox1 = new system.windows.forms.picturebox
me.label1 = new system.windows.forms.label
me.label2 = new system.windows.forms.label
me.label3 = new system.windows.forms.label
me.label4 = new system.windows.forms.label
me.textbox1 = new system.windows.forms.textbox
me.textbox2 = new system.windows.forms.textbox
me.textbox3 = new system.windows.forms.textbox
me.textbox4 = new system.windows.forms.textbox
me.label5 = new system.windows.forms.label
me.textbox5 = new system.windows.forms.textbox
me.label6 = new system.windows.forms.label
me.suspendlayout()
'
'button1
'
me.button1.location = new system.drawing.point(24, 8)
me.button1.name = "button1"
me.button1.size = new system.drawing.size(88, 32)
me.button1.tabindex = 0
me.button1.text = "初始化"
'
'button2
'
me.button2.location = new system.drawing.point(24, 48)
me.button2.name = "button2"
me.button2.size = new system.drawing.size(88, 32)
me.button2.tabindex = 1
me.button2.text = "播放"
'
'picturebox1
'
me.picturebox1.borderstyle = system.windows.forms.borderstyle.fixedsingle
me.picturebox1.location = new system.drawing.point(152, 48)
me.picturebox1.name = "picturebox1"
me.picturebox1.size = new system.drawing.size(552, 432)
me.picturebox1.tabindex = 2
me.picturebox1.tabstop = false
'
'label1
'
me.label1.location = new system.drawing.point(8, 104)
me.label1.name = "label1"
me.label1.tabindex = 3
me.label1.text = "多普勒效應0~10"
'
'label2
'
me.label2.location = new system.drawing.point(8, 160)
me.label2.name = "label2"
me.label2.tabindex = 4
me.label2.text = "衰減因子 0~10"
'
'label3
'
me.label3.location = new system.drawing.point(8, 216)
me.label3.name = "label3"
me.label3.tabindex = 5
me.label3.text = "最大距離 0~100"
'
'label4
'
me.label4.location = new system.drawing.point(8, 272)
me.label4.name = "label4"
me.label4.tabindex = 6
me.label4.text = "最小距離 0~100"
'
'textbox1
'
me.textbox1.location = new system.drawing.point(24, 128)
me.textbox1.name = "textbox1"
me.textbox1.tabindex = 7
me.textbox1.text = "0.0"
'
'textbox2
'
me.textbox2.location = new system.drawing.point(24, 184)
me.textbox2.name = "textbox2"
me.textbox2.tabindex = 8
me.textbox2.text = "0.0"
'
'textbox3
'
me.textbox3.location = new system.drawing.point(24, 240)
me.textbox3.name = "textbox3"
me.textbox3.tabindex = 9
me.textbox3.text = "0.9"
'
'textbox4
'
me.textbox4.location = new system.drawing.point(24, 296)
me.textbox4.name = "textbox4"
me.textbox4.tabindex = 10
me.textbox4.text = "20.0"
'
'label5
'
me.label5.location = new system.drawing.point(8, 328)
me.label5.name = "label5"
me.label5.tabindex = 11
me.label5.text = "y軸"
'
'textbox5
'
me.textbox5.location = new system.drawing.point(24, 352)
me.textbox5.name = "textbox5"
me.textbox5.tabindex = 12
me.textbox5.text = "0.0"
'
'label6
'
me.label6.location = new system.drawing.point(152, 16)
me.label6.name = "label6"
me.label6.size = new system.drawing.size(424, 24)
me.label6.tabindex = 13
me.label6.text = "label6"
'
'form1
'
me.autoscalebasesize = new system.drawing.size(6, 14)
me.clientsize = new system.drawing.size(720, 501)
me.controls.add(me.label6)
me.controls.add(me.textbox5)
me.controls.add(me.label5)
me.controls.add(me.textbox4)
me.controls.add(me.textbox3)
me.controls.add(me.textbox2)
me.controls.add(me.textbox1)
me.controls.add(me.label4)
me.controls.add(me.label3)
me.controls.add(me.label2)
me.controls.add(me.label1)
me.controls.add(me.picturebox1)
me.controls.add(me.button2)
me.controls.add(me.button1)
me.name = "form1"
me.text = "form1"
me.resumelayout(false)

end sub

#end region

private sub form1_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
'''加載的時候初始化一下picturebox,把它變成黑色(沒有顏色)
picturebox1_doubleclick(0, nothing)
end sub

sub initdirectsound()
''加載directsound設備以及讀取wav文件
'設置3d模式
dim dsmode as guid
dsmode = dsoundhelper.guid3dalgorithmhrtffull '由于為了演示3d效果,所以用最高模式
'關聯窗體
dev = new device
dev.setcooperativelevel(me.handle, cooperativelevel.priority)
''加載wav '''注釋掉了,原來測試用的
'dim tmpdesc as new bufferdescription
'tmpdesc.guid3dalgorithm = dsmode
'tmpdesc.control3d = true
'sbuff = new secondarybuffer(fn, tmpdesc, dev)

'格式有比較嚴格的限制
dim fmt as new waveformat
fmt.formattag = waveformattag.pcm
fmt.channels = 2
fmt.samplespersecond = 22050
fmt.bitspersample = 16
fmt.blockalign = cshort(fmt.bitspersample / 8 * fmt.channels)
fmt.averagebytespersecond = fmt.samplespersecond * fmt.blockalign
'創建描述
descbuff = new bufferdescription
'descbuff.controlvolume = true
descbuff.control3d = true
'descbuff.globalfocus = true
'descbuff.staticbuffer = true
'descbuff.locateinhardware = true
descbuff.primarybuffer = true
descbuff.format = fmt
'descbuff.guid3dalgorithm = dsmode
'''以上可以自己去掉注釋嘗試一下,某些時候當primary打開的時候,其他的不能用,有沖突,尤其是后面幾個
'創建主緩沖
try
'''捕獲一下,防止descript的描述不正確(就是參數設置的不對)
buff = new buffer(descbuff, dev)
catch ex as exception
msgbox(ex.message)
end '不對的話,就沒有必要繼續了
end try
'創建聽眾
listenner = new listener3d(buff)
listennerset = listenner.allparameters '使用主緩沖聽眾的設置

''wav
dim tmpdesc2 as new bufferdescription
tmpdesc2.guid3dalgorithm = dsmode
tmpdesc2.control3d = true
''' 這里必須借助輔助緩沖給主緩沖提供實例,不知道微軟怎么想的,也可能是我學藝不精,怎么嘗試都要這樣用
buff = new secondarybuffer(fn, tmpdesc2, dev)

'創建3d緩沖區
buff3d = new buffer3d(buff)
buff3dset = buff3d.allparameters '使用默認的設置
buff3dset.mode = mode3d.headrelative '改變一個參數
buff3d.allparameters = buff3dset '應用新的設置

msgbox("已經讀取" + fn)
'ok,初始化完成

end sub

private sub button2_click(byval sender as system.object, byval e as system.eventargs) handles button2.click
buff.play(0, bufferplayflags.looping)
end sub

private sub button1_click(byval sender as system.object, byval e as system.eventargs) handles button1.click
initdirectsound()
end sub

private sub picturebox1_mousemove(byval sender as object, byval e as system.windows.forms.mouseeventargs) handles picturebox1.mousemove
''' 當鼠標左鍵按下去的時候有效,我可不希望鼠標經過就改變
if e.button <> mousebuttons.left then exit sub
dim r = new rectangle(e.x, e.y, 3, 3)

pic = picturebox1.creategraphics()
me.text = e.x.tostring + "," + e.y.tostring
pic.drawimage(bmp, 1, 1)
pic.drawellipse(new pen(color.red), r)
setsoundpos(convert.tosingle(e.x), convert.tosingle(textbox5.text), convert.tosingle(e.y))
'''這里坐標變換一下,因為y軸向上,我們需要的是遠近,所以負值給z軸(從上面俯視)
end sub

private sub picturebox1_doubleclick(byval sender as object, byval e as system.eventargs) handles picturebox1.doubleclick
''' 清除畫板,只需雙擊一下,免得太亂
bmp = new bitmap(400, 300)
picturebox1.backgroundimage = bmp
end sub
sub setsoundpos(byval x as single, byval y as single, byval z as single)
'''''''''用戶改變位置以及速度之后,對buff進行調整的代碼
''' 很簡單,就是更改參數而已
''' 定義域在-1 到 1 之間
dim pos as vector3
dim speed as vector3

pos.x = (x - picturebox1.width / 2) / 100
pos.y = y / 100
pos.z = (z - picturebox1.height / 2) / 100

speed.x = 1
speed.y = 1
speed.z = 1

buff3d.position = pos
buff3d.velocity = speed

label6.text = "相對坐標:(x,y)=" + x.tostring + "," + z.tostring
end sub
end class

================================================================================

這里對y軸的操作不多,我無法用picturebox描述3d的效果,也許學會了d3d就可以比較形象的描述了

而且對于多普勒也沒有過多的使用(我的音箱很難分辨),最好用那種汽車的單一的聲音最好

還有速度的改變需要檢測鼠標兩次的位置判斷(需要研究公式的,懶)否則多普勒不夠真實

對于表現directsound3d的性能,這個例子是不夠完善的,但是對于介紹使用ds3d的步驟,我想還是

說得過去的.其他的部分大家自己完善就可以了.

下次就是最后的部分了,利用directsound進行混音,實現特效.

倒是想過自己做一個封裝,用于聲音引擎,但是似乎牽扯到3d的地方必須了解d3d,所以ds一般都包含在游戲引擎里面

單獨拿出來就沒有太大的意義了(除非不使用3d)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辛集市| 楚雄市| 饶平县| 界首市| 观塘区| 阿拉善左旗| 普格县| 龙南县| 吉木乃县| 柳林县| 平原县| 西充县| 永平县| 斗六市| 绵竹市| 西畴县| 铜川市| 喜德县| 武川县| 靖安县| 兴义市| 正蓝旗| 班玛县| 旌德县| 横山县| 肥城市| 盐城市| 晴隆县| 黄平县| 日土县| 勃利县| 宁都县| 台安县| 嘉兴市| 大足县| 高安市| 军事| 夏津县| 会理县| 察雅县| 邯郸县|