Die beste Antwort hier ist: Verwenden Sie DirectSound nicht, es sei denn, Sie verwenden Windows XP.
Wenn Sie nur einen einzigen Ton gleichzeitig spielen und sich kein Echtzeit-Mischen interessiert, können Sie etwas so Triviales wie PlaySound verwenden. Ich gehe davon aus, dass Sie tatsächlich Echtzeit-Mixing und die Fähigkeit, mehrere Sounds, die sich überschneiden, spielen möchten.
Für Windows 8, Windows 8.1 oder Windows 10 können Sie XAudio 2.8 oder 2.9 verwenden, das in das Betriebssystem integriert ist. Andernfalls können Sie XAudio 2.7 verwenden, das Teil der legacy DirectX SDK ist.
Für einige Bildungsressourcen siehe Learning XAudio2.
Siehe DirectX Tool Kit for Audio für eine einfache C++ - Wrapper für XAudio2.
RE: Directsound-Puffer
Um Ihre ursprüngliche Frage: zurück in den alten Tagen von Windows 95 der ‚Primärpuffer‘ war der eigentliche Audiopuffer an die Hardware gestellt. In den "sekundären Puffern" haben Sie Ihre individuellen "Stimmen" für die Wiedergabe von mehr als einem Ton erstellt. Das System mischt dann alle sekundären Puffer in den primären Puffer für die Wiedergabe.
Seit dem Übergang zu NT ist der 'primäre Puffer' jedoch nicht mehr vorhanden. Es gibt einen sogenannten "primären" Puffer, der aber hauptsächlich für BackCompat da ist. Alle Puffer werden von DirectSound in einen einzelnen Puffer gemischt und dann dem System zur Wiedergabe zugeführt. Unter Windows Vista oder höher wird es an die Windows Core API (WASAPI) weitergeleitet, die alle Sounds des Systems und aller laufenden Anwendungen mischt, bevor sie tatsächlich zur Audio-Hardware gelangen.
Sie können WASAPI direkt verwenden, die API ist jedoch ziemlich restriktiv, da sie keine Misch- oder Quellratenkonvertierungen auf Anwendungsebene ausführt. Im Allgemeinen verwenden Sie WASAPI nur dann direkt, wenn Sie eine Audio-Engine sind, die bereits alle erforderlichen Konvertierungen und Mischvorgänge durchgeführt hat und nur noch eine Endmischung spielen möchte.
In jedem Fall ist der Grund, gibt es zwei Sätze von Zeigern, wenn sie mit Lock
tun ist, weil es ein „Ringpuffer“ aka einen „Ringpuffer“ ist. In den alten Tagen von Windows 95 wurden Teile des primären Puffers tatsächlich von der Hardware genau zur gleichen Zeit abgespielt, in der Sie in den Puffer schreiben könnten, bevor die Wiedergabe gerade stattfand. Sie hatten dieses komplizierte Two-Pointer-Setup, um das Überschreiben von Daten zu vermeiden, die noch abgespielt wurden - sonst haben Sie das gefürchtete "Popping" oder "Glitching" in Ihrer Sound-Wiedergabe. Da dies bei modernen Windows-Versionen nie mehr der Fall ist, ist BackCompat w.r.t. zum primären Puffer. Dennoch nutzt der DirectSound-Mixer immer noch die Tatsache, dass sekundäre Puffer "Ringpuffer" sind, also wird derselbe Mechanismus verwendet, um das Lesen des Echtzeit-Mixers zu schützen, wenn Sie 'voraus' schreiben, wenn Sie gerade ein Spiel aktualisieren Puffer. Wenn ein sekundärer Puffer nicht abgespielt wird, können Sie einfach nullptr
für den zweiten Zeiger & Größe übergeben.
Dieses Old-School- "Ringpuffer" -Modell war kompliziert zu arbeiten, und war wichtiger, wenn Systemspeicher sehr begrenzt war. So ziemlich alle modernen Sound-APIs basieren auf "Paketen", wobei jede abspielende Stimme eine Warteschlange ausstehender Puffer aufweist und Sie weitere Daten hinzufügen, indem Sie einen neuen Puffer zur Verarbeitung an die Warteschlange senden. Sie können Benachrichtigungen erhalten, wenn ein Puffer abgeschlossen ist, um zu wissen, dass das Audio in diesem "Paket" verarbeitet wurde.
Auch in DirectSound mussten Sie die Audiodaten in den von Lock
bereitgestellten Speicher kopieren, aber moderne 'Paket'-basierte APIs vermeiden die zusätzliche Kopie, indem die Quelldaten direkt aus dem Anwendungsspeicher gelesen werden. Dies fügt die Schwierigkeit hinzu, dass Sie sicherstellen müssen, dass der Quellspeicher verfügbar bleibt, bis die Wiedergabe gestoppt ist (dh Sie können den Speicher nicht lesen, wenn er noch vom Echtzeit-Mixer gelesen wird oder Ihre Anwendung abstürzt), aber dafür Sie vermeiden viel zusätzliches Kopieren.
Der Puffer kann kreisförmig sein. So kann der Puffer konzeptionell umgehen. Wenn das passiert, ist der Puffer nicht zusammenhängend und muss durch zwei getrennte Speicherbereiche repräsentiert werden. –
Jetzt machen Sinn. Wenn die zu sperrende Größe größer als die Puffergröße ist, wird sie auf einem anderen Teil gespeichert. Danke David. –
Beachten Sie, dass ich nichts über Audio weiß, und nur das von ein paar Websuchen gefunden. Du solltest tiefer graben. Es gibt sicherlich viel mehr Feinheiten. Aber Websearch wird Sie weit bringen. –