windows - multi-kanal lyd med winmm, mange WaveOutOpen?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at spille en lyd på Windows XP i multi-kanal (parallel) måde.
Jeg havde læst et sted at spille parallelle lyde med WinMM måske ikke er muligt,
men her er hvad jeg ser:


Når jeg kalder WaveOutOpen () en gang, og så ring mange WaveOutWrite () mange gange
så lyde er ikke parallelle - de er i kø.


Men når jeg kalder WaveOutOpen, siger ni gange (og gem derefter ni håndtag til det)
og derefter kalde ni gange WaveOutWrite () med ni forskellige lyde, de er
spillet parallelt (multi-channel) - det er de blandet.


Det ser ud til at virke, men jeg er ikke sikker på, om det er okay, fordi jeg ikke finder det klart angivet
i nogen vejledning eller dokumentation.


Det er okay at spille lyd i sådan 'mange WaveOutOpen' måde ??

Bedste reference



  Når jeg kalder WaveOutOpen () en gang, og så ring mange WaveOutWrite () mange
  gange er lyde ikke parallelle - de er i kø.



Det er præcis hvad der skal ske. WaveOutWrite køer den næste buffer. Det giver dig mulighed for at sende den lyd, du vil afspille i små klumper.



  Men når jeg kalder WaveOutOpen, siger ni gange (og gem derefter ni
  håndterer den) og derefter kalde ni gange WaveOutWrite () med ni
  forskellige lyde de spilles parallelt (multi-channel) - det vil sige
  de er blandet.



Igen er dette korrekt og forventet. Dette er den nemmeste måde at afspille mange samtidige lyde på. Hvis du vil have en præcis blanding, skal du selv blande lydprøverne i en strøm af prøver og afspille det via en enkelt WaveOut-enhed.

Andre referencer 1


Jeg står korrigeret med waveOut * API's evne til at afspille lyde samtidigt og blandet.


Her er testkode for de nysgerrige: http://www.alax.info/trac/public/browser/trunk/Utilities/WaveOutMultiPlay Et program startet med argumenter abc spiller på forskellige tråde lyder på 1, 5 og 15 kHz og de blander godt. [2]


Samtidig er DirectShow Audio Renderer (WaveOut) -filter bygget oven på det samme API ikke muligt at afspille noget mere end en enkelt strøm, uden synlig grund. [3]


FYI waveOutOpen API er pensioneret siden længe siden og er i øjeblikket wrapper oven på nyere API'er. waveOutOpen forudsætter, at lydudgangsenheden åbnes til eksklusiv brug, så der er ingen garanti for at multiplicere åbne enheder simultanesouly ville producere blandet lydudgang. For at opnå en sådan adfærd vil du være bedre med en nyere lyd-API: DirectSound, DirectShow oven på DirectSound eller WASAPI.

Andre referencer 2


Jeg foreslår at gå med DirectSound, hvis dit produkt er til forbrugere.


Fra DirectX8 og fremad er API'et på det punkt, hvor det faktisk er ret smertefrit, og de fleste forbrugermaskiner vil få det installeret.