Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Miniportdrivrutiner måste kunna stödja flera enheter. Eftersom komponenterna TV/radio tuner, TV-ljud, tvärlist och videoinspelning är uppdelade i olika kernel-strömningsfilter är en metod nödvändig för att korrekt beskriva de topologiska maskinvaruanslutningarna mellan dessa komponenter på enheten samt på flera enheter. Till exempel måste två byggda men inte köra filterdiagram som stöder FM-radio och TV-inspelning kunna samexistera. Minidrivers använder medier för att hantera dessa scenarier. Dessutom använder filtergrafskapande program, till exempel Graph Edit, medium under filtergrafkonstruktionen för att säkerställa att filtren för en enhet ansluter korrekt till filter på en annan enhet. Till exempel bör tunerfiltret för en enhet inte ansluta till korslistfiltret för en annan enhet.
En minidrivrutin beskriver medier med KSPIN_MEDIUM-strukturen som består av en GUID-datatypmedlem (Set) följt av två ULONG-medlemmar (Id och flaggor):
Set-medlemmen ska tilldelas GUID som representerar den topologiska maskinvaruanslutningen.
Minidrivern måste ange Id-medlemmen till ett unikt värde för enhetsinstansen.
Flags-medlemmen är reserverad för systemanvändning och ska vara inställd på noll.
För att säkerställa korrekt konstruktion av filterdiagram med flera enheter som finns i systemet förblir set-medlemmen i KSPIN_MEDIUM-strukturen densamma för varje enhetsinstans. Minidrivrutinen måste dock tilldela ett unikt värde till Id-medlemmen i KSPIN_MEDIUM-strukturen per enhetsinstans. Om ID-medlemmen inte anges till ett unikt värde uppstår problem när flera enheter finns i systemet. Om två enheter installeras i systemet måste minidrivrutinen ange medlemmen Id till ett unikt värde för varje enhetsinstans. Observera att ID-medlemmen för filter för enheter som finns på samma maskinvara, till exempel tuners och crossbars, måste vara densamma. En teknik för att säkerställa att ID-medlemmen skiljer sig mellan enhetsinstanser är att ha en global räknare i minidrivrutinen och öka räknaren under enhetens plug and play-starttid innan ID sätts till sitt värde.
Beroende på det kernelströmgränssnitt som minidrivrutinen följer (AVStream eller Stream-klassen) måste minidrivrutinen specificera värdet för Id-medlemmen på ett annat sätt.
Stream-klassens minidrivrutiner anger värdet vid bearbetning av SRB_GET_STREAM_INFO.
AVStream-minidrivrutiner specificerar värdet i KSPIN_DESCRIPTOR_EX-strukturen. Det finns två olika sätt för AVStream-minidrivrutiner att ange värdet i KSPIN_DESCRIPTOR_EX struktur:
Ange statiska beskrivningar med en global ID-räknare och anropa _KsEdit under Lägg till eller Starta sändningshanterare för att ändra ID-medlemmen till ett unikt värde.
Anropa KsCreateFilterFactory för att dynamiskt skapa filter-/pin-beskrivningarna under Lägg till eller Starta sändningshanterare.
Minidrivers måste också anropa en speciell funktion för att registrera sig med Microsoft DirectShow så att program automatiskt kan konstruera filterdiagram med TV/radio-tuner, TV-ljud och korslistfilter eftersom de faktiskt inte skapar kernelströmningsstift för sina indata och utdata. När minidrivern registrerar dessa filter bör den ställa in Id-medlemmen i KSPIN_MEDIUM-strukturen till ett unikt värde. Om minidrivrutinen inte anger Id-medlemmen i KSPIN_MEDIUM-strukturen till ett unikt värde kan automatiska diagramskapande program misslyckas med att läsa in nödvändiga intilliggande filter. Men manuell filter-graph-byggnad, till exempel i Graph Edit, kan fortfarande fungera.
Så här registrerar du en minidrivrutin med DirectShow:
Stream-klassminidrivrutiner anropar funktionen StreamClassRegisterFilterWithNoKSPins för att registrera filtret i DirectShow.
AVStream-minidrivrutiner anropar funktionen KsRegisterFilterWithNoKSPins för att registrera filtret med DirectShow.
Om minidrivrutinen följer BDA-modellen, och flera instanser av en viss KSFILTER_DESCRIPTOR-struktur under en specifik KSDEVICE-struktur är registrerade i samma kategori för kernelströmmning, anropar du funktionerna KsFilterFactoryUpdateCacheData (eller BdaFilterFactoryUpdateCacheData) för att registrera filtret med DirectShow.
Den KSPIN_MEDIUM-struktur som returneras från antingen SRB_GET_STREAM_INFO (för en Stream-klassminidriver) eller KSPIN_DESCRIPTOR_EX (för en AVStream-minidriver) måste matcha den KSPIN_MEDIUM-element som returneras i följande egenskaper:
Medlemmen Medium i KSPROPERTY_CROSSBAR_PININFO_S-strukturen för KSPROPERTY_CROSSBAR_PININFO. Om mekanismerna inte matchar kan grafbyggandet misslyckas mellan minidrivarens filter och ett angränsande filter i grafen.
VideoMedium- och AudioMedium-medlemmarna i KSPROPERTY_TUNER_CAPS_S struktur KSPROPERTY_TUNER_CAPS.
InputMedium- och OutputMedium-medlemmarna i strukturen KSPROPERTY_TVAUDIO_CAPS_S av KSPROPERTY_TVAUDIO_CAPS.
Förutom att implementera medium och medelstora GUID:er på rätt sätt är det nödvändigt att följa andra riktlinjer för att säkerställa att processer kan fungera med flera filterdiagram. Minidrivrutinen får inte låsa några maskinvaruresurser förrän filterdiagrammet övergår till värdet KSSTATE_ACQUIRE i KSSTATE. Detta hjälper till att säkerställa att två byggda, men inte kör filterdiagram, kan samexistera utan att störa varandra.
Mer information om media, inklusive hur man implementerar dem, finns i AVStream Simulated Hardware Sample Driver (AVSHwS).
Anmärkning
När du härleder en ny minidriver från exempel i Windows Driver Kit (WDK), måste du generera nya GUID-värden för media för att återspegla enhetens unika maskinvarutopologi. Om du inte gör det kan mediet för en enhet kollidera med de medier som har definierats för en annan enhet.