非 PCM 支援的背景
許多問題導致舊版 Microsoft Windows 無法透過 waveOut 和 DirectSound API 支援非 PCM 格式。 這些問題及其解決方式如下所述。
waveOut API
將 waveOut 應用程式與 VxD 波浪驅動程式分開的軟體層相當精簡。 不論作業系統是否瞭解格式,支援自訂波浪格式的驅動程式和應用程式都可以以該格式串流資料。
不過,在 Windows 2000 和 Windows 98 中,WDM 音訊架構會強制 waveOut API 處理的所有音訊資料 (和 DirectShow 的 waveOut 轉譯器) 通過 KMixer 系統驅動程式 (Kmixer.sys) ,也就是核心音訊混音器。 只有在 KMixer 支援格式時,waveOutOpen 呼叫才會成功,而不論驅動程式是否支援格式。
KMixer 會處理所有 WDM 作業系統上的WAVE_FORMAT_PCM。 Windows 2000 和更新版本和 Windows 98 SE 延伸 KMixer,不僅支援WAVE_FORMAT_IEEE_FLOAT,也支援 PCM 和 IEEE-float 格式的 其一次的TENSIBLE 變體。 由於 KMixer 不支援非 PCM 格式,因此嘗試透過 KMixer 傳遞非 PCM 資料會失敗。
Windows 藉由允許非 PCM 音訊資料略過 KMixer,以支援非 PCM 格式。 具體而言,waveOut 非 PCM 資料流程會直接流向 PortCls (或 USBAudio) ,而不是先通過 KMixer。 任何非 PCM 資料的混合都必須在硬體中完成,但以 AC-3 或 WMA Pro 等格式使用非 PCM 資料的應用程式通常不需要混合,驅動程式通常不支援該格式的硬體混合。
DirectSound API
在舊版 waveOut 驅動程式和 VxD 驅動程式上,DirectSound 支援針對主要和次要緩衝區使用 8 或 16 位、一或兩個通道,以及介於 100 Hz 和 100 kHz 之間的取樣速率,但不支援針對主要和次要緩衝區) PCM 格式的 WAVEATE (XTENSIBLE。 當合作層級設定為 DSSCL_WRITEPRIMARY (DirectX SDK) 中看到 IDirectSoundBuffer::SetFormat 方法的描述時,VxD 驅動程式可以進一步限制主要緩衝區允許的格式。 這些限制尚未在 Windows Me 或 Windows XP 中變更。
WDM 驅動程式可以同時支援 PCM 格式的 PHPATEX 和 PHPATEXTENSIBLE 格式。 對於 Windows 2000 和更新版本、Windows Me 和 Windows 98 SE,驅動程式也可以同時支援主要和次要DSBCAPS_LOCSOFTWARE緩衝區的WAVE_FORMAT_IEEE_FLOAT格式, (由 KMixer) 混合,同時以WAVE_FORMAT_IEEE_FLOAT和XTENSIBLE 形式。
呼叫 SetFormat 以指定主要緩衝區的資料格式,只會對音效卡選擇的最終混合格式產生間接影響。 主要緩衝區物件用來取得 IDirectSound3DListener 介面,以及設定裝置的全域音量和移動流覽,但不代表音效卡中的單一輸出資料流程。 相反地,KMixer 會混合主要緩衝區資料,以允許數個DSSCL_WRITEPRIMARY DirectSound 用戶端同時執行。
在 Windows 2000 和 Windows 98 上,DirectSound 僅支援 PCM 資料。 (DirectShow 也是如此,這使用 DirectSound 的 renderer.) 對具有非 PCM 格式的 CreateSoundBuffer 呼叫一律會失敗,即使驅動程式支援格式也一樣。 發生失敗的原因有兩個。 首先,每當 DirectSound 建立 KS 針腳時,它會自動指定KSDATAFORMAT_SUBTYPE_PCM,而不是從用於建立IDirectSoundBuffer物件的WFormatTag 結構 wFormatTag成員衍生子類型。 其次,不論用戶端要求 DirectSound 緩衝區上的移動流覽、磁片區或頻率控制,DirectSound 都需要每個資料路徑 (取樣率轉換) 節點 (KSNODETYPE_VOLUME 和 KSNODETYPE_SRC) 。 如果資料通過 KMixer 或裝置執行硬體混合,就會符合此需求。 不過,對於非 PCM 格式,KMixer 不會出現在資料路徑中,而且驅動程式本身通常會在系統要求執行硬體混合時失敗。
Windows XP 和更新版本和 Windows Me 會移除防止 DirectSound 應用程式使用非 PCM 格式的限制。 DirectSound 8 (和更新版本) 會使用正確的格式子類型,而且不再需要每個資料路徑中的磁片區和 SRC 節點。