选择显示字体大小

vb下利用directx处理声音文件


  前言

  微软提供的directx技术不仅可以实现图形图像的处理,而且directx提供了directsound和directmusic类以分别支持声音(wave)文件和音乐(midi)文件,笔者结合自己的学习体会, 介绍如何在visual basic环境下利用directx技术实现wave和midi文件的处理,和广大编程爱好者一起交流,希望能够互相学习,共同进步。

  一、directsound声音处理技术

  directsound类对象是directx提供的实现播放、捕捉数字声音文件的对象,它不仅可以播放声音文件,还可以实现声音在虚拟的三维空间的定位。它包括以下的几个对象:directsound、directsoundbuffer、directsound3dbuffer、direct3dsoundlistner、directsoundcapture、directsoundcapturebuffer。其中directsound对象和directsoundcapture对象是directsound类对象的基本对象,利用directx7对象的directsoundcreate()方法和directsoundcapturecreate()方法可以分别建立directsound对象和directsoundcapture对象。directsoundbuffer对象和directsound3dbuffer是音频播放缓冲对象,顾名思义,前者是音频播放对象,而后者是三维音频播放对象。directsound对象实现声音文件的播放,而directsoundcapture对象是用来捕捉声音数据的基本对象。direct3dsoundlistner对象用于设置播放三维声音效果时收听者所处的位置。

  下面通过一个程序来介绍directsound的应用,这个程序可以利用directsound3dbuffer播放文件并可以动态的设置声音位置。首先建立一个工程文件,在其中加入directx7说明库,然后在form1中加入一个picturebox控件和两个commandbutton控件。将picture1的width和height属性都设置为3000;将picture1的scale属性设置为3-pixel。保存工程文件,并在工程所在的目录下放置一个名为 demo.wav 的声音文件。在form1的代码窗口加入以下代码:

dim m_dx as new directx7
dim m_ds as directsound
dim m_dsbuffer as directsoundbuffer
dim m_ds3dbuffer as directsound3dbuffer
dim m_dsprimarybuffer as directsoundbuffer
dim m_dslistener as directsound3dlistener
dim m_pos as d3dvector
sub drawpositions()
dim x as integer
dim z as integer
picture1.cls
'以黑色圈标出收听者所在的位置
picture1.circle (picture1.scalewidth / 2, picture1.scaleheight / 2), 4
'以红色圈标出声音所在的位置
x = cint(m_pos.x) + picture1.scalewidth / 2
z = cint(m_pos.z) + picture1.scaleheight / 2
picture1.circle (x, z), 4, rgb(255, 0, 0)
end sub
sub load(sfile as string)
dim bufferdesc1 as dsbufferdesc
dim waveformat1 as waveformatex
'设置将建立的directsoundbuffer对象的属性
bufferdesc1.lflags = (dsbcaps_ctrl3d or dsbcaps_ctrlfrequency or _
dsbcaps_ctrlpan or dsbcaps_ctrlvolume) or dsbcaps_static
'建立directsoundbuffer对象
set m_dsbuffer = m_ds.createsoundbufferfromfile(sfile, bufferdesc1, _
waveformat1)
'设置directsoundbuffer对象的声音(0为最大)
m_dsbuffer.setvolume 0
'设置directsoundbuffer对象
set m_ds3dbuffer = m_dsbuffer.getdirectsound3dbuffer
'设置directsoundbuffer对象的播放方向属性
m_ds3dbuffer.setconeorientation 1, 1, 1, ds3d_immediate
m_ds3dbuffer.setconeangles ds3d_minconeangle, 100, ds3d_immediate
m_ds3dbuffer.setconeoutsidevolume -100, ds3d_immediate
'设置directsoundbuffer对象的播放位置属性
m_ds3dbuffer.setposition m_pos.x / 50, 0, m_pos.z / 50, ds3d_immediate
end sub
sub updateposition(x as single, z as single)
m_pos.x = x - picture1.scalewidth / 2
m_pos.z = z - picture1.scaleheight / 2
drawpositions
if m_ds3dbuffer is nothing then exit sub
'重新设置directsoundbuffer对象的播放位置属性
m_ds3dbuffer.setposition m_pos.x / 50, 0, m_pos.z / 50, ds3d_immediate
end sub
private sub command1_click()
if m_dsbuffer is nothing then
call load(app.path + "\demo.wav")
end if
'循环播放声音文件
m_dsbuffer.play 1
end sub
private sub command2_click()
if m_dsbuffer is nothing then exit sub
m_dsbuffer.stop
m_dsbuffer.setcurrentposition 0
end sub
private sub form_load()
dim i as integer
command1.caption = "播放"
command2.caption = "停止"
me.show
doevents
on local error resume next
'建立directsound对象
set m_ds = m_dx.directsoundcreate(vbnullstring)
if err.number <> 0 then
msgbox "无法建立directsound对象,请查看声卡或驱动程序是否安装正确"
end
end if
'设置directsound对象的协作模式
m_ds.setcooperativelevel me.hwnd, dsscl_priority
dim primdesc as dsbufferdesc, format as waveformatex
primdesc.lflags = dsbcaps_ctrl3d or dsbcaps_primarybuffer
'建立主声音缓冲对象
set m_dsprimarybuffer = m_ds.createsoundbuffer(primdesc, format)
'建立directsound3dlistener对象
set m_dslistener = m_dsprimarybuffer.getdirectsound3dlistener()
m_pos.x = 10: m_pos.z = 50
updateposition m_pos.x, m_pos.z
end sub
private sub picture1_mousedown(button as integer, shift as integer, x as single, y as single)
if button = 1 then
updateposition x, y
end if
end sub

private sub picture1_paint()
drawpositions
end sub

  运行程序,在picturebox中回出现一个黑色和一个红色的小圆圈。黑色的代表虚拟的收听者的位置,红色的代表音源的位置。点击"播放"按钮即可以播放wav文件,你可以点击picturebox中的不同位置来设置音源的位置,然后再听一下声音发生的改变,由于本人机器上安装的只是普通双声道声卡,所以效果不是很明显,有高档多声道声卡的朋友可以使用上面的程序感受一下你的声卡的三维效果。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons