Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Zvukový modul je samostatná část logiky zpracování zvuku, která provádí relativně atomickou funkci. Zvukový modul se může nacházet v ovladači zvuku nebo v audio DSP. Příkladem zvukového modulu by bylo zpracování zvuku založeného na DSP.
Počínaje Windows 10 verze 1703 existují rozhraní API i rozhraní DDI, která podporují komunikaci z aplikací pro Univerzální platformu Windows (UPW) a ovladačů zařízení v režimu jádra.
Toto téma obsahuje informace o implementaci komunikace zvukového modulu v ovladači zařízení jádra.
Informace o tom, jak odesílat příkazy a přijímat oznámení o změnách z modulů zvukových zařízení pomocí aplikace UPW, najdete v tématu Konfigurace a dotazování modulů zvukových zařízení.
Proč používat zvukové moduly?
OEM obvykle seskupuje konfigurační aplikaci do svého systému, která zákazníkovi umožňuje řídit aspekty tohoto zvukového systému a ladit ji podle svých preferencí. Zvukový subsystém může obsahovat různé komponenty, jako jsou objekty pro zpracování zvuku na hostiteli, hardwarové zpracování DSP a specializovaný hardware, jako je inteligentní amp (kromě samotného zvukového kodeku). Ve většině případů se tyto komponenty vytvářejí a prodávají různými dodavateli. V minulosti vytvořili vlastní privátní rozhraní API, která se vzájemně integrují a odesílají informace mezi jednotlivými komponentami. Stávající konfigurační aplikace WIN32 pak budou využívat tato privátní rozhraní API.
Univerzální platforma Windows (UPW) poskytuje sadu rozhraní API, která umožňují, aby jedna aplikace běžela na různých zařízeních. UWP také zavedlo nový vzhled a chování, které se stalo očekáváním zákazníků pro aplikace běžící na Windows 10. Tolik OEM by chtělo vytvořit své aplikace pro konfiguraci zvuku v UPW. Základní funkce zabezpečení UPW (sandbox AppContainer) ale brání komunikaci z aplikace do jiných součástí zvukového subsystému. Tím se znemožňuje přístup konfiguračních aplikací k privátním API rozhraním, která byla dříve využívaná, v UWP.
Počínaje Windows 10 verze 1703 rozhraní API pro UPW zvukových modulů umožňuje konfiguračním aplikacím a komponentám uživatelského režimu komunikovat s moduly v jádru a hardwarové vrstvě, které jsou zjistitelné prostřednictvím nové sady vlastností KS. Audio IHV a nezávislí výrobci softwaru můžou psát aplikace a služby, které můžou komunikovat s jejich hardwarovými moduly pomocí dobře definovaného rozhraní poskytovaného systémem Windows. Pro další informace o rozhraní API zvukových modulů se podívejte na Obor názvů Windows.Media.Devices.
Definice zvukových modulů
Tyto definice jsou specifické pro zvukové moduly.
termín | Definice |
---|---|
Zvukový modul | Odlišná část logiky zpracování zvuku, která provádí relativně atomickou funkci. Může se nacházet ve zvukovém ovladači nebo v audio DSP. Příkladem zvukového modulu by byl objekt APO (Audio Processing Object). |
Běžné definice zvuku
Tyto definice se obvykle používají při práci se zvukovými ovladači.
termín | Definice |
---|---|
HSA | Aplikace podpory hardwaru |
Univerzální platforma Windows (UWP) | Univerzální platforma Windows |
APO | Objekt zpracování zvuku |
Digitální zpracování signálu | Digitální zpracování signálu |
termín | Definice |
---|---|
Výrobce OEM | Výrobce originálního vybavení |
IHV | Nezávislý dodavatel hardwaru |
Nezávislý dodavatel softwaru (ISV) | Nezávislý dodavatel softwaru |
Architektura
Zvukové moduly zavádí podporovaný mechanismus operačního systému Windows pro odesílání zpráv mezi uživatelským režimem a zvukovými komponentami režimu jádra. Důležitým rozdílem je, že zvukové moduly standardizuje přenosový kanál. Nestanoví komunikační protokol přes tento přenos a spoléhá na nezávislé výrobce softwaru (ISV) a hardwaru (IHV), aby definovali protokol. Záměrem je umožnit stávajícím návrhům třetích stran snadno migrovat na zvukové moduly s velmi malými změnami.
Diagram znázorňuje, jak zvuková data proudí z uživatelských aplikací dolů k ovladači zvuku prostřednictvím rozhraní API zvukového modulu.
Moduly zařízení a streamovací moduly se nacházejí v závislosti na tom, jestli se k nim přistupuje z klientského procesu, nebo z objektu APO spuštěného ve službě AudioDG pomocí rozhraní modulů streamu poskytovaného APO ze služby AudioDG. Obecné informace o zvukovém endginu a grafu zvukového zařízení (AudioDG) najdete v tématu Architektura zvuku systému Windows.
Ovladač upozorní systém Windows.Media.Devices na změny modulů prostřednictvím funkce IoReportTargetDeviceChangeAsynchronous, která se pak převede na zpětná volání z rozhraní API modulů do procesu klienta nebo objektu APO.
Rozhraní API zvukového modulu poskytuje přístup k modulům prostřednictvím dvou různých metod cílení: KS vlnového filtru a inicializovaného KS pinu (stream). Umístění a přístup ke konkrétním modulům jsou specifické pro implementaci.
HSA a jiné aplikace budou mít přístup pouze k modulům, které jsou dostupné prostřednictvím popisovače filtru. Jednotlivé objekty APO načtené do datového proudu jsou jedinými objekty, které budou mít přístup k cílovým zvukovým modulům datového proudu. Další informace o objektech APO naleznete v tématu Windows Audio Processing Objects.
Odesílání příkazů
Cesta klienta zvukového modulu k dotazování a změně parametrů spočívá v odesílání příkazů do zvukových modulů v jádru a hardwarových komponentách v zvukovém subsystému. Struktura příkazů rozhraní API zvukových modulů je volně definovaná a formalizuje způsob, jakým se moduly zjistí a identifikují. Podrobná struktura příkazů však musí být navržena a implementována zapojenými ISV a IHV, aby se vytvořil protokol, který určuje, jaké zprávy lze odesílat a jaká je očekávaná odpověď.
Oznámení modulu pro klienty audio modulů
Miniport zvuku má také způsob, jak informovat a předávat informace klientům zvukového modulu, pokud se klient přihlásil k odběru oznámení o konkrétním modulu. Informace předávané v těchto oznámeních nejsou definovány rozhraním API zvukového modulu, ale jsou definovány ISV a/nebo IHV.
Povolení, zakázání a obecné informace o topologii
Rozhraní API zvukových modulů definují, jak vytvořit výčet a odesílat příkazy do modulů. Rozhraní API ale explicitně nedefinují, jak můžou klienti zvukového modulu povolit nebo zakázat konkrétní moduly. Také nevytvořuje způsob, jak klienti najít informace o topologii nebo umístění modulů ve vztahu k sobě navzájem. Nezávislí výrobci hardwaru (IHVs) a nezávislí výrobci softwaru (ISVs) můžou určit, jestli je tato funkce potřebná, a rozhodnout, jak ji implementovat.
Doporučený postup představuje globální modul ovladačů. Modul globálního ovladače zpracovává vlastní příkazy pro tyto požadavky specifické pro topologii.
Zvukový modul DDI
Vlastnosti modulu zvukového streamování jádra
Byla definována nová sada vlastností KS identifikovaná KSPROPSETID_AudioModule pro tři vlastnosti specifické pro zvukové moduly.
Ovladač miniportu PortCls musí přímo zpracovat odpověď pro každou vlastnost, protože není k dispozici žádné pomocné rozhraní.
ksmedia.h:
#define STATIC_KSPROPSETID_AudioModule \
0xc034fdb0, 0xff75, 0x47c8, 0xaa, 0x3c, 0xee, 0x46, 0x71, 0x6b, 0x50, 0xc6
DEFINE_GUIDSTRUCT("C034FDB0-FF75-47C8-AA3C-EE46716B50C6", KSPROPSETID_AudioModule);
#define KSPROPSETID_AudioModule DEFINE_GUIDNAMED(KSPROPSETID_AudioModule)
typedef enum {
KSPROPERTY_AUDIOMODULE_DESCRIPTORS = 1,
KSPROPERTY_AUDIOMODULE_COMMAND = 2,
KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID = 3,
} KSPROPERTY_AUDIOMODULE;
Popisovače zvukového modulu
Podpora vlastnosti KSPROPERTY_AUDIOMODULE_DESCRIPTORS identifikuje ovladač jako podporující zvukové moduly. Vlastnost bude vyžádána prostřednictvím filtru nebo popisovače pin a KSPROPERTY se předává jako vstupní buffer pro volání DeviceIoControl. KSAUDIOMODULE_DESCRIPTOR bylo definováno k popisu každého modulu v rámci zvukového hardwaru. V odpovědi na tento požadavek se vrátí pole těchto popisovačů.
ksmedia.h:
#define AUDIOMODULE_MAX_NAME_SIZE 128
typedef struct _KSAUDIOMODULE_DESCRIPTOR
{
GUID ClassId;
ULONG InstanceId;
ULONG VersionMajor;
ULONG VersionMinor;
WCHAR Name[AUDIOMODULE_MAX_NAME_SIZE];
} KSAUDIOMODULE_DESCRIPTOR, *PKSAUDIOMODULE_DESCRIPTOR;
Další informace viz KSAUDIOMODULE_DESCRIPTOR.
Příkaz zvukového modulu
Podpora vlastnosti KSPROPERTY_AUDIOMODULE_COMMAND umožňuje klientům zvukového modulu odesílat vlastní příkazy pro dotazování a nastavení parametrů v audio modulech. Vlastnost lze odeslat pomocí filtru nebo úchytky pin a KSAUDIOMODULE_PROPERTY se předává jako vstupní vyrovnávací paměť pro volání DeviceIoControl. Klient může volitelně odeslat další informace bezprostředně vedle KSAUDIOMODULE_PROPERTY ve vstupní vyrovnávací paměti pro odesílání vlastních příkazů.
ksmedia.h:
#define AUDIOMODULE_MAX_DATA_SIZE 64000
typedef struct _KSPAUDIOMODULE_PROPERTY
{
KSPROPERTY Property;
GUID ClassId;
ULONG InstanceId;
} KSAUDIOMODULE_PROPERTY, *PKSPAUDIOMODULE_PROPERTY;
Další informace najdete v tématu KSAUDIOMODULE_PROPERTY.
ID zařízení modulu zvukového oznámení
Podpora KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID je nutná k tomu, aby miniport signalizoval oznámení a předával informace klientům zvukového modulu. Životnost tohoto ID je svázaná s životností zvukového zařízení, které je vystavené a aktivní ve vrstvě Windows Audio. Vlastnost lze odeslat pomocí filtru nebo úchytu pin a KSPROPERTY se předává jako vstupní vyrovnávací paměť pro volání DeviceIoControl.
Další informace najdete v tématu KSAUDIOMODULE_PROPERTY.
Pomocná rutina PortCls – Oznámení zvukového modulu
Bylo přidáno nové rozhraní portu, které vývojářům ovladačů pomáhá odesílat oznámení klientům zvukového modulu.
PortCls.h:
typedef struct _PCNOTIFICATION_BUFFER
{
UCHAR NotificationBuffer[1];
} PCNOTIFICATION_BUFFER, *PPCNOTIFICATION_BUFFER;
DECLARE_INTERFACE_(IPortClsNotifications,IUnknown)
{
DEFINE_ABSTRACT_UNKNOWN() // For IUnknown
STDMETHOD_(NTSTATUS, AllocNotificationBuffer)
( THIS_
_In_ POOL_TYPE PoolType,
_In_ USHORT NumberOfBytes,
_Out_ PPCNOTIFICATION_BUFFER* NotificationBuffer
) PURE;
STDMETHOD_(void, FreeNotificationBuffer)
( THIS_
_In_ PPCNOTIFICATION_BUFFER NotificationBuffer
) PURE;
STDMETHOD_(void, SendNotificationBuffer)
( THIS_
_In_ const GUID* NotificationId,
_In_ PPCNOTIFICATION_BUFFER NotificationBuffer
) PURE;
};
//
// Audio module notification definitions.
//
#define STATIC_KSNOTIFICATIONID_AudioModule \
0x9C2220F0, 0xD9A6, 0x4D5C, 0xA0, 0x36, 0x57, 0x38, 0x57, 0xFD, 0x50, 0xD2
DEFINE_GUIDSTRUCT("9C2220F0-D9A6-4D5C-A036-573857FD50D2", KSNOTIFICATIONID_AudioModule);
#define KSNOTIFICATIONID_AudioModule DEFINE_GUIDNAMED(KSNOTIFICATIONID_AudioModule)
typedef struct _KSAUDIOMODULE_NOTIFICATION {
union {
struct {
GUID DeviceId;
GUID ClassId;
ULONG InstanceId;
ULONG Reserved;
} ProviderId;
LONGLONG Alignment;
};
} KSAUDIOMODULE_NOTIFICATION, *PKSAUDIOMODULE_NOTIFICATION;
Další informace najdete tady:
IPortClsNotifications::AllocNotificationBuffer
IPortClsNotifications::FreeNotificationBuffer
IPortClsNotifications::SendNotificationBuffer
Posloupnost volání
Miniport zavolá na svůj port, aby vytvořil a odeslal oznámení. V tomto diagramu je znázorněna obecná posloupnost volání.