Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu konuda, bir ses işleme nesnesinin (APO) nasıl uygulandığı açıklanmaktadır. API'ler hakkında genel bilgi için bkz. Ses İşleme Nesne Mimarisi.
Özel API'leri Uygulama
Özel API'ler işlem içi COM nesneleri olarak uygulandığı için kullanıcı modunda çalışır ve dinamik bağlantı kitaplığında (DLL) paketlenir. Sinyal işleme grafında nereye eklendiklerine bağlı olarak üç tür APO vardır.
- Akış efektleri (SFX)
- Mod efektleri (MFX)
- Uç nokta efektleri (EFX)
Her mantıksal cihaz, her türden bir APO ile ilişkilendirilebilir. Modlar ve efektler hakkında daha fazla bilgi için bkz . Ses Sinyali İşleme Modları.
Özel sınıfınızı Baseaudioprocessingobject.h dosyasında bildirilen CBaseAudioProcessingObject temel sınıfına dayandırarak bir APO uygulayabilirsiniz. Bu yaklaşım, özelleştirilmiş bir APO oluşturmak için CBaseAudioProcessingObject temel sınıfına yeni işlevler eklemeyi içerir. CBaseAudioProcessingObject temel sınıfı, bir APO'nun gerektirdiği işlevlerin çoğunu uygular. Gerekli üç arabirimdeki yöntemlerin çoğu için varsayılan uygulamalar sağlar. Birincil özel durum , IAudioProcessingObjectRT::APOProcess yöntemidir.
Özel API'lerinizi uygulamak için aşağıdaki adımları gerçekleştirin.
- İstenen ses işlemeyi sağlamak için özel APO com nesneleri oluşturun.
- İsteğe bağlı olarak özel APO'ları yapılandırmak için kullanıcı arabirimi oluşturun.
- API'leri ve özel kullanıcı arabirimini yüklemek ve kaydetmek için bir INF dosyası oluşturun.
Özel APO Geliştirme için Tasarımda Dikkat Edilmesi Gerekenler
Tüm özel API'ler aşağıdaki genel özelliklere sahip olmalıdır:
APO'da bir giriş ve bir çıkış bağlantısı olmalıdır. Bu bağlantılar ses arabellekleridir ve birden çok kanala sahip olabilir.
APO yalnızca IAudioProcessingObjectRT::APOProcess yordamı aracılığıyla ona geçirilen ses verilerini değiştirebilir. APO, KS topolojisi de dahil olmak üzere temel alınan mantıksal cihazın ayarlarını değiştiremez.
IUnknown'a ek olarak, API'ler aşağıdaki arabirimleri kullanıma sunmalıdır:
IAudioProcessingObject. Başlatma ve biçim anlaşması gibi kurulum görevlerini işleyen bir arabirim.
IAudioProcessingObjectConfiguration. Yapılandırma arabirimi.
IAudioProcessingObjectRT. Ses işlemeyi işleyen gerçek zamanlı bir arabirim. Gerçek zamanlı bir işleme iş parçacığından çağrılabilir.
IAudioSystemEffects. Ses altyapısının bir DLL'yi sistem olarak tanımasını sağlayan arabirim, APO'ya etki eder.
Tüm API'ler gerçek zamanlı sistem uyumluluğuna sahip olmalıdır. Bu, şu anlama gelir:
Gerçek zamanlı arabirimlerin üyesi olan tüm yöntemlerin engelleyici olmayan üyeler olarak uygulanması gerekir. Engellememeli, sayfalı bellek kullanmamalı veya engelleyici sistem rutinlerini çağırmamalıdır.
APO tarafından işlenen tüm tampon bellekler sayfa dışı olmalıdır. İşlem yolundaki tüm kod ve veriler sayfalandırılamaz olmalıdır.
API'ler ses işleme zincirinde önemli gecikme süresi sunmamalıdır.
Özel API'ler IAudioProcessingObjectVBR arabirimini kullanıma sunmamalıdır.
Uyarı
Gerekli arabirimler hakkında ayrıntılı bilgi için Windows Kits\build number>\Include\<um klasöründeki Audioenginebaseapo.h ve Audioenginebaseapo.idl dosyalarına bakın.
Geliştirme Sürecini Hızlandırmak için Örnek Kod Kullanma
SysVAD Swap APO kod örneğinin şablon olarak kullanılması özel APO geliştirme sürecini hızlandırabilir. Swap örneği, ses işleme nesnelerinin bazı özelliklerini göstermek için geliştirilmiş örnektir. Swap APO örneği, sol kanalı sağ kanalla değiştirir ve hem SFX hem de MFX efektleri uygular. Özellikler iletişim kutusunu kullanarak kanal değiştirme ses efektlerini etkinleştirebilir ve devre dışı bırakabilirsiniz.
SYSVAD ses örneği , Windows Sürücü Örnekleri GitHub'da bulunabilir.
Sysvad ses örneğine buradan göz atabilirsiniz:
https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad
GitHub'dan Sysvad ses örneğini indirme ve ayıklama
SYSVAD örneğini indirip açmak için bu adımları izleyin.
a. Örneklerle çalışmak için GitHub araçlarını kullanabilirsiniz. Evrensel sürücü örneklerini tek bir zip dosyasına da indirebilirsiniz.
https://github.com/Microsoft/Windows-driver-samples/archive/master.zip
b. master.zip dosyasını yerel sabit sürücünüze indirin.
ç. Windows-driver-samples-master.zipseçip basılı tutun (veya sağ tıklayın) ve Tümünü Ayıkla'yı seçin. Yeni bir klasör belirtin veya ayıklanan dosyaları depolayacak mevcut klasöre göz atın. Örneğin, dosyaların ayıklanacağı yeni klasör olarak C:\DriverSamples\ belirtebilirsiniz.
ö. Dosyalar ayıklandıktan sonra şu alt klasöre gidin: C:\DriverSamples\Audio\Sysvad
Visual Studio'da sürücü çözümünü açma
Microsoft Visual Studio'da Dosya>Aç>Proje/Çözüm... öğesini seçin ve ayıklanan dosyaları içeren klasöre gidin (örneğin, C:\DriverSamples\Audio\Sysvad). Sysvad çözüm dosyasına çift tıklayarak açın.
Visual Studio'da Çözüm Gezgini'ni bulun. (Bu henüz açık değilse, Görünümmenüsünden Çözüm Gezgini'ni seçin.) Çözüm Gezgini'nde altı projesi olan bir çözüm görebilirsiniz.
SwapAPO Örnek Kodu
SYSVAD örneğinde beş proje vardır ve bunlardan biri APO geliştiricisi tarafından öncelikli olarak ilgi çekicidir.
| Proje | Açıklama |
|---|---|
| SwapAPO | Örnek APO için örnek kod |
Sysvad örneğindeki diğer projeler aşağıda özetlenmiştir.
| Proje | Açıklama |
|---|---|
| TabletAudioSample | Alternatif ses sürücüsü için örnek kod. |
| KeywordDetectorAdapter | Anahtar kelime algılayıcı bağdaştırıcısı için örnek kod |
| EndpointsCommon | Ortak uç noktalar için örnek kod. |
SwapAPO örneğinin birincil üst bilgi dosyaları swapapo.h'dir. Diğer birincil kod öğeleri aşağıda özetlenmiştir.
| Dosya | Açıklama |
|---|---|
| Swap.cpp | Swap APO'sunun uygulamasını içeren C++ kodu. |
| SwapAPOMFX.cpp | CSwapAPOMFX Uygulaması |
| SwapAPOSFX.cpp | CSwapAPOSFX Uygulaması |
| SwapAPODll.cpp | DLL İhracatlarının Gerçekleştirilmesi. |
| SwapAPODll.idl | DLL için COM arabirimlerinin ve ortak sınıflarının tanımı. |
| SwapAPOInterface.idl | APO Değiştirme işlevi için arabirim ve tür tanımları. |
| swapapodll.def | COM tanımlarını dışarı aktarır |
COM Nesne Ses İşleme Kodunu Uygulama
Özel sınıfınızı Baseaudioprocessingobject.h dosyasında bildirilen CBaseAudioProcessingObject temel sınıfına dayandırarak sistem tarafından sağlanan APO'ları sarmalayabilirsiniz. Bu yaklaşım, özelleştirilmiş bir APO oluşturmak için CBaseAudioProcessingObject temel sınıfına yeni işlevlerin getirilmesini içerir. CBaseAudioProcessingObject temel sınıfı, bir APO'nun gerektirdiği işlevlerin çoğunu uygular. Gerekli üç arabirimdeki yöntemlerin çoğu için varsayılan uygulamalar sağlar. Birincil özel durum , IAudioProcessingObjectRT::APOProcess yöntemidir.
CBaseAudioProcessingObject kullanarak APO'ları daha kolay uygulayabilirsiniz. APO'nun özel biçim gereksinimleri yoksa ve gerekli float32 biçiminde çalıştırılıyorsa, CBaseAudioProcessingObject'e dahil edilen arabirim yöntemlerinin varsayılan uygulamaları yeterli olmalıdır. Varsayılan uygulamalar göz önünde bulundurulduğunda yalnızca üç ana yöntem uygulanmalıdır: IAudioProcessingObject::IsInputFormatSupported, IAudioProcessingObjectRT::APOProcess ve ValidateAndCacheConnectionInfo.
CBaseAudioProcessingObject sınıfını temel alarak API'lerinizi geliştirmek için aşağıdaki adımları gerçekleştirin:
CBaseAudioProcessingObject'ten devralan bir sınıf oluşturun.
Aşağıdaki C++ kod örneği , CBaseAudioProcessingObject'ten devralan bir sınıfın oluşturulmasını gösterir. Bu kavramın gerçek bir uygulaması için , Ses İşleme Nesneleri Sürücü Örneği bölümündeki yönergeleri izleyerek Takas örneğine gidin ve swapapo.h dosyasına bakın.
// Custom APO class - SFX Class MyCustomAPOSFX: public CBaseAudioProcessingObject { public: //Code for custom class goes here ... };Not SFX APO tarafından gerçekleştirilen sinyal işleme, MFX veya EFX APO tarafından gerçekleştirilen sinyal işlemeden farklı olduğundan, her biri için ayrı sınıflar oluşturmanız gerekir.
Aşağıdaki üç yöntemi uygulayın:
IAudioProcessingObject::IsInputFormatSupported. Bu yöntem, ses altyapısıyla biçim anlaşmasını işler.
IAudioProcessingObjectRT::APOProcess. Bu yöntem, sinyal işleme gerçekleştirmek için özel algoritmanızı kullanır.
ValidateAndCacheConnectionInfo. Bu yöntem, kanal sayısı, örnekleme hızı, örnek derinliği ve kanal maskesi gibi biçim ayrıntılarını depolamak için bellek ayırır.
Aşağıdaki C++ kod örneği, 1. adımda oluşturduğunuz örnek sınıf için APOProcess yönteminin bir uygulamasını gösterir. Bu kavramın gerçek bir uygulaması için Ses İşleme Nesneleri Sürücü Örneği bölümündeki yönergeleri izleyerek Değiştirme örneğine gidin ve Swapapolfx.cpp dosyasına bakın.
// Custom implementation of APOProcess method
STDMETHODIMP_ (Void) MyCustomAPOSFX::APOProcess (...)
{
// Code for method goes here. This code is the algorithm that actually
// processes the digital audio signal.
...
}
Aşağıdaki kod örneği ValidateAndCacheConnectionInfo yönteminin bir uygulamasını gösterir. Bu yöntemin gerçek bir uygulaması için Ses İşleme Nesneleri Sürücü Örneği bölümündeki yönergeleri izleyerek Değiştirme örneğine gidin ve Swapapogfx.cpp dosyasına bakın.
// Custom implementation of the ValidateAndCacheConnectionInfo method.
HRESULT CSwapAPOGFX::ValidateAndCacheConnectionInfo( ... )
{
// Code for method goes here.
// The code should validate the input/output format pair.
...
}
Not Sınıfınızın CBaseAudioProcessingObject'ten devraldığı kalan arabirimler ve yöntemler Audioenginebaseapo.idl dosyasında ayrıntılı olarak açıklanmıştır.
Sistem tarafından sağlanan API'leri değiştirme
APO arabirimlerini uygularken iki yaklaşım vardır: kendi uygulamanızı yazabilir veya gelen kutusu API'lerini çağırabilirsiniz.
Bu sahte kod, bir sistem APO'sunu nasıl saracağınızı gösterir.
CMyWrapperAPO::CMyWrapperAPO {
CoCreateInstance(CLSID_InboxAPO, m_inbox);
}
CMyWrapperAPO::IsInputFormatSupported {
Return m_inbox->IsInputFormatSupported(…);
}
Bu sahte kod kendi özel APO'nuzu oluşturmayı gösterir.
CMyFromScratchAPO::IsInputFormatSupported {
my custom logic
}
Sistem tarafından sağlananları değiştirmek için API'lerinizi geliştirirken, arabirimler ve yöntemler için aşağıdaki listede aynı adları kullanmanız gerekir. Bazı arabirimler, listelenen gerekli yöntemlere ek olarak daha fazla yönteme sahiptir. Tüm yöntemleri mi yoksa yalnızca gerekli olanları mı uygulamak istediğinizi belirlemek için bu arabirimlerin başvuru sayfalarına bakın.
Uygulama adımlarının geri kalanı özel APO ile aynıdır.
COM bileşeni için aşağıdaki arabirimleri ve yöntemleri uygulayın:
- IAudioProcessingObject. Bu arabirim için gerekli yöntemler şunlardır: Initialize ve IsInputFormatSupported.
- IAudioProcessingObjectConfiguration. Bu arabirim için gerekli yöntemler şunlardır: LockForProcess ve UnlockForProcess
- IAudioProcessingObjectRT. Bu arabirim için gerekli yöntem APOProcess'dir ve DSP algoritmasını uygulayan yöntemdir.
- IAudioSystemEffects. Bu arabirim, ses altyapısının DLL'yi APO olarak tanımasını sağlar.
Visual Studio ve API'lerle çalışma
Visual Studio'da API'lerle çalışırken, her APO projesi için bu görevleri gerçekleştirin.
CRT bağlantısı
Windows 10'ı hedefleyen sürücüler evrensel CRT'ye dinamik olarak bağlanmalıdır.
Windows 8,1'i desteklemeniz gerekiyorsa, C/C++, Kod Oluşturma'da proje özelliklerini ayarlayarak statik bağlamayı etkinleştirin. Yayın derlemeleri için "Çalışma Zamanı Kitaplığı" değerini /MT veya hata ayıklama derlemeleri için /MTd olarak ayarlayın. Bir sürücü için MSVCRT<n>.dll ikili dosyasını yeniden dağıtmak zor olduğundan bu değişiklik yapılır. Çözüm, libcmt.dllstatik olarak bağlamaktır. Daha fazla bilgi için bkz. /MD, /MT, /LD (Run-Time Kitaplığını Kullanma) .
Katıştırılmış Bildirimin Kullanımını Devre Dışı Bırakma
APO projenizin proje özelliklerini ayarlayarak Katıştırılmış Bildirimin Kullanımını devre dışı bırakın. Bildirim Aracı, Giriş ve Çıkış'ı seçin. "Gömülü Bildirim"i varsayılan Evet ayarından Hayır olarak değiştirin. Ekli bildiriminiz varsa bu, korumalı bir ortamda yasak olan belirli API'lerin kullanımını tetikler. Bu, APO'nuzun DisableProtectedAudioDG=1 ile çalıştırılacağı, ancak bu test anahtarı kaldırıldığında WHQL imzalı olsa bile APO'nuzun yüklenememesi anlamına gelir.
Bir Sürücü ile APO'nuzu paketlemek
Kendi ses sürücünüzü geliştirip sistem tarafından sağlanan API'leri sarmaladığınızda veya değiştirdiğinizde, sürücüyü ve API'leri yüklemek için bir sürücü paketi sağlamanız gerekir. Windows 10 için bkz. Ses için Evrensel Windows Sürücüleri. Sesle ilgili sürücü paketleriniz, burada ayrıntılı olarak belirtilen ilkelere ve paketleme modeline uygun olmalıdır.
Özel APO bir DLL olarak paketlenmiş ve tüm yapılandırma kullanıcı arabirimi ayrı bir UWP veya Masaüstü Köprüsü uygulaması olarak paketlenmiş. APO cihazı INF, DLL'leri ilişkili INF CopyFile yönergesinde belirtilen sistem klasörlerine kopyalar. API'leri içeren DLL' nin INF dosyasına bir AddReg bölümü ekleyerek kendisini kaydetmesi gerekir.
Aşağıdaki paragraflar ve INF dosyası parçaları, API'leri kopyalamak ve kaydetmek için standart INF dosyasını kullanmak için gereken değişiklikleri gösterir.
Sysvad örneğine eklenen inf dosyaları, SwapApo.dll API'lerinin nasıl kaydediliyor olduğunu gösterir.
INF Dosyasında İşlem Modları ve Etkileri için API'leri Kaydetme
Belirli modlar için izin verilen belirli kayıt defteri anahtarı bileşimlerini kullanarak APO'ları kaydedebilirsiniz. Hangi efektlerin kullanılabilir olduğu hakkında daha fazla bilgi ve API'ler hakkında genel bilgi için bkz. Ses İşleme Nesne Mimarisi.
APO INF dosya ayarlarının her biri hakkında bilgi için bu başvuru konularına bakın.
PKEY_SFX_ProcessingModes_Supported_For_Streaming
PKEY_MFX_İşlemeModları_Streaming_Için_Desteklenenler
Akış için Desteklenen PKEY_EFX İşleme Modları
Aşağıdaki INF dosyası örnekleri, belirli modlar için ses işleme nesnelerinin (API) nasıl kaydedileceğini gösterir. Bu listeden kullanılabilen olası birleşimleri gösterir.
- PKEY_FX_StreamEffectClsid ile PKEY_SFX_ProcessingModes_Supported_For_Streaming
- PKEY_MFX_ProcessingModes_Suppoted_For_Streaming ile PKEY_FX_ModeEffectClsid
- PKEY_MFX_ProcessingModes_Suppoted_For_Streaming olmadan PKEY_FX_ModeEffectClsid
- PKEY_FX_EndpointEffectClsid PKEY_EFX_ProcessingModes_Supported_For_Streaming olmadan
Bu örneklerde gösterilmeyen tek bir geçerli birleşim daha vardır.
- PKEY_FX_EndpointEffectClsid ile PKEY_EFX_ProcessingModes_Supported_For_Streaming
SYSVAD Tablet Çok Modlu Akış Efekti APO INF Örneği
Bu örnek, SYSVAD Tablet INF dosyasındaki AddReg girdileri kullanılarak kaydedilen çok modlu bir akış efektini gösterir.
Bu örnek kod SYSVAD ses örneğinden alınır ve GitHub'da kullanılabilir: https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad.
Bu örnek, sistem efektlerinin bu birleşimini gösterir:
- PKEY_FX_StreamEffectClsid ile PKEY_SFX_ProcessingModes_Supported_For_Streaming
- PKEY_FX_ModeEffectClsid ile PKEY_MFX_ProcessingModes_Suppoted_For_Streaming
[SWAPAPO.I.Association0.AddReg]
; Instruct audio endpoint builder to set CLSID for property page provider into the
; endpoint property store
HKR,EP\0,%PKEY_AudioEndpoint_ControlPanelPageProvider%,,%AUDIOENDPOINT_EXT_UI_CLSID%
; Instruct audio endpoint builder to set the CLSIDs for stream, mode, and endpoint APOs
; into the effects property store
HKR,FX\0,%PKEY_FX_StreamEffectClsid%,,%FX_STREAM_CLSID%
HKR,FX\0,%PKEY_FX_ModeEffectClsid%,,%FX_MODE_CLSID%
HKR,FX\0,%PKEY_FX_UserInterfaceClsid%,,%FX_UI_CLSID%
; Driver developer would replace the list of supported processing modes here
; Concatenate GUIDs for DEFAULT, MEDIA, MOVIE
HKR,FX\0,%PKEY_SFX_ProcessingModes_Supported_For_Streaming%,%REG_MULTI_SZ%,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%,%AUDIO_SIGNALPROCESSINGMODE_MEDIA%,%AUDIO_SIGNALPROCESSINGMODE_MOVIE%
; Concatenate GUIDs for DEFAULT, MEDIA, MOVIE
HKR,FX\0,%PKEY_MFX_ProcessingModes_Supported_For_Streaming%,%REG_MULTI_SZ%,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%,%AUDIO_SIGNALPROCESSINGMODE_MEDIA%,%AUDIO_SIGNALPROCESSINGMODE_MOVIE%
;HKR,FX\0,%PKEY_EFX_ProcessingModes_Supported_For_Streaming%,0x00010000,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%
Örnek INF dosyasında, ses işleme bu katmanın üzerindeki çekirdek moduna geçirildiğinden, akış özelliğinin gerekli olmaması ve kullanılmaması için EFX_Streaming özelliğine açıklama eklendiğini unutmayın. Bulma amacıyla bir PKEY_FX_EndpointEffectClsid belirtmek geçerli olur ancak PKEY_EFX_ProcessingModes_Supported_For_Streaming belirtmek bir hata olur. Bunun nedeni, bir uç nokta APO'sunun eklenmesinin mümkün olmadığı yığında mod karışımı /tee'nin daha alt seviyelerde gerçekleşmesidir.
Bileşenli APO Yüklemesi
Windows 10 sürüm 1809'dan başlayarak ses altyapısı ile APO kaydı, bileşenleştirilmiş ses sürücüsü modelini kullanır. Ses bileşenlerinin kullanılması daha sorunsuz ve daha güvenilir bir yükleme deneyimi oluşturur ve bileşen hizmetini daha iyi destekler. Daha fazla bilgi için bkz. Bileşenli ses sürücüsü yüklemesi oluşturma.
Aşağıdaki örnek kod, public ComponentizedAudioSampleExtension.inf ve ComponentizedApoSample.inf kaynaklarından ayıklanır. GitHub'da bulunan SYSVAD ses örneğine bakın: https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad.
APO'nun ses altyapısına kaydı, yeni oluşturulan bir APO cihazı kullanılarak yapılıyor. Ses motorunun yeni APO cihazını kullanabilmesi için, bu cihaz ses cihazının PNP alt öğesi olarak yapılandırılmış olmalı ve ses uç noktaları ile eşdüzey olmalıdır. Yeni bileşenli APO tasarımı, bir APO'yu genel olarak kaydettirmeye ve birden çok farklı sürücü tarafından kullanılmasına izin vermez. Her sürücünün kendi APO'larını kaydetmesi gerekir.
APO yüklemesi iki bölümde yapılır. İlk olarak, inf sürücü uzantısı sisteme bir APO bileşeni ekler:
[DeviceExtension_Install.Components]
AddComponent = SwapApo,,Apo_AddComponent
[Apo_AddComponent]
ComponentIDs = VEN_SMPL&CID_APO
Description = "Audio Proxy APO Sample"
Bu APO bileşeni, ikinci bölüm olan APO INF yüklemesini tetikler, SYSVAD örneğinde bu işlem ComponentizedApoSample.inf dosyasında gerçekleştirilir. Bu INF dosyası APO bileşenine ayrılmıştır. Bileşen sınıfını AudioProcessingObject olarak belirtir ve CLSID kaydı ve ses altyapısına kaydolma için tüm APO özelliklerini ekler.
Uyarı
Gösterilen INF dosyası örnekleri, HKR kayıt defteri anahtarını kullanarak sürücü paketi yalıtımını destekler. Windows 11, sürüm 22000'in öncesinde, örnekler HKR yerine CLSID kayıtları için kalıcı değerleri depolamak için HKCR'yi kullandı. APO kaydı, Windows 10, sürüm 1809'dan itibaren HKR kullanılarak desteklenmektedir. Daha fazla bilgi için bkz. Evrensel INF Dosyası Kullanma.
[Version]
...
Class = AudioProcessingObject
ClassGuid = {5989fce8-9cd0-467d-8a6a-5419e31529d4}
...
[ApoComponents.NT$ARCH$]
%Apo.ComponentDesc% = ApoComponent_Install,APO\VEN_SMPL&CID_APO
[Apo_AddReg]
; CLSID registration
HKR,Classes\CLSID\%SWAP_FX_STREAM_CLSID%,,,%SFX_FriendlyName%
HKR,Classes\CLSID\%SWAP_FX_STREAM_CLSID%\InProcServer32,,0x00020000,%%SystemRoot%%\System32\swapapo.dll
HKR,Classes\CLSID\%SWAP_FX_STREAM_CLSID%\InProcServer32,ThreadingModel,,"Both"
...
;Audio engine registration
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"FriendlyName",,%SFX_FriendlyName%
...
Bu INF, bileşenleştirilmiş APO'yu yüklediğinde, Windows Cihaz Yöneticisi'nde bir masaüstü sisteminde "Ses İşleme Nesneleri" gösterilir.
Yeni bir APO sürümü yayımlandığında CLSID güncelleştirmeleri
Yeni bir APO sürümü yayınlandığında, COM sınıfı CLSID'yi güncellemek iyi bir uygulama olarak önerilir. Yeni GUID'ler oluşturmak için GUIDGEN gibi araçları kullanın.
HKCR'den HKR'ye geçerken CLSID'leri güncelleştirme gereksinimi
Cihaz göreli HKR COM kayıtlarına genel COM kayıtlarından (HKCR) geçilirken, COM sınıf GUID'sini değiştirmek bir gereksinimdir. Bu yaklaşım, yeni COM nesnelerinin düzgün kaydedilmemesi ve yüklenememesi olasılığını azaltır.
Bluetooth Ses Örneği APO INF Örneği
Bu örnek, sistem efektlerinin bu birleşimini gösterir:
PKEY_SFX_ProcessingModes_Supported_For_Streaming ile PKEY_FX_StreamEffectClsid
PKEY_FX_ModeEffectClsid ile PKEY_MFX_ProcessingModes_Suppoted_For_Streaming
Bu örnek kod, Bluetooth tutmadan ve stereo cihazları destekler.
; wdma_bt.inf – example usage
...
[BthA2DP]
Include=ks.inf, wdmaudio.inf, BtaMpm.inf
Needs=KS.Registration,WDMAUDIO.Registration,BtaMPM.CopyFilesOnly,mssysfx.CopyFilesAndRegister
...
[BTAudio.SysFx.Render]
HKR,"FX\\0",%PKEY_ItemNameDisplay%,,%FX_FriendlyName%
HKR,"FX\\0",%PKEY_FX_StreamEffectClsid%,,%FX_STREAM_CLSID%
HKR,"FX\\0",%PKEY_FX_ModeEffectClsid%,,%FX_MODE_CLSID%
HKR,"FX\\0",%PKEY_FX_UiClsid%,,%FX_UI_CLSID%
HKR,"FX\\0",%PKEY_FX_Association%,,%KSNODETYPE_ANY%
HKR,"FX\\0",%PKEY_SFX_ProcessingModes_Supported_For_Streaming%,0x00010000,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%
HKR,"FX\\0",%PKEY_MFX_ProcessingModes_Supported_For_Streaming%,0x00010000,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%
...
[Strings]
FX_UI_CLSID = "{5860E1C5-F95C-4a7a-8EC8-8AEF24F379A1}"
FX_STREAM_CLSID = "{62dc1a93-ae24-464c-a43e-452f824c4250}"
PKEY_FX_StreamEffectClsid = "{D04E05A6-594B-4fb6-A80D-01AF5EED7D1D},5"
PKEY_FX_ModeEffectClsid = "{D04E05A6-594B-4fb6-A80D-01AF5EED7D1D},6"
PKEY_SFX_ProcessingModes_Supported_For_Streaming = "{D3993A3F-99C2-4402-B5EC-A92A0367664B},5"
PKEY_MFX_ProcessingModes_Supported_For_Streaming = "{D3993A3F-99C2-4402-B5EC-A92A0367664B},6"
AUDIO_SIGNALPROCESSINGMODE_DEFAULT = "{C18E2F7E-933D-4965-B7D1-1EEF228D2AF3}"
APO INF Ses Örneği
Bu örnek INF dosyası, aşağıdaki sistem efektleri bileşimini gösterir:
PKEY_FX_StreamEffectClsid ile PKEY_SFX_ProcessingModes_Supported_For_Streaming
PKEY_MFX_ProcessingModes_Suppoted_For_Streaming ile PKEY_FX_ModeEffectClsid
PKEY_FX_EndpointEffectClsid, PKEY_EFX_ProcessingModes_Supported_For_Streaming olmadan
[MyDevice.Interfaces]
AddInterface=%KSCATEGORY_AUDIO%,%MyFilterName%,MyAudioInterface
[MyAudioInterface]
AddReg=MyAudioInterface.AddReg
[MyAudioInterface.AddReg]
;To register an APO for discovery, use the following property keys in the .inf (or at runtime when registering the KSCATEGORY_AUDIO device interface):
HKR,"FX\\0",%PKEY_FX_StreamEffectClsid%,,%FX_STREAM_CLSID%
HKR,"FX\\0",%PKEY_FX_ModeEffectClsid%,,%FX_MODE_CLSID%
HKR,"FX\\0",%PKEY_FX_EndpointEffectClsid%,,%FX_MODE_CLSID%
;To register an APO for streaming and discovery, add the following property keys as well (to the same section):
HKR,"FX\\0",%PKEY_SFX_ProcessingModes_For_Streaming%,%REG_MULTI_SZ%,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%,%AUDIO_SIGNALPROCESSINGMODE_MOVIE%,%AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS%
;To register an APO for streaming in multiple modes, use a REG_MULTI_SZ property and include all the modes:
HKR,"FX\\0",%PKEY_MFX_ProcessingModes_For_Streaming%,%REG_MULTI_SZ%,%AUDIO_SIGNALPROCESSINGMODE_DEFAULT%,%AUDIO_SIGNALPROCESSINGMODE_MOVIE%,%AUDIO_SIGNALPROCESSINGMODE_COMMUNICATIONS%
Özel APO ve CLSID APO INF Örneği Tanımlayın
Bu örnek, özel bir APO için kendi CLSID'nizi tanımlamayı gösterir. Bu örnek, MsApoFxProxy CLSID {889C03C8-ABAD-4004-BF0A-BC7BB825E166} kullanır. Bu GUID'yi CoCreate yöntemini kullanarak örneklemek, IAudioProcessingObject arabirimlerini uygulayan ve KSPROPSETID_AudioEffectsDiscovery özellik kümesi aracılığıyla temel sürücüyü sorgulayan MsApoFxProxy.dll sınıfını oluşturur.
Bu INF dosyası örneği, [BthHfAud] bölümünü gösterir, bu bölüm wdmaudio.inf içindeki [BthHfAud.AnlgACapture.AddReg.Wave] yolundan [MsApoFxProxy.Registration]'ı dahil eder ve ardından PKEY_FX_EndpointEffectClsid'i MsApoFxProxy.dlliçin tanınmış bir CLSID olarak kaydeder.
Bu INF dosyası örneği, sistem efektlerinin bu bileşiminin kullanımını da gösterir:
- PKEY_FX_EndpointEffectClsid, PKEY_EFX_ProcessingModes_Supported_For_Streaming olmadan
;wdma_bt.inf
[BthHfAud]
Include=ks.inf, wdmaudio.inf, BtaMpm.inf
Needs=KS.Registration, WDMAUDIO.Registration, BtaMPM.CopyFilesOnly, MsApoFxProxy.Registration
CopyFiles=BthHfAud.CopyList
AddReg=BthHfAud.AddReg
; Called by needs entry in oem inf
[BthHfAudOEM.CopyFiles]
CopyFiles=BthHfAud.CopyList
[BthHfAud.AnlgACapture.AddReg.Wave]
HKR,,CLSID,,%KSProxy.CLSID%
HKR,"FX\\0",%PKEY_FX_Association%,,%KSNODETYPE_ANY%
HKR,"FX\\0",%PKEY_FX_EndpointEffectClsid%,,%FX_DISCOVER_EFFECTS_APO_CLSID%
#endif
Örnek APO Etkisi Kaydı
Bu örnekte Sysvad ComponentizedApoSample.inx dosyasındaki [Apo_AddReg] bölümü gösterilmektedir. Bu bölüm, takas akışı GUID'sini COM ile kaydeder ve Takas Akışı APO etkisini kaydeder. [Apo_CopyFiles] bölümünde, 13 numaralı DestinationDirs, swapapo.dll'ı Driverstore'a kopyalar. Daha fazla bilgi için, Sürücü Paketi Yalıtımı'ndaki "Driverstore'dan Çalıştır" bölümüne bakın.
INF dosyaları hakkında genel bilgi için bkz. INF Dosyalarına Genel Bakış.
; ComponentizedApoSample.inx
...
[ApoComponent_Install]
CopyFiles = Apo_CopyFiles
AddReg = Apo_AddReg
[Apo_CopyFiles]
swapapo.dll
...
[Apo_AddReg]
; Swap Stream effect APO COM registration
HKCR,CLSID\%SWAP_FX_STREAM_CLSID%,,,%SFX_FriendlyName%
HKCR,CLSID\%SWAP_FX_STREAM_CLSID%\InProcServer32,,0x00020000,%13%\swapapo.dll
HKCR,CLSID\%SWAP_FX_STREAM_CLSID%\InProcServer32,ThreadingModel,,"Both"
'''
; Swap Stream effect APO registration
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"FriendlyName",,%SFX_FriendlyName%
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"Copyright",,%Copyright%
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MajorVersion",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MinorVersion",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"Flags",0x00010001,%APO_FLAG_DEFAULT%
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MinInputConnections",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MaxInputConnections",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MinOutputConnections",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MaxOutputConnections",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"MaxInstances",0x00010001,0xffffffff
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"NumAPOInterfaces",0x00010001,1
HKR,AudioEngine\AudioProcessingObjects\%SWAP_FX_STREAM_CLSID%,"APOInterface0",,"{FD7F2B29-24D0-4B5C-B177-592C39F9CA10}"
...
[Strings]
; Driver developers would replace these CLSIDs with those of their own APOs
SWAP_FX_STREAM_CLSID = "{B48DEA3F-D962-425a-8D9A-9A5BB37A9904}"
...
APO Kaydı
APO kaydı, ağırlıklı bir hesaplama kullanarak uç noktalara olan etkileri dinamik olarak eşleştiren bir işlemi desteklemek için kullanılır. Ağırlıklı hesaplama, aşağıdaki özellik depolarını kullanır. Her ses arabiriminde .inf veya çalışma zamanında kayıtlı sıfır veya daha fazla uç nokta özellik deposu ve efekt özellik deposu vardır. En özel uç nokta özellik deposu ve en özel efektler özellik deposu en yüksek ağırlıklara sahiptir ve kullanılır. Diğer tüm özellik depoları yoksayılır.
Özgüllük aşağıdaki gibi hesaplanır:
Uç nokta özelliği ağırlık saklar
- Özel KSNODETYPE ile FX
- KSNODETYPE_ANY ile FX
- Belirli KSNODETYPE ile MSFX
- KSNODETYPE_ANY ile MSFX
Efektler özelliği ağırlıklandırmayı saklar
- Belirli bir KSNODETYPE ile ilgili EP
- KSNODETYPE_ANY ile EP
- Belirli KSNODETYPE ile MSEP
- KSNODETYPE_ANY ile MSEP
Sayılar 0'dan başlamalı ve sıralı olarak artmalıdır: MSEP\0, MSEP\1, ..., MSEP\n EP\3 eksikse, Windows EP\n aramayı durdurur ve varsa EP\4'leri görmez
PKEY_FX_Association (efektler özellik depoları için) veya PKEY_EP_Association değeri (uç nokta özellik depoları için), Çekirdek Akışı tarafından gösterildiği gibi sinyal yolunun donanım ucundaki pin fabrikası için KSPINDESCRIPTOR.Category değeri ile karşılaştırılır.
Yalnızca Microsoft gelen kutusu sınıf sürücüleri (üçüncü taraf geliştiriciler tarafından sarılabilir) MSEP ve MSFX kullanmalıdır; üçüncü taraf sürücüler ise sadece EP ve FX kullanmalıdır.
APO Düğüm Türü Uyumluluğu
Aşağıdaki INF dosyası örneği, PKEY_FX_Association anahtarını APO ile ilişkilendirilmiş bir GUID'ye ayarlamayı gösterir.
;; Property Keys
PKEY_FX_Association = "{D04E05A6-594B-4fb6-A80D-01AF5EED7D1D},0"
"
;; Key value pairs
HKR,"FX\\0",%PKEY_FX_Association%,,%KSNODETYPE_ANY%
Ses bağdaştırıcısı birden çok girişi ve çıkışı destekleyebildiğinden, özel APO'nuzun uyumlu olduğu çekirdek akışı (KS) düğüm türünü açıkça belirtmeniz gerekir. Önceki INF dosya parçasında, APO'nun %KSNODETYPE_ANY%KS düğüm türüyle ilişkili olduğu gösterilmiştir. Bu INF dosyasının ilerleyen bölümlerinde KSNODETYPE_ANY aşağıdaki gibi tanımlanır:
[Strings]
;; Define the strings used in MyINF.inf
...
KSNODETYPE_ANY = "{00000000-0000-0000-0000-000000000000}"
KSNODETYPE_SPEAKER = "{DFF21CE1-F70F-11D0-B917-00A0C9223196}"
...
KSNODETYPE_ANY için NULL değeri, bu APO'nun herhangi bir KS düğüm türüyle uyumlu olduğu anlamına gelir. Örneğin, APO'nuzun yalnızca KSNODETYPE_SPEAKER KS düğüm türüyle uyumlu olduğunu belirtmek için, INF dosyası KS düğüm türünü ve APO ilişkilendirmesini aşağıdaki gibi gösterir:
;; Key value pairs
...
HKR,"FX\\0",%PKEY_FX_Association%,,%KSNODETYPE_SPEAKER%
...
Farklı KS düğüm türlerinin GUID değerleri hakkında daha fazla bilgi için bkz. Ksmedia.h üst bilgi dosyası.
APO Yükleme Hatalarını Giderme
APO'lar için hatanın nasıl izlendiğini anlamanıza yardımcı olmak için aşağıdaki bilgiler sağlanır. Ses grafiğine eklenemeyen API'lerde sorun gidermek için bu bilgileri kullanabilirsiniz.
Ses sistemi, APO dönüş kodlarını izleyerek API'lerin grafa başarıyla dahil edilip edilmediğini belirler. Belirtilen yöntemlerden herhangi biri tarafından döndürülen HRESULT değerlerini izleyerek dönüş kodlarını izler. Sistem, grafiğe dahil edilen her SFX, MFX ve EFX APO için ayrı bir hata sayısı değeri tutar.
Ses sistemi aşağıdaki dört yöntemden döndürülen HRESULT değerlerini izler.
CoCreateInstance
Giriş Formatı Destekleniyor mu?
Çıktı Formatı Destekleniyor mu
LockForProcess
Bu yöntemlerden biri hata kodu döndürdüğünde APO için hata sayısı değeri artırılır. APO, ses grafı içine başarıyla eklendiğini belirten bir kod döndürdüğünde hata sayısı sıfıra sıfırlanır. LockForProcess yöntemine yapılan başarılı bir çağrı, APO'nun başarıyla birleştirildiğinin iyi bir göstergesidir.
Özellikle CoCreateInstance için, döndürülen HRESULT kodunun bir hatayı göstermesinin çeşitli nedenleri vardır. Başlıca üç neden şunlardır:
Grafik korumalı içerik çalıştırıyor ve APO düzgün imzalı değil.
APO kayıtlı değil.
APO yeniden adlandırıldı veya üzerinde değişiklik yapıldı.
Ayrıca, bir SFX, MFX veya EFX APO için hata sayısı değeri sistem tarafından belirtilen sınıra ulaşırsa, PKEY_Endpoint_Disable_SysFx kayıt defteri anahtarı '1' olarak ayarlanarak SFX, MFX ve EFX API'leri devre dışı bırakılır. Sistem tarafından belirtilen sınır şu anda 10 değerindedir.