KSPROPSETID_Synth_Dls
屬性 KSPROPSETID_Synth_Dls
集包含用來將 DLS 範例和檢測下載至 MIDI 合成器的屬性。 這些是 DirectMusic 篩選 (DirectMusic 針腳上的 synth-節點 (KSNODETYPE_SYNTHESIZER) 的屬性,請參閱 MIDI 和 DirectMusic Filters) 。
本節說明這些屬性的行為,這些屬性如何下載和卸載包含 DLS 資料的記憶體「區塊」。 下載的檢測和波浪資料區塊的實際格式是在Microsoft Windows SDK檔中的低階 DLS 討論中指定。
DLS 下載和卸載會在針腳存在期間隨時發生。 不同于 DirectMusic 事件,它們不是時間戳記,應該儘快處理。
在本節中,DLS 資源或只是資源一詞是指 DLS 檢測區塊或 DLS 波浪區塊。 系統會正確維護所有 DLS 資源的參考計數:
當用戶端卸載最後一個參考波的檢測時,系統會自動產生呼叫以卸載波段。
相反地,系統會延遲呼叫以卸載波段,直到用戶端卸載最後一個參考波的檢測為止。
這個集合中的屬性專案是由KSPROPERTY_SYNTH_DLS列舉值所指定,如標頭檔 Dmusprop.h 中所定義。
使用量摘要資料表
KSPROPERTY_SYNTH_DLS_APPEND 屬性會指定用戶端附加至其下載至合成器之每個緩衝區中 DLS 資料的保留儲存空間數量。
Get | 集合 | 目標 | 屬性描述項類型 | 屬性值類型 |
---|---|---|---|---|
是 |
否 |
Pin |
ULONG |
(作業資料) 屬性值為 ULONG 類型,並指定迷你埠驅動程式在每個下載的 DLS 資料緩衝區結束時,必須保留供自己使用的位元組數目。 然後,用戶端會配置每個下載緩衝區,以足以在下載的資料結束時包含要求的位元組數目。
傳回值
KSPROPERTY_SYNTH_DLS_APPEND屬性要求會傳回STATUS_SUCCESS,表示它已順利完成。 否則,要求會傳回適當的錯誤狀態碼。 下表顯示一些可能的錯誤碼。
狀態碼 | 意義 |
---|---|
STATUS_UNSUCCESSFUL |
作業未順利完成。 |
這些額外的位元組適用于需要額外填補的驅動程式,以符合對齊需求或複寫樣本的開頭,以簡化樣本插補。
使用量摘要資料表
KSPROPERTY_SYNTH_DLS_COMPACT屬性是合成器的要求,可讓可用的最大可用樣本記憶體區塊。
Get | 集合 | 目標 | 屬性描述項類型 | 屬性值類型 |
---|---|---|---|---|
否 |
是 |
Pin |
無 |
) 與此屬性相關聯的作業資料 (屬性值。
傳回值
KSPROPERTY_SYNTH_DLS_COMPACT屬性要求會傳回STATUS_SUCCESS,表示它已順利完成。 否則,要求會傳回適當的錯誤狀態碼。 下表顯示一些可能的錯誤碼。
狀態碼 | 意義 |
---|---|
STATUS_UNSUCCESSFUL |
作業未順利完成。 |
這個屬性的處理常式實作不應該中斷播放。
如需詳細資訊,請參閱Microsoft Windows SDK檔中的 IDirectMusicPort::Compact方法描述。
使用量摘要資料表
KSPROPERTY_SYNTH_DLS_DOWNLOAD 屬性可用來將 DLS 資料下載至合成器。
Get | 集合 | 目標 | 屬性描述項類型 | 屬性值類型 |
---|---|---|---|---|
是 |
否 |
Pin |
屬性描述項 (實例資料) 是由緊接在SYNTH_BUFFER結構之後的 KSNODEPROPERTY 結構所組成,該結構會指定要下載之 DLS 資料緩衝區的位置和大小。
) 作業資料 (屬性值是 SYNTHDOWNLOAD 結構。 迷你埠驅動程式會傳回此結構中的下列資訊:
迷你埠驅動程式產生的控制碼,可唯一識別下載的 DLS 資料。 此用戶端應該儲存此控制碼,並在稍後卸載資料 (請參閱 KSPROPERTY_SYNTH_DLS_UNLOAD) 。
布林值,指出用戶端是否可以在屬性要求完成之後釋放包含 DLS 資料的緩衝區。 如果迷你埠驅動程式已建立自己的 DLS 資料複本,用戶端可以釋放緩衝區。 否則,如果迷你埠驅動程式繼續使用用戶端的原始 DLS 資料緩衝區,則用戶端不應該釋放緩衝區,直到迷你埠驅動程式卸載 DLS 資料為止。
傳回值
KSPROPERTY_SYNTH_DLS_DOWNLOAD屬性要求會傳回STATUS_SUCCESS,表示它已順利完成。 否則,要求會傳回適當的錯誤狀態碼。 下表顯示一些可能的錯誤碼。
狀態碼 | 意義 |
---|---|
STATUS_BUFFER_TOO_SMALL |
緩衝區太小而無法完成作業。 |
STATUS_UNSUCCESSFUL |
作業未順利完成。 |
STATUS_NO_MEMORY |
沒有記憶體可用來完成此要求。 |
如需詳細資訊,請參閱Microsoft Windows SDK檔中的 IDirectMusicPort::D ownloadInstrument方法的討論。
範例
KSPROPERTY_SYNTH_DLS_DOWNLOAD屬性要求會指定 DLS 下載資料與使用者記憶體位址的位置。 迷你埠驅動程式應該先探查並鎖定包含 DLS 資料的使用者記憶體,然後再嘗試存取它。 下列範例程式碼示範如何執行這項操作:
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PSYNTH_BUFFER pDlsBuffer = (PSYNTH_BUFFER)pRequest->Instance;
PMDL pMdl = IoAllocateMdl(pDlsBuffer->BufferAddress, pDlsBuffer->BufferSize,
FALSE, FALSE, NULL);
if (pMdl)
{
__try
{
MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess);
PVOID pvUserData = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
// do something with the data here
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
Status = GetExceptionCode();
}
MmUnlockPages(pMdl);
IoFreeMdl(pMdl);
}
else
{
Status = STATUS_NO_MEMORY;
}
使用量摘要資料表
KSPROPERTY_SYNTH_DLS_UNLOAD 屬性會卸載先前下載的 DLS 資料資源。
Get | 集合 | 目標 | 屬性描述元類型 | 屬性值類型 |
---|---|---|---|---|
否 |
是 |
Pin |
HANDLE |
(作業資料) 屬性值為 HANDLE 類型,並包含要釋放的下載 DLS 資料資源的控制碼。 這是迷你埠驅動程式在先前 KSPROPERTY_SYNTH_DLS_DOWNLOADget-property 要求中識別 DLS 資料的控制碼。
傳回值
KSPROPERTY_SYNTH_DLS_UNLOAD屬性要求會傳回STATUS_SUCCESS,表示它已順利完成。 否則,要求會傳回適當的錯誤狀態碼。 下表顯示一些可能的錯誤碼。
狀態碼 | 意義 |
---|---|
STATUS_BUFFER_TOO_SMALL |
緩衝區太小而無法完成作業。 |
STATUS_UNSUCCESSFUL |
作業未順利完成。 |
STATUS_PENDING |
作業將在稍後完成。 |
迷你埠驅動程式應該會在沒有使用 DLS 資料的筆記播放時立即卸載 DLS 資料。 如果合成器無法在KSPROPERTY_SYNTH_DLS_UNLOAD set-property 要求時釋放與 DLS 資料資源相關聯的記憶體,則可以使用非同步屬性完成,稍後完成要求。
如果在卸載 DLS 資料資源之後,合成器會收到使用資源的附注事件,除非在過渡期間下載新的 DLS 資料資源,否則迷你埠驅動程式應該忽略事件。
如需詳細資訊,請參閱Microsoft Windows SDK檔中的IDirectMusicPort::UnloadInstrument方法的討論。
使用量摘要表格
KSPROPERTY_SYNTH_DLS_WAVEFORMAT 屬性可用來查詢合成器是否有其輸出波格式。
Get | 集合 | 目標 | 屬性描述元類型 | 屬性值類型 |
---|---|---|---|---|
是 |
否 |
Pin |
作業資料 (屬性值) 類型為 WAVEATEX,並指定合成器輸出資料流程的波浪格式。
傳回值
KSPROPERTY_SYNTH_DLS_WAVEFORMAT屬性要求會傳回STATUS_SUCCESS,表示它已順利完成。 否則,要求會傳回適當的錯誤狀態碼。 下表顯示一些可能的錯誤碼。
狀態碼 | 意義 |
---|---|
STATUS_BUFFER_TOO_SMALL |
緩衝區太小而無法完成作業。 |
sizeof (WAVEATEX) 位元組的屬性值緩衝區可能不足以容納所有波浪格式。 例如,多重通道格式需要sizeof (其 SIZEof) BYTESATEXTENSIBLE) 位元組。 如果屬性要求傳回STATUS_BUFFER_TOO_SMALL的狀態碼,用戶端可以檢查迷你埠驅動程式輸出的屬性值大小、配置較大的緩衝區,然後提交第二個要求。
如需詳細資訊,請參閱Microsoft Windows SDK檔中的IDirectMusicPort::GetFormat方法描述。