隨著區域網路普及,整合語音通訊至自製軟體成為需求。本文提出一種輕量級方案:僅需雙 DMA 聲卡與耳麥,其餘皆以軟體實現。採用 Windows 多媒體底層音訊服務(waveIn/waveOut)配合回呼機制實現即時收錄/播放,網路層採 TCP 協定確保可靠傳輸。開發環境:VC++ 6.0,測試於 Windows 98/2000/NT 100M 乙太網路。

核心流程:聲音採集 → 編碼/緩衝 → TCP 傳送 → 網路接收 → 解碼/播放。雙向同時進行,形成全雙工通訊。
使用 WAVEHDR 結構管理音訊緩衝區,採用動態循環緩衝區機制:
typedef struct {
LPSTR lpData; // 鎖定緩衝區指標
DWORD dwBufferLength; // 緩衝區大小
DWORD dwBytesRecorded; // 實際資料量
DWORD dwUser; // 使用者資料
DWORD dwFlags; // 旗標
DWORD dwLoops; // 循環次數
struct wavehdr_tag *lpNext;
DWORD reserved;
} WAVEHDR;
waveInGetNumDevs/waveOutGetNumDevs 檢查裝置數量。WAVEFORMATEX:11025Hz, 16-bit, 單聲道。waveInOpen/waveOutOpen 配合 WAVE_FORMAT_QUERY 驗證格式支援。Open 指定 CALLBACK_WINDOW 以接收訊息。WAVEHDR 陣列,waveInPrepareHeader + waveInAddBuffer 送入驅動程式。waveInStart 開始錄音。MM_WIM_DATA:輸入緩衝區滿,於 OnMmWimData 處理資料並送往網路發送與本地播放(waveOutWrite)。MM_WOM_DONE:播放完成,於 OnMmWomDone 將緩衝區歸還輸入端繼續錄音。MM_WIM_CLOSE:停止時清理緩衝區。TCP 為串流協定,無訊息邊界。採用自訂封包頭解決「黏包/拆包」:

OnSend):每次發送一個完整緩衝區,前置封包頭。OnReceive):狀態機解析 — 先收頭部 4 字節長度 + 特徵碼,驗證後再按長度收取語音資料;若一次 Receive 不足,啟用非阻塞 AsyncSelect 循環接收至滿足長度。將收發介面置於 OnMmWimData 回呼中,使網路資料流與音訊採樣率同步,保證播放流暢。
WNetOpenEnum/WNetEnumResource 列舉網路資源,ListBox 顯示,支援點選呼叫。RunServicesOnce 寫入項目。

本方案以 MFC + 底層音訊 API + TCP Socket 實現穩定的局域網語音通訊,架構清晰、程式碼可控,適合整合至企業內部即時通訊或監控系統中。