Aracılığıyla paylaş


Ses İşleme Nesnelerinin Uygulanması

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.

  1. İstenen ses işlemeyi sağlamak için özel APO com nesneleri oluşturun.
  2. İsteğe bağlı olarak özel APO'ları yapılandırmak için kullanıcı arabirimi oluşturun.
  3. 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:

  • 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>>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:

  1. 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.

  2. Aşağıdaki üç yöntemi uygulayın:

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:

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.

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_FX_StreamEffectClsid

PKEY_FX_ModeEffectClsid

PKEY_FX_EndpointEffectClsid

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

  1. Özel KSNODETYPE ile FX
  2. KSNODETYPE_ANY ile FX
  3. Belirli KSNODETYPE ile MSFX
  4. KSNODETYPE_ANY ile MSFX

Efektler özelliği ağırlıklandırmayı saklar

  1. Belirli bir KSNODETYPE ile ilgili EP
  2. KSNODETYPE_ANY ile EP
  3. Belirli KSNODETYPE ile MSEP
  4. 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.

Windows Ses İşleme Nesneleri

Bileşenli ses sürücüsü yüklemesi oluşturma

Sürücü paketi yalıtımı