會話磁碟區控件
如先前所述,WASAPI 用戶端可以個別控制每個 音訊會話的音量層級。 WASAPI 會將會話的磁碟區設定一致套用至會話中的所有數據流。 每個磁碟區層級都是介於 0.0 到 1.0 之間的值,其中 0.0 表示無聲,1.0 表示完整音量(無衰減)。
用戶端會將第一個數據流指派給該會話,以隱含方式建立會話。 新工作階段的預設磁碟區層級為1.0。 如先前所述,使用者可以透過控制程式的使用者介面(例如 Sndvol)調整會話的磁碟區層級,也就是 WASAPI 用戶端。 控件設定是持續性的。
除了用戶端控制的磁碟區設定之外,系統也會將自己的磁碟區設定套用至會話。 這些設定是以音訊原則為基礎,並動態變更以響應構成全域音訊混合之數據流中的變更。 如需音訊原則的詳細資訊,請參閱 使用者模式音訊元件。
針對每個數據流實作磁碟區控制的系統軟體,會將數據流中的 PCM 樣本乘以有效的磁碟區層級。 有效的磁碟區層級是將客戶端和系統磁碟區設定相乘的結果。 因此,產生的訊號幅度變更是客戶端和系統音量層級的線性組合。 例如,如果用戶端磁碟區層級為 0.8,而系統磁碟區層級為 0.5,則有效磁碟區層級為 (0.8)。(0.5) = 0.4。
請注意,對於訊號幅度而言,感知到的音量不是線性的。 相反地,聲響度會隨著音量層級 v 的對數而有所不同:
分貝的聲度 = 20。log₁₀(v)
因此,設定 v = 0.5 會以 6 分貝來衰減原始訊號的響度(套用音量前的訊號),並將 v = 0.25 衰減訊號減去 12 分貝等。 磁碟區層級 v = 1.0,對應至 0 分貝,不會改變原始訊號層級。
具有使用者介面的音訊應用程式,用來控制音量層級通常會顯示滑桿,這些滑桿會產生感知的響度變更,這些變更會與滑桿位置的變更成線性比例。 若要在感知的音量和滑桿位置之間建立線性關聯性,應用程式必須定義音量層級 v 與滑桿位置之間的非線性關聯性。 如需詳細資訊,請參閱 音訊磁帶音量控件。
如先前所述,系統音量控制程式 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 中 [應用程式] 方塊中的磁碟區滑桿只會反映透過 ISimpleAudioVolume 介面所做的磁碟區變更。 它們不會反映透過 IAudioStreamVolume 和 IChannelAudioVolume 介面進行的磁碟區變更。 雖然某些應用程式可能會讓使用者透過 IAudioStreamVolume 和 IChannelAudioVolume 直接或間接控制磁碟區設定,但開發人員應該避免針對這些磁碟區設定呈現應用程式滑桿,讓使用者可能會與 Sndvol 中的磁碟區滑桿混淆。 否則,使用者可能會移動預期會在 Sndvol 滑桿中反映變更的應用程式滑桿,並在沒有發生這類變更時變得困惑。 開發人員可以透過謹慎的使用者介面設計來避免這個問題。
會話子混音中任何通道的有效音量層級,如說話者所聽到,是下列四個音量層級因素的乘積:
- 會話中數據流的每個通道磁碟區層級,用戶端可以透過IAudioStreamVolume 介面中的方法來控制這些層級。
- 會話的每個通道磁碟區層級,用戶端可以透過 IChannelAudioVolume 介面中的方法來控制。
- 會話的主要磁碟區層級,用戶端可以透過 ISimpleAudioVolume 介面中的方法來控制。
- 會話的原則型磁碟區層級,系統會在全域混合變更時動態修改此層級。
上述清單中的四個磁碟區層級因素中每一個都是介於0.0到1.0之間的值,其中0.0表示無聲,1.0表示完整音量(無衰減)。 有效磁碟區層級也是範圍0.0到1.0的值。
音訊引擎會將每個通道的有效音量層級套用至數據流中的通道,然後再將數據流與其他音訊會話中的其他數據流混合。 如果通道中的任何樣本值在音訊引擎乘以有效音量層級之後超過 0 分貝,引擎會在將樣本新增至會話副混音之前裁剪樣本。
相關主題