導航:首頁 > 編程語言 > windows音效卡編程

windows音效卡編程

發布時間:2022-09-18 22:29:32

『壹』 指點!!!在WINDOWS ME 系統下如何安裝音效卡的驅動程序請詳細說一下步驟!謝謝!

一.先查看一下音效卡的型號.二.去網上下載,然後打開文件安裝即可
.(或者可以下載一個萬能音效卡驅動)

『貳』 waveInOpen 如何選擇是音效卡 還是 麥克

事實上,音效卡是PC的一種多媒體設備,所以可以用Windows 的MCI(Media Control I nterface)命令來控制音效卡。MCI它提供了一組與設備無關的控制命令,是一種訪問多媒體設備的高層次方法。也正因為它屬於一種高層次方法,所以它提供給程序員的靈活性有限,利用MCI命令來控制音效卡錄音時,程序員不能在錄音的過程中訪問內存中的采樣數據,只有在錄音完成後通過訪問*.WAV文件才可以得到采樣數據,盡管最終還是得到了采樣數據,但是這樣做一方面嫌其麻煩,更重要的是存取文件需要耗費時間,音效卡在采樣的過程中有可能會停止下來等待文件操作,造成了采樣的斷續。在一些實時性要求比較高的場合(比如波形分析,實時控制等),斷續的采樣明顯是不行的。 Windows的低級波形音頻函數提供了對音效卡的最大靈活性的操作,它允許在采樣過程中隨機地訪問內存中的每個采樣數據,完全可以克服使用MCI命令所遇到的實時性問題。 Windows以動態連接庫Mmsystem.dll的形式提供低級波形音頻函數,在Mmsystem.dll中總共包括了以下幾個有關波形錄入的函數:

waveInAddBuffer :向聲音輸入設備發送緩沖區 ;waveInClose :關閉聲音輸入設備
waveInGetDevCaps:獲取聲音輸入設備性能; waveInGetErrorText:獲取聲音出錯信息文本
waveInGetID :獲取聲音輸入設備ID; waveInGetNumDevs:返回聲音輸入設備數量
waveInGetPosition :獲取聲音設備輸入位置; waveInMessage :向聲音輸入設備發送信息
waveInOpen :打開聲音輸入設備; waveInPrepareHeader:預備聲音輸入緩沖區
waveInReset :停止聲音輸入設備工作; waveInStart :停止聲音輸入設備工作
waveInStop :停止聲音輸入; waveInUnprepareHeader : 清除預備的聲音文件頭

需要說明的是:不同的編程工具多會含有對這些低級波形音頻函數進行說明的頭文件(比如在Delphi4.0中,對Mmsystem.dll說明的文件是Mmsystem.pas),所以在不同的編程工具中調用這些函數時有可能會使用不同的名稱。
與使用其他設備一樣,要想用波形音頻函數來控制音效卡,必須要經過以下的步驟:
1. 打開波形輸入設備。函數waveInOpen用於打開波形輸入設備,其原型如下:
① WORD waveInOpen(lphWaveIn,wDeviceID,lpFormat,dwCallback,dwCallbackInstan ce, dwFlags) LPHWaveIn: lphWaveIn 該變數用來接收波形輸入設備的句柄,該句柄應當保存下來,因為其他的波形輸入函數還會用到它.
②WORD wDeviceID 該變數用來指明波形輸入設備的標記號.當PC中有多塊音效卡(准確地說是波形輸入設備)時,操作系統會為每一塊音效卡分配一個標記號.可以用waveInGetNumDev s函數來得到能夠作為波形輸入設備的數目N,則wDeviceID的取值范圍為0~N-1.如果想得到沒個標記號所對應的錄音性能,可以使用函數waveInGetDevCaps.若把wDeviceID設為W AVE_MAPPER(即-1),則系統會自動選擇一符合要求的設備(根據lpFormat的要求). ③lpFormat是一個指向PCMWAVEFORMAT數據結構的指針,應當在這個數據結構中指明所期望的采樣模式,這個數據結構的定義是這樣的:
Typedef structure pcmwaveformat_tag { WAVEFORMAT wf; //有關PCM格式設置的另外一種數據結構
WORD wBitsPerSample; //量化位數
}PCMWAVEFORMAT;
Typedef structure waveformat_tag {
WORD wFormatTag; //采樣數據格式,目前只能用PCM格式
WORD nChannels; //通道數目(1或2)
DWORD nSamplesPerSec; //采樣速率
DWORD nAvgBytesPerSec;//每秒采樣得到的數據
WORD nBlockAlign; //記錄區塊對齊的單位。此值為nChannels*wBitsPerSample/8 }WAVEFORMAT;
④ DWORD dwCallback.定義回調函數的地址或回調窗口的句柄。回調函數的地址或回調窗口用來處理波形輸入設備產生的消息。
⑤DWORD dwCallbackInstance。這是一個用戶自定義的數據,該數據會一並傳給回調函數(或窗口)。
⑥DWORD dwFlags。定義打開波形輸入設備的標記。
CALLBACK_WINDOW 定義dwCallback為窗口句柄。
CALLBACK_FUNCTION 定義dwCallback為函數地址。
另外還可以在此指定:
WAVE_FORMAT_QUERY 只查詢波形輸入設備是否支持給定格式而不真的打開波形輸入設備。
WAVE_ALLOWSYNC 同步方式開啟波形輸入設備,錄音工作在後台進行。
下面一段Delphi程序說明了打開波形輸入設備的過程:

type
TRecorder = class
private

FWaveFmt : TWaveFormatEx;//Delphi中,WAVEFORMAT和PCMWAVEFORMAT合為TwaveFor
matEx。
WaveHandle : HWaveIn;
WaveHdr1 : PWAVEHDR; //數據緩沖區頭結構的指針 (見下文)
WaveBuffer1 : lpstr; //數據緩沖區的指針 (見下文)
procere CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD); stdcall;

end;

Recorder:=TRecorder.Create;

Recorder.FWaveFmt.wFormatTag:=WAVE_FORMAT_PCM;
Recorder.FWaveFmt.wBitsPerSample:=16;
Recorder.FWaveFmt.nSamplesPerSec:=11025;
Recorder.FWaveFmt.nAvgBytesPerSec:=22050;
Recorder.FWaveFmt.nBlockAlign:=2;
WaveInOpen(@Recorder.WaveHandle,Wave_Mapper,mailto:@Recorder.FWaveFmt,
DWORD(@TRecorder.CallBack),DWORD(@Recorder),CALLBACK_FUNCTION + WAVE_ALLOW
SYNC);


2. 為采樣數據分配緩沖空間

在Windows環境,可以用GlobalAllocPtr來獲取一段內存空間,但是由於Windows操作系統採用了虛擬存儲管理機制,這塊內存空間隨時有可能會被置換到硬碟上,讀寫硬碟所耗費的時間會造成采樣的不連續。因此,在將緩沖區送往波形輸入設備之前,必須調用WaveInPrepareHeader函數以保證緩沖區不會被置換到硬碟上。當然在用GlobalFreeP tr來釋放緩沖區之前,必須先要用WaveInUnprepareHeader函數來解除這種保護。

下面幾行Delphi語句說明了使用錄音緩沖區的過程。


Recorder.WaveHdr1:=GlobalAllocPtr(GHND or GMEM_SHARE,Sizeof(WAVEHDR));
Recorder.WaveBuffer1:=GlobalAllocPtr(GHND or GMEM_SHARE,1024);
Recorder.WaveHdr1.lpData := Recorder.WaveBuffer1;
Recorder.WaveHdr1.dwBufferLength:=1024;
WaveInPrepareHeader(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(WAVEHDR
));
WaveInAddBuffer(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(WAVEHDR));

WaveInUnprepareHeader(Recorder.WaveHandle, Recorder.WaveHdr1, sizeof(TWAVE
HDR));
GlobalFreePtr(Recorder.WaveBuffer1);


但是,如果只為波形輸入設備開辟一個緩沖區,則當該緩沖區被采樣數據填滿後,波形輸入設備就無緩沖區可用,不得不停止采樣,從而造成了采樣的斷續。所以在實際應用中,至少要為波形輸入設備准備兩個緩沖區,用上述方法同時送給波形輸入設備。

3. 啟動波形輸入設備

當上述一切都准備好後,用WaveInStart啟動波形輸入設備,即可開始進行數據採集,在採集的過程中,一旦有緩沖區被采樣數據填滿,系統就回調WaveInOpen中指定的dwCa llback函數(或向指定的窗口發送消息)。在Delphi4.0中,回調函數的格式是這樣的: procere CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD); stdcall; 其中uMsg是Windows的消息標記號,有三種情況:

MM_WIM_OPEN 表示波形輸入設備開啟成功
MM_WIM_DATA 表示一個緩沖區已滿。
此時dwParam1中攜帶有數據緩沖區頭結的指針。正是通過這個指針,才可以隨機地訪問緩沖區中的每一個采樣數據。如下面程序所示:


procere TRecorder.CallBack(uMsg,dwInstance,dwParam1,dwParam2 : DWORD);
stdcall;
var i:Integer;
SPByte : ^Byte; //假設在打開設備時採用8位量化
SingleData : Integer;
BEGIN
case uMsg of //uMsg是Windows的消息標記號
MM_WIM_OPEN : //波形輸入設備開啟成功發回的消息

MM_WIM_DATA : //一個緩沖區已滿發回的消息
begin
SPByte := Pointer(dwParam1);
for i :=0 to Recorder.DataLength-1 do
begin
SingleData := SPByte^; //通過SPByte來訪問緩沖區中的數據

Inc(SPByte);
end;
end;
MM_WIM_CLOSE : //波形輸入設備關閉成功發回的消息

end;
END;


MM_WIM_CLOSE 表示波形輸入設備關閉成功。當波形輸入設備關閉後,別忘了用Wave InPrepareHeader和GlobalFreePtr來釋放緩沖區內存。

4. 關閉語音輸入設備

waveInStop(hWaveIn) 停止語音輸入
waveInReset(hWaveIn) 重置語音輸入設備
waveInClose(hWaveIn) 關閉語音輸入設備。其中hWaveIn是WaveInOpen得到的設備句柄。
在關閉語音輸入設備前,必須重置語音輸入設備,否則系統會出現這樣的錯誤提示: "MMSYSTEM033 媒體數據仍在播放中,請重置設備或等到數據播放完畢"。但是只有當一個緩沖區填滿數據後,才能重置語音輸入設備
以上波形輸入函數,若調用成功則返回0;否則返回非0,此時可以用waveInGetErrorText函數來得到出錯信息,這樣做的目的是方便調試。

三、必須注意的幾點

以上闡述了作為A/D卡的音效卡編程技術,但是還必須注意以下幾點

1. 音效卡的采樣頻率並不只限於11025Hz,22050Hz,44100 Hz三種,大多數音效卡的采樣頻率在一定的范圍內是可調的(當然會存在一定的偏差)。有的音效卡的最高采樣頻率可達200K Hz(有可能隨不同品牌而異)。
2. 緩沖區不能設得太小,否則也會造成采樣的不連續。在作者的音效卡上,若採用16為量化,22050Hz的采樣速率,緩沖區設為1K位元組,理論上每秒鍾可以得到22050*2個位元組的數據,實際上每秒鍾只能得到大約16000*2個位元組的數據。若緩沖區設為2K位元組,則與理論值一致。
3. A/D轉化後的數據格式是PCM格式,即:若是8位量化,對應著8位無符號數據,0對應著負滿幅值,128對應著零電平,255對應著正滿幅值;若是16位量化,對應著16位有符號數據,-32768對應著負滿幅值,0對應著零電平,32767對應著正滿幅值。編程過程中應注意所聲明的數據類型是否與之相符合,比如在Delphi4.0中,8位無符號數據對應著 Byte型數據,16位有符號數據對應著SmallInt型數據。
4. 由於音效卡的輸入端往往帶有隔直電容,所以不能用音效卡直接對直流量進行採集。解決的辦法就是將這個隔直電容短接。
5. 同樣地,利用windows的API函數和音效卡的D/A功能也可以使音效卡產生模擬音頻信號輸出。

『叄』 WINDOWS如何用程序吧耳機上的輸入和輸出定向到外置音效卡上

啟用外置音效卡,並把原主板的音效卡禁用就可以了。。。不用做外置。汗

『肆』 怎麼樣在win8下編程讓pc喇叭發聲 win8開始pc喇叭改從音效卡音箱發聲。我需要伺服器任務完成

你不能用beep嗎?或者我們說你可以調用c,比如:public partial class Form1 : Form{ private DevicesCollection myDevices = null; private struct myDeviceDescription { public DeviceInformation info; public override string ToString() { return info.Description; } public myDeviceDescription(DeviceInformation di) { info = di; } } public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { myDevices = new DevicesCollection(); Guid driverGuid = Guid.Empty; foreach (DeviceInformation deviceInfo in myDevices) { if (!string.IsNullOrEmpty(deviceInfo.MoleName)) { driverGuid = deviceInfo.DriverGuid; break; } } Device dv = new Device(driverGuid); dv.SetCooperativeLevel(this, CooperativeLevel.Normal); SecondaryBuffer buf = new SecondaryBuffer("nopayhint.wav", dv); buf.Play(0, BufferPlayFlags.Default); }}
這段代碼當然要你自己寫介面,高手同事寫的,我也看的不是很懂
或者是喇叭:
#include <dos.h>

int main(void)
{
sound(頻率); delay(時間); nosound(); return 0;
}
要你自己寫介面代碼,不過我感覺還是直接點:
用Beep(頻率,時間);
然後時間是以毫秒為單位
我記得是頻率200是一個比較好聽的提示音,當然每個人喜好不同按照你喜歡的來
我不知道合不合乎你的要求,我做程序一般用這個,畢竟從開始學就用也改不了了
工作上也能看。。。。。。
如果和你要求符合的話就給個採納
如果不符合也別說我,謝謝。
另外如有雷同純屬巧合,謝謝。

『伍』 windowsXP音效卡調試怎麼弄

你如果是創新獨立音效卡的..現在問題就是接觸不到音效卡硬體出來的呢.

拆下來音效卡.刷一下音效卡金手指.和清理音效卡插槽.重新安裝上去.不行的.繼續試多幾次的

『陸』 win10音效卡設置在哪裡

1、首先右鍵「計算機」點擊「屬性」,在彈出的窗口裡面打開「設備管理器」,檢查「聲音、視頻和游戲控制器」選項有沒有出現黃色嘆號。
2、如果出現了黃色嘆號,說明你的音效卡有問題,接著就去把音效卡驅動卸載。

3、右鍵點擊「計算機」,找到「管理」打開。
4、然後再找到設備管理器中的「聲音、視頻和游戲控制器」點擊卸載。#f#
5、卸載完以後,打開驅動精靈,點擊「一鍵體驗」。
6、這個時候,在「基本狀態」下驅動檢測,會顯示音效卡驅動信息故障。
7、最後點擊修復,等它修復完成以後,點擊完成,重啟電腦,音效卡就安裝好了。

『柒』 win10電腦音效卡怎麼設置

『捌』 Windows管理音效卡的指令是什麼

在運行中輸入: sc stop audiosrv確定即可。如果要禁用音效卡服務模塊,需輸入:sc config audiosrv start=disabled

閱讀全文

與windows音效卡編程相關的資料

熱點內容
壓縮因子定義 瀏覽:967
cd命令進不了c盤怎麼辦 瀏覽:212
葯業公司招程序員嗎 瀏覽:973
毛選pdf 瀏覽:659
linuxexecl函數 瀏覽:727
程序員異地戀結果 瀏覽:374
剖切的命令 瀏覽:228
干什麼可以賺錢開我的世界伺服器 瀏覽:290
php備案號 瀏覽:990
php視頻水印 瀏覽:167
怎麼追程序員的女生 瀏覽:487
空調外壓縮機電容 瀏覽:79
怎麼將安卓變成win 瀏覽:459
手機文件管理在哪兒新建文件夾 瀏覽:724
加密ts視頻怎麼合並 瀏覽:775
php如何寫app介面 瀏覽:804
宇宙的琴弦pdf 瀏覽:396
js項目提成計算器程序員 瀏覽:944
pdf光子 瀏覽:834
自拍軟體文件夾名稱大全 瀏覽:328