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文本浏览器”来实现。