Dela via


Utökningsbara Wave-Format deskriptorer

Följande bild visar dataformatbeskrivningen för en vågljudström.

Diagram som illustrerar en vågformatbeskrivning för en ljudström.

Som anges i bilden varierar mängden ytterligare formatinformation efter KSDATAFORMAT-strukturen beroende på dataformatet.

Ljudsystem använder den här typen av formatbeskrivning på flera sätt:

  • En formatbeskrivning som den som visas i föregående bild skickas som en anropsparameter till en miniportdrivrutins NewStream-metod (till exempel IMiniportWaveCyclic::NewStream).

  • Parametern ResultantFormat för metoden IMiniport::D ataRangeIntersection pekar på en buffert där metoden skriver en formatbeskrivning som den som visas i föregående bild.

  • Begäran KSPROPERTY_PIN_DATAINTERSECTION get-property hämtar en formatbeskrivning som den som visas i föregående bild.

  • Begäran KSPROPERTY_PIN_PROPOSEDATAFORMAT set-property accepterar en formatbeskrivning som den som visas i föregående bild.

  • Ett liknande format används för KsCreatePin-funktionensConnect-anropsparameter . Den här parametern pekar på KSPIN_CONNECT struktur i början av en buffert som också innehåller en formatbeskrivning. Formatbeskrivningen, som omedelbart följer KSPIN_CONNECT struktur, börjar med en KSDATAFORMAT-struktur som den som visas i föregående bild.

Formatinformationen som följer KSDATAFORMAT-strukturen ska vara en WAVEFORMATEXTENSIBLE-struktur . WAVEFORMATEXTENSIBLE är en utökad version av WAVEFORMATEX som kan beskriva ett bredare utbud av format än WAVEFORMATEX.

WAVEFORMAT är föråldrat och stöds inte av WDM-ljudundersystemet i någon version av Microsoft Windows. PCMWAVEFORMAT-strukturen är en utökad version av WAVEFORMAT som också är föråldrad.

De fyra vågformatsstrukturerna - WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX och WAVEFORMATEXTENSIBLE – alla börjar med samma fem medlemmar, med början med wFormatTag. Föregående bild visar dessa fyra strukturer ovanpå varandra för att markera de delar av strukturerna som är identiska.

WAVEFORMATEXTENSIBLE utökar WAVEFORMATEX genom att lägga till tre medlemmar, från och med Samples.wValidBitsPerSample. (Exempel är en union vars andra medlem, wValidSamplesPerBlock, används i stället för wValidBitsPerSample för vissa komprimerade format.) WFormatTag-medlemmen , som omedelbart följer slutet av KSDATAFORMAT-strukturen i bufferten, anger vilken typ av formatinformation som följer KSDATAFORMAT.

Till skillnad från WAVEFORMATEX kan WAVEFORMATEXTENSIBLE göra följande:

  1. Ange antalet bitar per exempel separat från storleken på exempelcontainern. Ett 20-bitarsexempel kan till exempel lagras vänsterjusterat i en container med tre byte. WAVEFORMATEX, som inte kan skilja antalet databitar per exempel från exempelcontainerns storlek, kan inte beskriva ett sådant format entydigt.

  2. Tilldela specifika talarplatser till ljudkanaler i strömmar med flera kanaler. WAVEFORMATEX saknar den här funktionen och kan endast ha tillräckligt stöd för mono- och (tvåkanals) stereoströmmar.

Äldre användning av WAVEFORMATEX

Alla format som beskrivs av WAVEFORMATEX kan också beskrivas av WAVEFORMATEXTENSIBLE. Information om hur du konverterar en WAVEFORMATEX-struktur till WAVEFORMATEXTENSIBLE finns i Konvertera mellan formattaggar och underformats-GUID.

WAVEFORMATEX räcker för att beskriva format med urvalsstorlekar på 8 eller 16 bitar, men WAVEFORMATEXTENSIBLE är nödvändigt för att beskriva format med en provprecision på mer än 16 bitar. Nedan följer två exempel:

  • En dataström med 24 bitars provprecision kan använda en 32-bitars containerstorlek för effektiv bearbetning, men kan konverteras till att använda en 24-bitarscontainer för att förbättra lagringseffektiviteten utan dataförlust.

  • När du bearbetar en ström med 24-bitars exempeldata kan en återgivningsenhet som endast ger 20 bitars precision använda dithering för att förbättra återgivningen av utdatasignalen. Dithering kräver dock ytterligare bearbetningstid, och om den ursprungliga dataströmmen är korrekt till endast 20 bitar är den ytterligare bearbetningen onödig.

I båda dessa exempel är det endast möjligt att bevara signalkvaliteten och göra rätt kompromiss mellan bearbetning och lagringseffektivitet om både provprecisionen och containerstorleken är kända.

Om ett enkelt format kan beskrivas entydigt av antingen en WAVEFORMATEX- eller WAVEFORMATEXTENSIBLE-struktur, har en ljuddrivrutin möjlighet att välja antingen struktur för att beskriva formatet. Ljuddrivrutiner har dock vanligtvis använt WAVEFORMATEX för att ange MONO- och (tvåkanals) STEREO PCM-format med 8-bitars eller 16-bitarsexempel, och vissa äldre program kan förvänta sig att alla ljuddrivrutiner använder WAVEFORMATEX för att ange dessa format.

Om en drivrutin stöder ett ljudformat som entydigt kan anges som antingen en WAVEFORMATEX- eller WAVEFORMATEXTENSIBLE-struktur, bör drivrutinen känna igen formatet oavsett vilken av de två strukturerna som ett klientprogram eller en komponent använder för att ange strukturen. Om en ljudenhet till exempel har stöd för ett 44,1 kHz, 16-bitars, stereo PCM-format, ska miniportdrivrutinens egenskapshanterare för KSPROPERTY_PIN_PROPOSEDATAFORMAT och dess implementering av metoden NewStream acceptera det formatet oavsett om formatet anges som en WAVEFORMATEX- eller en WAVEFORMATEXTENSIBLE-struktur.

För att förenkla bearbetningen av formatdata använder drivrutiner vanligtvis WAVEFORMATEXTENSIBLE-strukturer för att internt representera format. Den här metoden kan kräva konvertering av en WAVEFORMATEX-indatastruktur till en intern WAVEFORMATEXTENSIBLE-representation, eller konvertering av en intern WAVEFORMATEXTENSIBLE-representation till en WAVEFORMATEX-struktur för utdata.

I WAVEFORMATEXTENSIBLE är dwBitsPerSample containerstorleken och wValidBitsPerSample är antalet giltiga databitar per exempel. Containrar är alltid bytejusterade i minnet och containerstorleken måste anges som en multipel av åtta bitar.