在一個多媒體應用程序中,如果涉及對聲音的播放與操作,那麼我們就有必要先對用戶系統中的聲卡及真功能進行一下測試。幸好有VB,所以我們要實現這些功能並不用費多大力氣(也就是吃頓飯的力氣),在下面的程序中我們將利用VB調用兩個windowsApi函數--Waveoutgetnumdevs()和Waveoutgetdev-capS()來訪問設備驅動程序,獲取有關信息,實現上述目的。OK,Let'sGo!一、我們先要撿測一下聲卡是否存在
1.新建一工程並添加模塊Module1.bas,在其聲明部分加入如下代碼:
DeclareFunctionWaveoutgetnumdevsLib"Winmm.Dll"()asLong
PublicConstMb_ok=&H40
2.在窗體上添加一個命令按鈕cmdtest,設置Caption的屬性為“測試聲卡”
3.在窗體的通用聲明部分加入一函數testcard,代碼如下:
PublicFunctionTestcard()AsBoolean
DimYAslong
DimFindAsStringFind=“FiedSoundBlasterCard"
Y=Waveoutgetnumdevs()
IfY>0Then
Testcard=True
Msgbox"啥啥,我找到你了--聲卡!",Mb_ok,Find
Else
Testcard=Falsc
Msgbox"未發現設備",Mb_ok,Find
Endif
EndFunction
4.在命令按鈕的單擊事件中加入代碼:
PrivatesubCmdtest_Click()
DimExistentAsBoolean
Existent=Testcard
Endsub
現在你可以運行這個程序試試看了,它會檢測你的系統中是否有聲卡的存在。二、測試聲卡的功能
既然已經發現了聲卡的存在,接下來就要測試一下它的功能。為什麼?舉個例子來說,老式聲卡支持的采樣率和位分辨率是遠不及現在聲卡的,如果你試圖用只有8位分辨率和22.05KHz采樣率的聲卡來播放44.1KHz、16位立體聲的聲音文件,嘿嘿……有你好看(其實也沒啥大不了的)。好,你大膽的往下看。
1.在窗體上加入picturebox控件picture1。
2.在Module1.bass的聲名節中加入代碼:
DeclareFunctionWaveoutgetdevcapsLib"Winmm.dll"Alias"Waveoutgetdevcapsa"(ByvaIUdcviceidAsLong,LpcapsAsWaveOutcaps,ByvaIUsizeAsLong)AsLong
'參數1指定被測設備。由於一台PC上裝有幾個音頻設備是完全可能的,所以Windows自動給每個設備編號,第一個可用設備號為0。
'參數2是一個Waveoutcaps結構的指針。
'多數3是第二個參數的大小。
PublicConstMaxpnamelen=32
PublicConstWave_Format_1m08=&H1
PublicConstWavp_Format_1ml6=&H4
PublicConstWave_Format_1s08=&H2
PublicConstWave_Format_1sl6=&H8
PublicConstWavc_Format_2m0B=&H1O
PublicConstWave_Format_2m16=&H40
PublicConstWave_Format_2s08=&H20
PublicConstWave_Format_2s16=&H80
PublicConstWave_Format_4m08=&H100
PublicConstWave_Format_4ml6=&H400
PublicConstWave_Format_4s08=&H200
PublicConstWave_Format_4s16=&H800
PublicConstWavecaps_Lrvolume=&H8
PublicConstWavecaps_Pitch=&H1
PublicConstWavecaps_Playbackrate=&H2
PublicConstWavecaps_Sync=&H10
PublicConstWavecaps_Volume=&H4
TypeWaveoutCaps
WmidAsInteger'設備驅動程序廠商標識
WpidAsInteger'聲卡廠商標識
VdriverversionAsLong'驅動程序版本號,高字節為主版本號,低字節為次版本號
SzpnameAsString*Maxpnamelen'產品名稱
DwformatsAsLong'支持的wave格式,每一位代表一種格式
WchannelsAsInteger'返回整型值1(單聲道)或2(立體聲)
DwsupportAsLong'設備支持的擴展輸出功能
EndType
3.在窗體的聲明節內增加兩個函數:
'函數listwaveformat檢測波形音頻支持的格式
PublicFunctionListwaveformat(AboutwaveAslong)AsString
DimWaveformatAsString
SelectCaseAboutwave
CaseWave_Format_1m08
Waveformat="11.025khz,Mono,8bit,11kb/Ps"
CaseWave_Format_1m16
Waveformat="11.025khz,Mono,16bit,22kb/Ps"
CaseWave_Format_1s08
Waveformat="11.025khz,Stereo,8bit,22kb/Ps"
CaseWave_Format_1s16
Waveformat="11.025khz,Stereo,16bit,43kb/Ps"
Casewave_Format_2m08
Waveformat="22.05khz,Mono,8bit,22kb/Ps"
CaseWavc_Format_2m16
Waveformat="22.05khz.Mono,16bit,43kb/Ps"
CaseWave_Format_2s16
Waveformat="22.05khz,Stereo,8bit,43kb/Ps"
CaseWave_Format_2s16
Waveformat="22.05khz,Stereo,16bit,86kb/Ps"
CaseWave_Format_4m08
Waveformat="44.1khz,Mono,8bit,43kb/Ps"
CaseWave_Format_4m16
Wavcformat="44.lkhz,Mono,16bit,86KB/Ps"
CaseWave_Format_4s08
Waveformat="44.lkhz,Stereo,8bit,86kb/Ps"
CaseWavc_Format_4s16
Waveformat="44.lkhz.Stereo,16bit,172kb/Ps"
EndSelect
Listwaveformat=Waveformat
EndFunction
'函數Listwavesupport檢測設備支持的擴展輸出功能
PublicFunctionListwavesupport(AboutwaveAslong)AsString
DimWavefunAsString
SclectCaseAboutwave
CaseWavecaps_Pitch
Wavefun="SupportPitch"
CascWavecaps_Playbackrate
Wavefun="SupportPlayback"
CaseWavecaps_Volume
Wavefun="SupportVolumeControl"
CsaeWavecaps_Lrvolume
Wavefun="SupportLeft-RightChannals"
CsaeWavecaps_sync
Wavcfun="SupportSynchronization"
EndSelect
Listwavesupport=Wavefun
EndFunction
4.修改cmdtest_Click事件的代碼為:
PrivateSubCmdtest_Click()
DimExistentAsBoolean
DimConsequenceAslong
DimReturncapsAsWaveoutcaps
DimRainverAsLong
DimLesservcrAslong
DimPnameAsString*32
DimAboutwaveAslong
DimChannelAsString*2
DimIAslnteger
Existent=Testcard
IfExistentThen
Consequence=Waveoutgetdevcaps(0,Returncaps,Len(Returncaps))IfConsequence=0Then
Mainver=Returncaps.Vdriverversion256
Lesserver=Returncaps.VdriverversionMod256
'因為API在返回Returncaps.szpname時在返回值與空格之間會插入一個空的終止符,用Rtrim$會返回一個0終止字符串,所以我們采用Instr Left$的方法.
Pname=Left$(Returncaps.Szpname,Instr(Returncaps.Szpname,Chrr$(0))-1)
Channe1=Str$(Returncaps.Wchannels)
Picture1.Print"產品名稱:";Pname
Picture1.Print"產品Id:";Returncaps.Wpid
Picture1.Print"驅動程序Id:";Returncaps.Wrmid
Picture1.Print"驅動程序版本:";Mainver;".";LesserverPicture1.Print"輸出聲道:";Channel
Picture1.Print"支持格式列表:"
ForI=0TO11
IfReturncaps.DwformatsAnd(2^I)Then
Picture1.PrintListwaveformat(2^I)
Endif
NextI
Picture1.Print"擴展輸出功能列表:"
Forl=0To4
IfReturncaps.DwsupportAnd(2^I)Then
Picture1.PrintListwavesupport(2^I)
Endif
NextI
Endif
Else
End
Endif
EndSub
5.為Form_load事件加入代碼:
PrivateSubForm_Load()Picture1.ClsEndSub本程序在Win95(osr2)、VB5企業版下調試通過,在win3.2下僅僅兩個API函數略有改變,照貓畫虎即可。
好了,工作已經全部做完了。現在你要做的只是按下F5,我也要隨風而去了,各位看官後會有期,隱也。->