Dela via


Algoritm för Audio Endpoint Builder

I Windows Vista och senare versioner av Windows är AudioEndpointBuilder en systemtjänst som räknar upp, initierar och aktiverar ljudslutpunkterna i ett system. Det här avsnittet innehåller en översikt över algoritmen som används av tjänsten AudioEndpointBuilder.

Tjänsten AudioEndpointBuilder använder en algoritm för att identifiera och räkna upp slutpunkter. Algoritmen har utformats för att förenkla systemåtkomsten till muxed-avbildningsenheter (MUXed) och för att hjälpa till att arbeta med topologier som omfattar flera värdstift och flera bryggstift, eller båda.

I Windows XP använde ljudmodellen termen ljudenhet för att referera till en konceptuell enhet i PnP-trädet (Plug and Play). I Windows Vista och senare versioner av Windows har begreppet ljudenhet gjorts om för att bättre representera den enhet som användaren interagerar fysiskt med.

Med två nya API:er i Windows Vista, MMDevice API och WASAPI kan du komma åt och manipulera dessa nya ljudenheter. MMDevice-API:et refererar till de nya ljudenheterna som slutpunkter.

Tjänsten AudioEndpointBuilder övervakar KSCATEGORY_AUDIO-klassen för enhetsgränssnittets ankomster och borttagningar. När en ljudenhetsdrivrutin registrerar en ny instans av KSCATEGORY_AUDIO-enhetsgränssnittsklassen identifierar Tjänsten AudioEndpointBuilder meddelandet för enhetsgränssnittet och använder en algoritm för att undersöka topologin för ljudenheterna i systemet och vidta lämpliga åtgärder.

I följande lista sammanfattas hur algoritmen som används av AudioEndpointBuilder fungerar:

  1. Söker efter eventuella bryggstift som inte är anslutna.

  2. Skapar en slutpunkt för eventuella bryggstift som inte är anslutna. Till exempel, när AudioEndpointBuilder hittar en oansluten bryggstift med en pinne-kategorins GUID för KSNODETYPE_SPEAKER, skapar den en högtalarändpunkt för den här bryggstiftet. Mer information om KSNODETYPE_SPEAKER och andra GUID:er för pin-kategori finns i Ksmedia.h i WinDDK\<build number>\inc\api.

  3. Anger standardegenskaperna för slutpunkten. Till exempel anger AudioEndpointBuilder namnet, ikonen och formfaktorn.

  4. Avgör om det finns en sökväg från slutpunkten till en värdplint som stöder pulskodmodulering (PCM), ljud-codec 3 (AC3) eller Windows Media Video (WMV). En host pin är en KSPIN-struktur med kommunikationsmedlemmen inställd på KSPIN_COMMUNICATION_SINK eller KSPIN_COMMUNICATION_BOTH. Mer information om KSPIN-strukturen finns i KSPIN.

  5. Fyller i slutpunkten PropertyStore med egenskapsinformation från registernycklarna i ljudenhetsgränssnittet.

  6. Anger slutpunktens tillstånd. Slutpunktens tillstånd kan vara något av följande tre värden:

    • Aktiv. Detta anger att det finns en sökväg enligt beskrivningen i steg 4.

    • Frånkopplad Om ljudenheten stöder jackidentifiering, anger detta tillstånd att det finns en anslutning för slutpunkten och att uttaget är frånkopplat från den fysiska anslutningspunkten på ljudadaptern.

    • Inte närvarande. Det här tillståndet anger att en sökväg inte hittades i steg 4 och att jackidentifiering inte stöds av den här slutpunkten.

  7. Anger den här slutpunkten som standardslutpunkt, om det är det som anges i den associerade INF-filen.

När slutpunkterna har uppräknats kan klienter i ljudsystemet manipulera dem direkt med hjälp av de nya Windows Vista-API:erna (som tidigare nämnts) eller indirekt med hjälp av de mer välbekanta API:erna som Wave, DirectShow eller DirectSound. Nya API-metoder har angetts så att ljudklienter kan börja med MMDevice-ID:t för en slutpunkt och få åtkomst till Wave- eller DirectSound-ID:t för samma slutpunkt.

När du använder slutpunkter kan du dra nytta av följande:

  • Samma globalt unika ID (GUID) är tillgängligt oavsett hur ofta du startar om datorn. Att ha detta beständiga GUID är mer tillförlitligt än att spara ett waveOut-ID eller ett beskrivande namn för slutpunkten.

  • Samma PropertyStore är tillgängligt oavsett hur ofta du startar om datorn. Ljudenhetsrelaterade metadata sparas i slutpunkten PropertyStore.

  • Pinnar för multiplexed (MUX) och de-multiplexed (DEMUX) hanteras automatiskt och indexeras av AudioEndpointBuilder-tjänsten.

Om du utvecklar din egen ljudenhetsdrivrutin och INF-fil för att arbeta med din ljudenhet och utveckla ett ljudprogram, eller båda, är det bäst att vara medveten om följande problem och metodtips. När du utvecklar drivrutiner och program med dessa rekommendationer i åtanke skapar du drivrutiner, INF-filer och ljudklienter som fungerar mer effektivt med AudioEndpointBuilder.

  • Namnkonvention. Namngivningskonventionen som används för slutpunkterna baseras på de vänliga namnen på bryggstiften. Men när det gäller talarslutpunkter har namnet hårdkodats till "Speakers" och kan inte ändras av drivrutinen eller ett program från tredje part.

  • Suboptimala topologier. Vissa topologier anses vara suboptimala på grund av algoritmen som används av AudioEndpointBuilder för att räkna upp slutpunkter. När du till exempel skapar en av dessa suboptimala topologier skapar du värdstift som har dolda slutpunkter och som inte kan ses av AudioEndpointBuilder eller splitters (delade slutpunkter) som AudioEndpointBuilder inte kan länka till sina associerade värdstift.

    • Dolda slutpunkter

      I följande diagram visas att KS-filtret har två värdstift som är anslutna till en enda anslutningsstift (Speaker).

      Diagram som visar problematisk topologi med AC-3-värdstift och dold slutpunkt till vänster, enskilda PCM- och AC-3-delningsfilter.

      När AudioEndpointBuilder upptäcker detta bryggstift spårar den en sökväg tillbaka till endast en av värdstiften, anger standardvärdena för bryggstiftet, skapar och aktiverar en högtalarslutpunkt och fortsätter att upptäcka andra bryggstift. Därför förblir den andra värd-pinne dold från AudioEndpointBuilder.

      Diagram som illustrerar rekommenderad topologi med spårningsbara sökvägar mellan värdstift och slutpunkter.

      I föregående diagram har den problematiska topologin gjorts om så att AudioEndpointBuilder kan identifiera de två värdstiften (PCM och AC-3/ PCM) eftersom den nu kan se två bryggstift (högtalare och SPDIF).

    • Splitters

      En annan typ av suboptimal topologi skapas när en värdkontakt ansluter till mer än en bryggkontakt. Följande diagram visar en topologi där ett PCM-hoststift ansluter till ett högtalarbryggstift och ett SPDIF-bryggstift.

      Diagram som visar problematisk topologi med två slutpunkter anslutna till en värdstift och en enda PCM.

      I det här fallet identifierar AudioEndpointBuilder en anslutningsstift, spårar en sökväg tillbaka till PCM-värdstiftet, anger standardvärden och skapar sedan en högtalarändpunkt och aktiverar den. När AudioEndpointBuilder identifierar nästa anslutningsstift spårar den en bana tillbaka till samma PCM-värdstift, anger standardvärden och sedan skapar och aktiverar en SPDIF-slutpunkt. Men även om båda slutpunkterna har initierats och aktiverats gör direktuppspelning till en av dem det omöjligt att strömma till den andra samtidigt. med andra ord är de ömsesidigt uteslutande slutpunkter.

      Följande diagram visar en omdesign av den här topologin där separata anslutningar finns. Den här designen möjliggör för AudioEndpointBuilder att spåra en sökväg tillbaka till PCM-värdpinnen för var och en av de två bryggpinnarna.

      Diagram som illustrerar rekommenderad topologi med spårbara sökvägar mellan värdstift och slutpunkter, med två PCM:er till vänster.

  • Slutpunktsformat. När ljudmotorn körs i delat läge förutsätter formatet för slutpunkten en specifik inställning som dirigeras av INF-filen vid tidpunkten för installationen. Ljuddrivrutinen för en ljudenhet använder till exempel sin associerade INF-fil för att ange standardslutpunkten till ett 44,1 kHz, 16-bitars stereo-PCM-format. Efter installationen måste du använda Kontrollpanelen eller ett program från tredje part för att ändra slutpunktsformatet.

  • Standardenhet. Slutpunkten som anges som standardenhet väljs vid tidpunkten för installationen med hjälp av information i INF-filen. När installationen har slutförts måste du använda Kontrollpanelen eller ett program från tredje part för att välja en annan slutpunkt som standardslutpunkt.

Not Om INF-filen inte väljer en slutpunkt som ska anges som standard under installationen kan ett klientprogram använda MMDevice-API:et för att välja en slutpunkt. API:et baserar sitt val på rangordningen för formfaktorn och om slutpunkten är en återgivning eller en avbildningsslutpunkt. I följande tabell visas urvalsordningen.

Rendera rangordning Fånga rangordning
Högtalare Mikrofon
Linje ut Linjeingång
SPDIF SPDIF

Om du använder MMDevice-API:et för att välja en standardslutpunkt och de tillgängliga slutpunkterna rangordnas på samma sätt, alfabetiserar MMDevice-API:et slutpunkts-ID:n för att avgöra vilken slutpunkt som ska väljas som standard. Om ett ljudkort, till exempel, har både line-out- och line-in-anslutningar, och den associerade INF-filen inte väljer någon av dem som standard vid tidpunkten för installationen, identifierar MMDevice-API:et vilken slutpunkts-ID som kommer först i alfabetisk ordning och ställer in den anslutningen som standard. Det här valet kvarstår när du har startat om systemet eftersom slutpunkts-ID:na är beständiga. Valet bevaras dock inte om en ändpunkt med högre prioritet (till exempel en andra adapter med en mikrofonanslutning) visas i systemet.