程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 利用VB測聲卡

利用VB測聲卡

編輯:VB綜合教程
在一個多媒體應用程序中,如果涉及對聲音的播放與操作,那麼我們就有必要先對用戶系統中的聲卡及真功能進行一下測試。幸好有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,我也要隨風而去了,各位看官後會有期,隱也。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved