API应用秘技(18):声音播放随心所欲
软件世界
本期看点:用一系列API函数来实现各类计算机声音的相关应用,包括获取声卡信息、控制计算机喇叭发声和播放声音文件等。这些应用均不需通过控件实现,免去了控件设置又可使程序执行更为快速。
本期实例效果
1.获取声卡信息
代码输入完毕后运行程序,即可获取声卡的相关信息,如图1所示:
2.简单发声功能
运行后可模拟简单的声音并可播放各类系统定义的声音。
3.复杂发声功能
运行后可播放各类复杂的声音。
相关API函数声明
实现各类声音控制程序所需的API系列函数名称和功能如下所述:
auxGetDevCaps
说明:该函数用于获取声卡的相关信息,包括设备编号、设备名称、驱动版本、声道和音频设备等。
VB声明:Declare Function auxGetDevCaps Lib “winmm.dll” Alias “auxGetDevCapsA” (Byval uDeviceID As Long, lpCaps As AUXCAPS, Byval uSize As Long) As Long
auxGetNumDevs
说明:该函数用于获取是否安装了声卡。
返回值:Long型,如返回零值,则代表成功。
返回值:Long型,如返回零值,则代表成功。
参数:
uDeviceID:Long型,代表设备编号。
lpCaps:AUXCAPS型结构体参数,用于返回声卡的具体信息。
uSize:Long型,代表AUXCAPS类型的长度。
VB声明:Declare Function auxGetNumDevs Lib “winmm.dll” () As Long
Beep
说明:该函数用于生成简单的声音。
返回值:Long型,如非零则代表成功。
参数:
dwFreq:Long型,代表声音频率(从37Hz至32767Hz)。
dwDuration:Long型,代表以毫秒为单位的声音持续时间。如为-1,则持续播放,直至再次调用该函数为止。
VB声明:Declare Function Beep Lib “kernel32” Alias “Beep” (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
MessageBeep
说明:该函数用于播放由控制面板中“声音”项设置的系统声音。
返回值:Long型,如非零则代表成功。
参数:
wType Long:Long型,用于设置播放的声音类型,其取值范围包括0xffffffff(标准响铃)、MB_ICONASTERISK(系统星号声音)、MB_ICONEXCLAMATION(系统惊叹声音)、MB_ICONHAND(系统指针声音)和MB_ICONQUESTION(系统提问声音)。
VB声明:Declare Function MessageBeep Lib “user32” Alias “MessageBeep” (ByVal wType As Long) As Long
PlaySound
说明:该函数用于播放各类声音文件。
返回值:Long型,如非零则代表成功。
参数:
lpszName:Any型,代表播放的声音文件名称。
hModule:Long型,代表声音存放的文件或程序。
dwFlags:Long型,代表播放声音文件的选项。
VB声明:Declare Function PlaySound Lib “winmm.dll” Alias “PlaySoundA” (lpszName As Any, ByVal hModule As Long, ByVal dwFlags As Long) As Long
sndPlaySound
说明:该函数用于有功能选项地播放各类声音文件。
返回值:Integer型,如非零则代表成功
参数:
lpszSoundName:String型,代表播放的声音文件名称。
wF1ags:Integer型,代表播放声音文件的选项。
VB声明:Declare Function sndPlaySound Lib “MMSYSTEM.DLL” (ByVal lpszSoundName as String,ByVal wF1ags as Integer) as Integer
程序实现方法
如何获取声卡信息
启动VB6,新建工程,在窗体上放置一个文本框和一个按钮,如图2所示:
第一步:先进行API函数声明
第二步:然后输入一些常数和结构声明,具体如下所述:
Const AUX_MAPPER = -1&
Const MMSYSERRR_NOERROR = 0
Const MMSYSERR_BASE = 0
Const MMSYSERR_BADDEVICEID = (MMSYSERR_BASE + 2)
Const MMSYSERR_NOERROR = 0
Const MAXPNAMELEN = 32
Const AUXCAPS_AUXIN = &H2
Const AUXCAPS_CDAUDIO = &H1
Const AUXCAPS_MASTER = &H8
Const AUXCAPS_MIC = &H4
Const AUXCAPS_MIDI = &H40
Const AUXCAPS_PCSPEAKER = &H10
Const AUXCAPS_WAVE = &H20
Const AUXCAPS_LRVOLUME = &H2
Const AUXCAPS_VOLUME = &H1
Const MM_ANTEX = 31
Const MM_APPS = 42
Const MM_APT = 56
Const MM_ARTISOFT = 20
Const MM_AST = 64
Const MM_ATI = 27
'定义类型
Private Type AUXCAPS
wMid As Integer
wPid As Integer
vDriverVersion As Long
szPname As String * MAXPNAMELEN
wTechnology As Integer
dwSupport As Long
End Type
第三步:对和声卡相关函数代码的编写:
'用于显示声卡信息的函数
Private Function DisplayInformation(ByRef Gerat As AUXCAPS, ByVal DeviceIndex As Integer)
Dim MajorVer As Long, MinorVer As Long
txtinfor.SelText = “设备编号:” & DeviceIndex & vbCrLf
txtinfor.SelText = “设备名称:” & Left$(Gerat.szPname, InStr(1, Gerat.szPname, vbNullChar) - 1) & vbCrLf
MajorVer = (Gerat.vDriverVersion And &HFF00) / &H100
MinorVer = Gerat.vDriverVersion And &HFF
txtinfor.SelText = “驱动版本:” & MajorVer & “.” & MinorVer & vbCrLf
If Gerat.dwSupport = (AUXCAPS_LRVOLUME And AUXCAPS_VOLUME) Then
txtinfor.SelText = “声道:2(Stereo)” & vbCrLf
ElseIf Gerat.dwSupport = AUXCAPS_VOLUME Then
txtinfor.SelText = “声道:1(Mono)” & vbCrLf
End If
Select Case Gerat.wTechnology
Case AUXCAPS_AUXIN
txtinfor.SelText = “音频设备:AUX IN”
Case AUXCAPS_CDAUDIO
txtinfor.SelText = “音频设备:Audio CD”
Case AUXCAPS_MASTER
txtinfor.SelText = “音频设备:Master”
Case AUXCAPS_MIC
txtinfor.SelText = “音频设备:Microfon”
Case AUXCAPS_MIDI
txtinfor.SelText = “音频设备:Midi”
Case AUXCAPS_PCSPEAKER
txtinfor.SelText = “音频设备:PC语音输入”
Case AUXCAPS_WAVE
txtinfor.SelText = “音频设备:Wave”
Case Else
txtinfor.SelText = “音频设备:未知”
End Select
txtinfor.SelText = vbCrLf
End Function
第四步:对各控件事件进行行为代码编写,如下所示:
'“开始获取信息”按钮单击事件代码
Private Sub Command1_Click()
Dim GeratInfo As AUXCAPS, RetVal As Long
RetVal = auxGetDevCaps(AUX_MAPPER, GeratInfo, Len(GeratInfo)) '参考API函数声明
If RetVal = MMSYSERR_NOERROR Then
DisplayInformation GeratInfo, AUX_MAPPER
End If
If auxGetNumDevs = 0 Then'参考API函数声明
txtinfor.SelText = “声卡已安装” + vbCrLf
RetVal = auxGetDevCaps(0, GeratInfo, Len(GeratInfo))
DisplayInformation GeratInfo, 0
End If
End Sub
简单的声音播放
注:先进行API函数声明
Sub UseBeep ()
Dim Retval As Long
Retval = Beep (800&, 10&) '参开API函数声明
If Retval = 0 Then
Msgbox “调用Beep函数失败!”
End If
End Sub
Sub useMessageBeep ()
Dim Retval As Long
Retval = MessageBeep (MB_ICONQUESTION) '参考API函数声明
If Retval = 0 Then
Msgbox “调用MessageBeep函数失败!”
End If
End Sub
复杂声音播放
注:先进行API函数声明
'声明播放声音文件所用的全局变量
Const SND_SYNC = &H0
Const SND_ASYNC = -&H1
Const SND_NODEFAULT = &H2
Const SND_LOOP = &H8
Const SND_NOSTOP = -&H10
Const SND_ALIAS = &H10000
Const SND_ALIAS_ID = &H110000
Const SND_APPLICATION = &H80
Const SND_FILENAME = &H20000
Const SND_MEMORY = &H4
Const SND_NOWAIT = &H2000
Const SND_PURGE = &H40
Const SND_RESOURCE = &H40004
'使用PlaySound函数(参考API函数声明)播放声音文件的子程序
Sub PlaySoundplayWAV ()
Dim Retval As Long
'播放声音文件
Retval = PlaySound(ByVal “c:\windows\media\tada.wav”, 0&, SND_ASYNC Or SND_FILENAME Or SND_NODEFAULT)
End Sub
'使用PlaySound函数播放包含在链接库的声音文件子程序
Sub PlaySoundplaySystemWAV ()
Dim Retval As Long
'播放包含在链接库中的声音文件
Retval = PlaySound(ByVal “SystemExit”, 0&, SND_ASYNC Or SND_APPLICATION Or SND_NODEFAULT)
End Sub
'使用sndPlaySound函数(参考API函数声明)播放声音文件的子程序
Sub sndPlaySoundplayWAV()
Dim retval as Integer
'播放声音文件
retval = sndPlaySound(“c:\windows\media\tada.wav”, SND_ASYNC or SND_NODEFAULT)
End Sub
结束语
“API应用秘技”系列学习到本期为止便结束了。通过这个系列的学习,读者应该对API这一开发者的利器已不再陌生。现在,开发功能灵活、实用且效率高的应用程序无疑会使用API函数。“API应用秘技”系列也仅涉及了API大海中的“沧海一粟”,还有更多的API函数还需要广大读者在实际工作中去钻研。
最后提醒读者的是,“API应用秘技”系列较多实例以VB语言为开发平台,在VB中调用API函数在使用前须显式声明,这些工作也可通过VB提供的“API文本浏览器”来实现。

