共用方式為


會話磁碟區控件

如先前所述,WASAPI 用戶端可以個別控制每個 音訊會話的音量層級。 WASAPI 會將會話的磁碟區設定一致套用至會話中的所有數據流。 每個磁碟區層級都是介於 0.0 到 1.0 之間的值,其中 0.0 表示無聲,1.0 表示完整音量(無衰減)。

用戶端會將第一個數據流指派給該會話,以隱含方式建立會話。 新工作階段的預設磁碟區層級為1.0。 如先前所述,使用者可以透過控制程式的使用者介面(例如 Sndvol)調整會話的磁碟區層級,也就是 WASAPI 用戶端。 控件設定是持續性的。

除了用戶端控制的磁碟區設定之外,系統也會將自己的磁碟區設定套用至會話。 這些設定是以音訊原則為基礎,並動態變更以響應構成全域音訊混合之數據流中的變更。 如需音訊原則的詳細資訊,請參閱 User-Mode 音訊元件

針對每個數據流實作磁碟區控制的系統軟體,會將數據流中的 PCM 樣本乘以有效的磁碟區層級。 有效的磁碟區層級是將客戶端和系統磁碟區設定相乘的結果。 因此,產生的訊號幅度變更是客戶端和系統音量層級的線性組合。 例如,如果用戶端磁碟區層級為 0.8,而系統磁碟區層級為 0.5,則有效磁碟區層級為 (0.8)(0.5) = 0.4。

請注意,對於訊號幅度而言,感知到的音量不是線性的。 相反地,聲響度會隨著音量層級 v 的對數而有所不同:

分貝中的聲度 = 20log₁₀(v)

因此,設定 v = 0.5 會以 6 分貝來衰減原始訊號的響度(套用音量前的訊號),並將 v = 0.25 衰減訊號減去 12 分貝等。 磁碟區層級 v = 1.0,對應至 0 分貝,不會改變原始訊號層級。

具有使用者介面的音訊應用程式,用來控制音量層級通常會顯示滑桿,這些滑桿會產生感知的響度變更,這些變更會與滑桿位置的變更成線性比例。 若要在感知的音量和滑桿位置之間建立線性關聯性,應用程式必須定義音量層級 v 與滑桿位置之間的非線性關聯性。 如需詳細資訊,請參閱 Audio-Tapered 磁碟區控制件

如先前所述,系統音量控制程式 Sndvol 會顯示每個音訊轉譯裝置上播放之音訊會話的音量滑桿。 這些滑桿會出現在 [SndVol] 視窗中標示 應用程式 的群組方塊中。 一般而言,每個會話都包含來自特定應用程式視窗的所有播放數據流。 透過 Sndvol 視窗中的滑桿,用戶可控制個別音訊應用程式的音量層級。

一般規則是,應用程式應該將其所有播放數據流指派給相同的音訊會話。 WASAPI 不會防止應用程式在多個會話之間散發其播放數據流。 不過,Sndvol 中產生的磁碟區滑桿激增可能會混淆使用者。

作為選項,應用程式視窗可以顯示磁碟區滑桿。 應用程式滑桿應該隨時反映對應 Sndvol 滑桿的狀態。 因此,如果用戶藉由在應用程式視窗中移動滑桿來變更音量層級,則 Sndvol 視窗中的對應滑桿應該與應用程式滑桿一起移動。 同樣地,如果用戶移動 Sndvol 滑桿,則應用程式滑桿應該與 Sndvol 滑桿一起移動。

為了支援此行為,WASAPI 會實作 ISimpleAudioVolume 介面。 當使用者移動應用程式滑桿時,應用程式會呼叫 ISimpleAudioVolume::SetMasterVolume 方法來據以調整會話音量層級。 Sndvol 會透過此方法監視磁碟區變更,並反映其顯示之磁碟區滑桿中的變更。 此外,應用程式可以接收使用者透過 Sndvol 進行的會話磁碟區變更通知。 為此,應用程式會實作 IAudioSessionEvents 介面,並使用 WASAPI 註冊介面。 之後,每次使用者透過 Sndvol 變更會話磁碟區層級時,應用程式都會透過 IAudioSessionEvents::OnSimpleVolumeChanged 方法收到通知呼叫。 如需實作 IAudioSessionEvents 介面的程式代碼範例,請參閱 音訊會話事件。 如需註冊 IAudioSessionEvents 介面的程式代碼範例,請參閱 舊版音訊應用程式的音訊事件

ISimpleAudioVolume 介面會將相同的音量層級統一套用至音訊會話中的所有通道。 雖然此介面應該滿足大部分應用程式的磁碟區控制需求,但少數應用程式可能需要更特殊的磁碟區控制功能。 IAudioStreamVolume 介面會控制會話中個別數據流的磁碟區,相對於會話中的其他數據流。 IAudioStreamVolume 也可讓用戶端個別控制數據流中所有通道的磁碟區層級。 例如,應用程式可能會使用這項功能來達到音訊效果,例如透過從左到右移動來模擬音訊來源的空間移動。 另一個特製化介面 IChannelAudioVolume,控制會話中個別通道的磁碟區層級。 例如,應用程式可能會使用 IChannelAudioVolume 來實作立體聲音效系統的平衡控件。

Sndvol Applications 方塊中的磁碟區滑桿只會反映透過 ISimpleAudioVolume 介面所做的磁碟區變更。 它們不會反映透過 IAudioStreamVolumeIChannelAudioVolume 介面所進行的磁碟區變更。 雖然某些應用程式可能會讓使用者透過 IAudioStreamVolumeIChannelAudioVolume來直接或間接控制磁碟區設定,但開發人員應該避免針對使用者可能會與 Sndvol 中的磁碟區滑桿混淆的這些磁碟區設定顯示應用程式滑桿。 否則,使用者可能會移動預期會在 Sndvol 滑桿中反映變更的應用程式滑桿,並在沒有發生這類變更時變得困惑。 開發人員可以透過謹慎的使用者介面設計來避免這個問題。

會話子混音中任何通道的有效音量層級,如說話者所聽到,是下列四個音量層級因素的乘積:

  • 會話中數據流的每一通道磁碟區層級,用戶端可以透過 IAudioStreamVolume 介面中的方法來控制。
  • 會話的每個通道磁碟區層級,用戶端可以透過 IChannelAudioVolume 介面中的方法來控制。
  • 會話的主要磁碟區層級,用戶端可以透過 ISimpleAudioVolume 介面中的方法來控制。
  • 會話的原則型磁碟區層級,系統會在全域混合變更時動態修改此層級。

上述清單中的四個磁碟區層級因素中每一個都是介於0.0到1.0之間的值,其中0.0表示無聲,1.0表示完整音量(無衰減)。 有效磁碟區層級也是範圍0.0到1.0的值。

音訊引擎會將每個通道的有效音量層級套用至數據流中的通道,然後再將數據流與其他音訊會話中的其他數據流混合。 如果通道中的任何樣本值在音訊引擎乘以有效音量層級之後超過 0 分貝,引擎會在將樣本新增至會話副混音之前裁剪樣本。

磁碟區控件