Freigeben über


Kombinieren von benutzerdefinierten und Windows-APOs

Audioverarbeitungsobjekte (Audio Processing Objects, APOs) bieten anpassbare softwarebasierte digitale Signalverarbeitung für Windows-Audiostreams. Es ist möglich, von Microsoft bereitgestellte APOs mit vom Partner entwickeltem Code zu kombinieren und die vorhandene Funktionalität umzuschließen und anzupassen.

Allgemeine Informationen zu APOs finden Sie in diesen Themen.

APOs wurden zum ersten Mal in Windows Vista eingeführt, und möglicherweise werden Verweise auf die früheren System-APOs ( sAPOs) angezeigt. Weitere Informationen finden Sie im Whitepaper Benutzerdefinierte Audioeffekte in Windows Vista . Dieses Whitepaper kann auf ältere COM- und UI-Entwicklungsthemen verweisen.

Kombinieren von benutzerdefinierten und Windows-APOs

Dieser Abschnitt enthält Richtlinien zum Implementieren von APOs für benutzerdefinierte Audiosystemeffekte, indem ein dünner Wrapper um den entsprechenden APO erstellt wird. Benutzerdefinierte APO bezieht sich auf die Implementierung des APO durch den IHV.

Es gibt zwei Arten von APOs: SFX (Stream) und MFX (Modus). In Windows 8.1 wurde SFX als LFX (lokal) und MFX als GFX -APOs (global) bezeichnet.

IHVs können benutzerdefinierte Audiosystemeffekte-APOs implementieren, um eine oder beide der benutzerdefinierten Windows SFX- und MFX-Audiosystemeffekt-APOs zu ersetzen. Im Allgemeinen verfügen IHVs oder OEMs über zwei grundlegende Strategien, um benutzerdefinierte Audiosystemeffekte-APOs mit den VON Windows bereitgestellten APOs zu kombinieren. Diese Strategien geben den IHVs Flexibilität bei der Integration ihrer benutzerdefinierten Effekte mit denen von Windows.

Replace

Entwickeln Sie ein detailliertes Verständnis der Windows-APO, die Sie ersetzen möchten, und deren Features. Verwenden Sie dieses Verständnis, um eine benutzerdefinierte APO zu implementieren, die den Windows-APO auf eine Weise aufruft, die für den IHV aus der Perspektive der Zielbenutzerfreundlichkeit am sinnvollsten ist. Diese Strategie eignet sich am besten für IHVs oder OEMs, die Folgendes ausführen möchten:

  • Integrieren Sie ihre benutzerdefinierten Effekte nahtlos in die Windows-Effekte.
  • Implementieren Sie eine eigene Benutzeroberfläche, um deren Auswirkungen und die von den Windows-APOs implementierten Effekte zu steuern.

Weitere Informationen zum Schreiben eines APO finden Sie unter Windows Audio Processing Objects.

Dünner Wrapper

Schreiben Sie den benutzerdefinierten APO als dünnen Wrapper um den Windows-APO. Diese Strategie eignet sich am besten für IHVs oder OEMs, die Folgendes ausführen möchten:

  • Fügen Sie ihre benutzerdefinierten Effekte auf einfachste Weise hinzu.
  • Lassen Sie die Windows-Benutzeroberfläche die Auswirkungen weiterhin steuern.

IHV oder OEMs, die strategie die Dünne Wrapper-Option auswählen, sollten sich dennoch windows Audio Processing Objects ansehen, um ein umfassendes Verständnis der Benutzerdefinierten Windows-Audiosystemeffekte zu erhalten.

Hinweis: Mit der Schlanken Wrapperstrategie können IHVs keine Benutzeroberfläche hinzufügen, um ihre hinzugefügten benutzerdefinierten Audiosystemeffekte auf der Registerkarte Windows-Erweiterungen zu steuern. Es gibt nur eine Registerkarte Verbesserungen, die der Eigenschaftenseite für die Windows-APOs zugeordnet bleiben muss. Die Benutzeroberfläche des IHV muss auf andere Weise implementiert werden, z. B. eine separate Systemsteuerung Anwendung.

Programmierinformationen

In diesem Abschnitt werden die allgemeinen Programmierprobleme behandelt, die bei der Implementierung benutzerdefinierter APOs behoben werden müssen.

Sowohl SFX(Stream) als auch MFX(Mode)-APOs für benutzerdefinierte Audiosystemeffekte weisen die folgenden allgemeinen Merkmale auf:

  • Sie müssen als COM-In-Process-Serverobjekte registriert werden, die mithilfe von CoCreateInstance instanziiert werden können.
  • Die CLSIDs sind CLSID_CWMAudioLFXAPO und CLSID_CWMAudioGFXAPOfür die SFX- bzw. MFX-APOs. Die CLSIDs werden in wmcodecdsp.h deklariert und in wmcodecdspuuid.lib definiert.
  • Sie müssen die COM-Aggregation unterstützen. Es ist jedoch nicht davon auszugehen, dass die Aggregation in Szenarios mit benutzerdefinierten Audiosystemeffekten verwendet wird, sodass sie keine wesentlichen Probleme darstellen sollte.

Initialisierung

Ein benutzerdefinierter APO muss die Window-APO initialisieren, indem die IAudioSystemEffects::Initialize-Methode aufgerufen wird . Dies erfolgt in der Regel über die Initialize-Methode des benutzerdefinierten APO. Alle Argumente, die an die Initialize-Methode des benutzerdefinierten APO übergeben werden, sollten direkt an die Initialize-Methode der Windows-APO übergeben werden. Dadurch kann der APO seine Einstellungen aus dem Endpunkt- und Fx-Eigenschaftsspeicher in der APOInitSystemEffects-Struktur abrufen. Es ist möglich, dass der benutzerdefinierte APO die Einstellungen abruft und selektiv an den APO übergeben wird, aber das ist im Wesentlichen Strategie A.

Wenn der benutzerdefinierte APO ein Feature ersetzt, ist es in der Regel ratsam, das entsprechende Feature auf dem APO zu deaktivieren. Je nachdem, wie das Feature funktioniert, ist das Deaktivieren des Features möglicherweise nicht unbedingt erforderlich. Um ein Feature zu deaktivieren, fragen Sie den APO nach der IPropertyStore-Schnittstelle ab, und rufen Sie IPropertyStore::SetValue auf. Die vom APO-Eigenschaftenspeicher unterstützten Eigenschaften werden weiter unten in diesem Thema unter "Unterstützte IPropertyStore-Eigenschaften" beschrieben.

Beispiele für die Kommunikation mit dem APO-Eigenschaftenspeicher für benutzerdefinierte Windows-Audiosystemeffekte finden Sie in den Beispielen auf GitHub unter: https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO

Featurestatus von Abfrage-APO

Wenn ein benutzerdefiniertes APO lediglich ein Windows-Audioeffektfeature ersetzt und keine eigene Konfigurationsoberfläche oder einen eigenen Einstellungsspeicher aufweist, muss es möglicherweise ermitteln, welche Features auf dem entsprechenden APO aktiviert sind.

Es gibt mindestens zwei Möglichkeiten, diese Informationen abzurufen:

  • Option A: Durch direktes Abfragen des Fx-Eigenschaftenspeichers.

  • Option B: Indirekt durch Instanziieren des APO und Verwendung der IPropertyStore-Schnittstelle zum Abfragen des Eigenschaftenspeichers.

Option A

Diese Option hat den Vorteil, dass sie ohne Instanziierung eines APO erfolgen kann. Wenn ein benutzerdefinierter APO den Fx-Eigenschaftsspeicher überwachen möchte, ist Option A die einzige Möglichkeit, Benachrichtigungen zur Änderung von Eigenschaften on-the-fly zu erhalten. Ein Beispiel für Option A finden Sie im Beispiel "komprimieren".

Bei Option A fragt der benutzerdefinierte APO den Standard Endpunkteigenschaftenspeicher (nicht Fx) nach PKEY_AudioEngine_DeviceFormat ab. Anschließend wird die Kanalmaske aus diesem Format als PID für den Eigenschaftenschlüssel verwendet, der zum Abfragen des Fx-Eigenschaftenspeichers verwendet wird. Die GUID (fmtid) für den Eigenschaftenschlüssel, der zum Abfragen des Fx-Eigenschaftenspeichers verwendet wird, ist einer der XXX_XXX_KEY_GUID Werte von wmcodecdsp.h. Die KEY_GUID Namen entsprechen auf offensichtliche Weise den MFPKEY-Namen , die weiter oben in diesem Thema erläutert wurden.

Option B

Diese Option hat den Vorteil, dass sie die Möglichkeit richtig behandeln kann, dass die Windows-APO möglicherweise einige seiner Features standardmäßig aktiviert hat, wenn die entsprechende Eigenschaft im Fx-Eigenschaftenspeicher nicht vorhanden ist.

Bei Option B fragt der benutzerdefinierte APO einfach den APO nach seiner IPropertyStore-Schnittstelle ab und ruft IPropertyStore::GetValue auf, indem er einen der MFPKEY_XXX Schlüssel verwendet, die weiter oben in diesem Thema erläutert wurden.

Aushandlung formatieren

Geben Sie beim Implementieren einer benutzerdefinierten SFX-APO, die den SFX-APO umschließt, nicht in den Registrierungseigenschaften des benutzerdefinierten APO an APO_FLAG_FRAMESPERSECOND_MUST_MATCH . Diese Regel sollte beachtet werden, unabhängig davon, ob der benutzerdefinierte APO das Kanalformat ändern kann oder nicht. Wenn der benutzerdefinierte SFX APO dieses Flag angeben würde, würde dies verhindern, dass der entsprechende SFX Lautsprecherfüllung, Kopfhörervirtualisierung oder virtuelle Umgebung durchführt.

Eine benutzerdefinierte SFX APO-Implementierung muss IAudioProcessingObject::IsInputFormatSupported implementieren oder überschreiben. Es ist unwahrscheinlich, dass die Basisklasse IsInputFormatSupported den Satz möglicher Kanalkonvertierungen genau widerspiegelt, die vom benutzerdefinierten SFX APO und dem SFX APO implementiert wurden.

Die IsInputFormatSupported-Methode des benutzerdefinierten SFX APO sollte die entsprechende APO-Datei IsInputFormatSupported aufrufen. Dadurch wird sichergestellt, dass der SFX APO alle Kanalkonvertierungen verarbeitet, die nicht vom benutzerdefinierten SFX APO verarbeitet werden. Beachten Sie, dass der SFX APO möglicherweise aktualisiert wird, um weitere Konvertierungen in zukünftigen Windows-Releases zu unterstützen. Das Aufrufen der IsInputFormatSupported-Methode des APO ist eine Möglichkeit, sicherzustellen, dass der Satz von Kanalkonvertierungen, die vom benutzerdefinierten APO unterstützt werden, vollständig den Satz von Kanalkonvertierungen enthält, die vom SFX APO unterstützt werden.

Was der benutzerdefinierte APO mit dem Rückgabewert der IsInputFormatSupported-Methode von SFX APO tun soll, hängt davon ab, welche Kanalkonvertierungen (falls vorhanden) vom benutzerdefinierten SFX APO unterstützt werden.

Wenn der benutzerdefinierte SFX APO keine eigenen Kanalkonvertierungen unterstützt, kann die IsInputFormatSupported-Methode den Wert zurückgeben, der von der IsInputFormatSupported-Methode von SFX APO direkt an den Aufrufer zurückgegeben wurde. Ein Beispiel finden Sie in den Beispielen "Swap" und "Compress".

Wenn der benutzerdefinierte SFX APO seine eigenen Kanalkonvertierungen unterstützt, wird ein negativer Rückgabewert (einschließlich S_FALSE) der IsInputFormatSupported-Methode von SFX APO nicht unbedingt in einen negativen Rückgabewert für den Aufrufer übersetzt. Der benutzerdefinierte SFX APO kann beispielsweise Kanalkonvertierungen unterstützen, die vom entsprechenden APO nicht unterstützt werden. In diesem Fall muss der benutzerdefinierte SFX APO den Rückgabewert der IsInputFormatSupported-Methode von SFX APO mit einer eigenen Logik zum Bestimmen unterstützter Eingaben kombinieren. Beachten Sie, dass die optimale Bedeutung von "kombinieren" davon abhängt, welche Art der Kanalkonvertierung Vorrang haben sollte. Der beste Ansatz hängt vom exakten Design der benutzerdefinierten Implementierung ab.

Die IsOutputFormatSupported-Methode auf einem SFX APO ist uninteressant, da das Ausgabeformat eines SFX APO das Mixformat des Geräts ist. Dieses Format basiert auf externen Überlegungen und kann nicht von einem SFX APO oder seinem Eingabeformat beeinflusst werden. Aus diesem Grund versuchen die Beispiele nicht, die richtige Logik für IsOutputFormatSupported zu implementieren.

Die obigen Überlegungen gelten nicht für MFX-APOs, da der MFX APO keine Features implementiert, die eine Änderung des Kanalformats erfordern oder implizieren. Aus diesem Grund macht das MFX-Beispiel nichts Besonderes für IsInputFormatSupported oder IsOutputFormatSupported. Die Formatverhandlungslogik eines benutzerdefinierten MFX-APO wird nicht durch die Tatsache beeinflusst, dass sie das MFX-APO umschließt.

LockForProcess/UnlockForProcess

Die benutzerdefinierte APO-Methode IAudioProcessingObjectConfiguration::LockForProcess sollte die entsprechende Methode auf dem APO aufrufen. LockForProcess() ist ein guter Ort, um Entscheidungen über die Reihenfolge zu treffen, in der die verschiedenen Verarbeitungsstufen stattfinden sollen. Sie kann beispielsweise entscheiden, ob zuerst die benutzerdefinierte APO-Verarbeitung oder die Verarbeitung des APO angewendet werden soll. Alle drei Beispiele bieten Beispiele für eine solche Entscheidungslogik, und die Kommentare in den Beispielen bieten einen Hintergrund. Es ist jedoch nicht möglich, in diesem Dokument eine vollständig allgemeine Anleitung zu diesem Thema bereitzustellen, da dies Kenntnisse über die spezifischen Features des benutzerdefinierten APO und deren Interaktion mit den APOs-Features erfordern würde.

GetLatency

Die IAudioProcessingObject::GetLatency-Implementierung des benutzerdefinierten APO sollte GetLatency auf dem APO aufrufen, der umschlossen wird. Wenn bei der benutzerdefinierten APO-Verarbeitung Wartezeiten auftreten, sollte sie diese dem Ergebnis hinzufügen, das vom APO zurückgegeben wurde, bevor der Wert an den Aufrufer zurückgegeben wird.

APOProcess

Die IAudioProcessingObjectRT::APOProcess-Methode des benutzerdefinierten APO sollte die APOProcess-Methode des APO vor, nach oder sogar während der Verarbeitung aufrufen. Die Entscheidung, wann APOProcess aufgerufen werden soll, sollte in LockForProcess getroffen werden, damit alle erforderlichen Zwischenpuffer zugeordnet werden können. Die APOs unterstützen die direkte Verarbeitung, wenn ihre Eingabe- und Ausgabeformate identisch sind. In diesem Fall kann der benutzerdefinierte APO dieselbe APO_CONNECTION_PROPERTY übergeben, die sowohl die Ein- als auch die Ausgabeverbindungseigenschaft für die Windows-APO aufweist. Der benutzerdefinierte APO sollte jedoch nicht die Eingabeverbindungseigenschaft des benutzerdefinierten APO als Ausgabeverbindungseigenschaft für den APO verwenden. Im Allgemeinen sollten APOs ihren Eingabepuffer nicht ändern.

Behandeln von APO-Fehlern

Wenn ein APO einen Fehler an den entsprechenden benutzerdefinierten APO zurückgibt, sollte die benutzerdefinierte APO von diesem Punkt an so handeln, als ob kein APO vorhanden wäre. In den Beispielen werden alle APO-Fehler als äquivalent zu CoCreateInstance behandelt, die den APO nicht erstellt haben. Optional kann der benutzerdefinierte APO die Auswirkungen von Fehlern von der LockForProcess-Methode des APO auf die aktuelle Sitzung beschränken. Anders ausgedrückt: Der benutzerdefinierte APO verwendet den APO bei nachfolgenden Aufrufen seiner APOProcess-Methode nicht. Der benutzerdefinierte APO könnte jedoch erneut versuchen, den APO zu verwenden, wenn es später einen weiteren LockForProcess-Aufruf mit unterschiedlichen Formaten gibt.

Kompilierung und Verknüpfung

Um die APO CLSID- und Eigenschaftsschlüsseldefinitionen zu verwenden, schließen Sie wmcodecdsp.h ein, und verknüpfen Sie mit wmcodecdspuuid.lib. Weitere Informationen finden Sie unter wmcodecdsp.h header.

APO-Beispiele

Es gibt vier Beispielbeispiele für Audiosystemeffekte. Die APO-Beispiele sind auf GitHub unter verfügbar: https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO

Allgemeine Richtlinien für benutzerdefinierte Audiosystemeffekte

Im Folgenden finden Sie einige Richtlinien, die IHVs bei der Implementierung von APOs für benutzerdefinierte Audiosystemeffekte befolgen sollten.

  • Alle Audiosystemeffekte sollten Ein-/Aus-Optionen bieten. Benutzer sollten nicht gezwungen werden, einen Audiosystemeffekt zu verwenden.
  • Interaktionen zwischen Features im SFX- und MFX-APO sollten von den APOs und der zugehörigen Benutzeroberfläche vermittelt werden.
  • Features, die hier als SFX oder MFX angegeben sind, können in benutzerdefinierten Implementierungen zwischen SFX und MFX verschoben werden. Dies sollte jedoch mit dem Verständnis geschehen, dass die Ein-/Aus-Optionen vorhanden sein sollten und dass die Zugänglichkeit und Angemessenheit der Optionen nicht beeinträchtigt werden sollten.
  • Implementierer sollten sich daran erinnern, dass SFX unterschiedliche Eingabe- und Ausgabekanalmasken aufweisen kann. Der MFX APO muss über die gleichen Eingabe- und Ausgabekanalmasken verfügen.

Von Windows bereitgestellte APOs

Informationen zu den anderen von Windows bereitgestellten APOs finden Sie in diesen Themen.

Bass Boost

Bassverwaltung

Erweiterter Sound für Laptop-Computer

Loudness Equalization DSP

Niedrigfrequenzschutz

Raumkorrektur

Lautsprecherfüllung

Lautsprecher-Phantoming

Virtuelle Umgebung

Virtualisierter Surround Sound über Kopfhörer

Spezifische APO-Anpassungsinformationen

Lautheitsausgleich (SFX APO)

Der Lautheitsausgleich ist eine komprimierte (Dynamische) Verarbeitung, die von einer wahrnehmungsbasierten Lautheitsmetrik gesteuert wird. Raumkorrektur (MFX APO)

Bei der Raumkorrektur wird ein Profil verwendet, das vom Assistenten für die Raumkalibrierung generiert wurde. Dieses Profil wird als binäres Blob gespeichert. Das Format des Blobs wird derzeit nicht veröffentlicht.

Kanalkonvertierung (SFX APO)

Der Kanalkonvertierungs-APO übernimmt mehrere Aufgaben.

Kopfhörervirtualisierung

Dieser Effekt ist aktiviert, wenn das Kanalformat des wiedergegebenen Inhalts (N.x) 2.0 oder größer ist, wobei x 0 oder 1 sein kann. Die Ausgabemaske muss Stereo (0x3) sein. Die Eingabemaske ist auf einige wenige unterstützte Kombinationen beschränkt, die in der folgenden Tabelle aufgeführt sind.

Kopfhörervirtualisierungskanalmasken

Name Wert
MASK_STEREO MASK_FRONTLR 0x3
MASK_3_FRONT (SPEAKER_FRONT_CENTER | MASK_FRONTLR) 0x7
MASK_4_SQUARE (MASK_FRONTLR | MASK_BACKLR) 0x33
MASK_4_DIAMOND (MASK_FRONTLR | MASK_FBCENTERS) 0x107
MASK_5_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) 0x3F
MASK_5_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) 0x60F

Virtuelle Umgebung

Dieser Effekt wird auch als Link-/Rechts-Folddown (LTRT) oder links/rechts-Matrixcodierung bezeichnet. Es wird verwendet, wenn das Kanalformat des wiedergegebenen Inhalts (N.x) 2.0 oder größer ist, wobei x 0 oder 1 sein kann. LTRT-Folddown ist normalerweise 4,0 bis 2,0. Jedes andere Eingabeformat wird in der Regel behandelt, indem zuerst N.x auf 4.0 generisches Folddown angewendet wird. In unserer Implementierung ist der LTRT-Folddown jedoch nativ 5.1 bis 2.0. Alle anderen Eingaben werden verarbeitet, indem zuerst N.x auf 5.1 generic folddown angewendet wird.

Die Ausgabekanalmaske muss 0x3 (Stereo) sein, und die Anzahl der Eingabekanäle ( einschließlich des Subwoofers, falls vorhanden ) darf nicht mehr als acht sein.

Lautsprecherfüllung

Dieser Effekt wird verwendet, wenn die Anzahl der Eingabekanäle (N) kleiner als die Anzahl der Ausgabekanäle (M) ist. Der Effekt füllt N.x-Kanal zu M.x-Kanälen aus, wobei x entweder 0 oder 1 sein kann.

Die Kanalmasken in Tabelle 4 – den LFE-Kanal ignorieren – werden für die Sprecherfüllung unterstützt. Die Lautsprecherfüllung unterstützt eine beliebige Kombination von Ein- oder Ausgabe-Subwooferkanal, sodass die Zahlen auf der linken Seite nur Beispiele sind. Die tatsächlichen Konfigurationen verfügen möglicherweise über einen Subwoofer.

Lautsprecher füllen Kanalmasken

Name Wert
MASK_STEREO MASK_FRONTLR 0x3
MASK_3_FRONT (SPEAKER_FRONT_CENTER | MASK_FRONTLR) 0x7
MASK_4_SQUARE (MASK_FRONTLR | MASK_BACKLR) \ 0x33
MASK_4_DIAMOND (MASK_FRONTLR | MASK_FBCENTERS) 0x107
MASK_5_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) 0x3F
MASK_5_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) 0x60F
MASK_7_SIDE_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_SIDELR) 0x63F
MASK_7_FRONT_SIDE (MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) 0x6CF
MASK_7_FRONT_BACK (MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) 0xFF

Die Lautsprecherfüllung wird nicht unterstützt, wenn eine der folgenden Punkte zutrifft:

  • Die Eingabemaske entspricht der Ausgabemaske.
  • Der einzige Unterschied zwischen Eingabe und Ausgabe besteht darin, dass man links/rechts seitenseitig Kanäle hat; die andere hat rücklinke/rechte Kanäle.
  • Die Eingabe verfügt über mehr Standard Kanäle als die Ausgabe.
  • Die Ausgabemaske enthält die mittleren Lautsprecher links/rechts, die Eingabemaske jedoch nicht.
  • Der Satz von Kanälen in der Ausgabe, aber nicht in der Eingabe enthält mindestens einen der Kanäle: vordere Mitte, hinten links/rechts oder seite links/rechts.

Es gibt eine Ausnahme für das zweite Element in der Liste. Wenn der einzige Unterschied zwischen Eingabe und Ausgabe darin besteht, dass ein Kanal links/rechts seitlich und der andere über links/rechts zurück verfügt, wird die Lautsprecherfüllung unterstützt, wenn beide Formate Kanäle enthält, die in der Bitreihenfolge der Kanalmaske zwischen sideLR und backLR liegen würden. Es gibt drei solcher Kanäle:

  • SPEAKER_FRONT_LEFT_OF_CENTER
  • SPEAKER_FRONT_RIGHT_OF_CENTER
  • SPEAKER_BACK_CENTER

Wenn die Eingabe- oder Ausgabemaske einen dieser drei Kanäle enthält, kann die Lautsprecherfüllung unterstützt werden, obwohl sie nicht die zweite Bedingung in der Liste erfüllt, sondern nur, wenn die anderen Bedingungen erfüllt sind. Beispielsweise wird das Ausfüllen von Lautsprechern von MASK_7_FRONT_BACK zu oder von MASK_7_FRONT_SIDE aus diesem Grund vom Sprecherfüllen unterstützt.

Die folgende Tabelle enthält die vollständige Liste der Kanalwerte.

Name Wert
SPEAKER_FRONT_LEFT 0x1
SPEAKER_FRONT_RIGHT 0x2
SPEAKER_FRONT_CENTER 0x4
SPEAKER_LOW_FREQUENCY 0x8
SPEAKER_BACK_LEFT 0x10
SPEAKER_BACK_RIGHT 0x20
SPEAKER_FRONT_LEFT_OF_CENTER 0x40
SPEAKER_FRONT_RIGHT_OF_CENTER 0x80
SPEAKER_BACK_CENTER 0x100
SPEAKER_SIDE_LEFT 0x200
SPEAKER_SIDE_RIGHT 0x400

Verzögerungen werden für Kanäle in den Ausgabekonfigurationen verwendet, die sich "außerhalb" des Front-Back-Bereichs in der Eingabekonfiguration befinden. Wenn sich hingegen ein Lautsprecher in der Ausgabekonfiguration "zwischen" einigen Lautsprechern in der Eingabekonfiguration im Front-Back-Sinne befindet, wird die Ausgabe für diesen Lautsprecher generiert, indem einige der Eingabekanäle auf beiden Seiten des Ausgabekanals gemischt werden.

Run-Time Überlegungen bei der Wiederverwendung von Windows-APOs

Dieser Abschnitt enthält einige zusätzliche Informationen, die IHVs und OEMs bei der Implementierung ihrer benutzerdefinierten Audiosystemeffekte nützlich finden können.

Eine benutzerdefinierte APO-Implementierung:

  • Verwendet CoCreateInstance, um eine oder mehrere Instanzen der apOs für benutzerdefinierte Windows-Audiosystemeffekte zu instanziieren.
  • Konfiguriert jeden instance, um den gewünschten Satz von Features zu aktivieren.
  • Fügt jede instance an eine geeignete Stelle innerhalb der internen Pipeline des benutzerdefinierten APO ein.

Warum eine oder mehrere Instanzen?

Um unerwünschte Interaktionen zu vermeiden, erfordern die meisten Features eine bestimmte relative Reihenfolge. Da Windows-APOs mehrere Features in einem einzelnen APO implementieren, sind möglicherweise mehrere Instanzen dieses APO erforderlich, um eine korrekte Reihenfolge sicherzustellen. Angenommen, drei aktivierte Features – A, B und C – müssen ABC bestellt werden. Die benutzerdefinierte Implementierung verarbeitet B, delegiert aber A und C an den Windows-APO. A und C müssen sich dann in separaten Instanzen des Microsoft APO befinden, damit die benutzerdefinierte Implementierung von B zwischen ihnen erfolgen kann.

Windows implementiert die Raumkorrektur im MFX APO, was bedeutet, dass es sich um ein separates COM-Objekt vom SFX APO handelt. Eine benutzerdefinierte Implementierung könnte die Raumkorrektur an die Windows-Implementierung delegieren, sie aber in einem benutzerdefinierten SFX-APO platzieren. Die benutzerdefinierte SFX-Implementierung muss dann möglicherweise einige Verarbeitungen an die Windows SFX APO-Implementierung und andere Verarbeitung an die Windows MFX APO-Implementierung delegieren.

Umgang mit den Einschränkungen verschiedener Kombinationen von Eingabe-Ausgabeformaten

Viele Features – insbesondere die Bassverwaltung – funktionieren in bestimmten Fällen nicht. Beispielsweise ist die Verwaltung des Vorwärtsbass undefiniert, wenn die Konfigurationseigenschaft des Basslautsprechers "AllSmall" oder "AllLarge" lautet und das Ausgabeformat keinen Subwooferkanal enthält oder das NoSub-Flag festgelegt ist. Es ist nicht immer möglich, den Fehler während des IPropertyStore::SetValue-Aufrufs zu erkennen. Die -Methode versucht, das Feature zu aktivieren, aber die Eingabe- und Ausgabeformate sind zu diesem Zeitpunkt nicht bekannt, da LockForProcess nach allen Eigenschaftenbearbeitungen erfolgen muss. Dies bedeutet, dass es möglich ist, ein Feature zu aktivieren, zu sehen, dass es anscheinend erfolgreich ist, aber nicht die entsprechende Verarbeitung erfolgt.

Für den Umgang mit solchen Situationen stehen zwei Strategien zur Verfügung:

  • Untersuchen Sie sorgfältig die featurespezifischen Abschnitte dieses Dokuments, um genau vorhersagen zu können, wann ein bestimmtes Feature erfolgreich ist oder nicht.
  • Rufen Sie IPropertyStore::GetValue auf, nachdem LockForProcess aufgerufen wurde, um den Status wichtiger Eigenschaften zu überprüfen.

Wenn LockForProcess feststellt, dass ein bestimmtes Feature aufgrund der Eingabe- und Ausgabeformate oder des Werts einer anderen Eigenschaft nicht aktiviert werden kann, aktualisiert LockForProcess den Wert der entsprechenden Eigenschaft im Eigenschaftenspeicher.

Interaktion zwischen Lautsprecherfüllen und Bassverwaltung

Wenn die Lautsprecherfüllung eingeschaltet ist und ein Subwoofer angeschlossen ist, muss die Vorlauf bassverwaltung vor der Lautsprecherfüllung erfolgen, um eine Kammfilterung des Niederfrequenzsignals durch die Surroundverzögerung des Lautsprechers zu vermeiden.

Wenn die Lautsprecherfüllung aktiviert ist und kein Subwoofer angeschlossen ist, sind zwei Arten der Bassverwaltung nach vorne möglich:

  • Wenn die vorderen linken/rechten Lautsprecher groß sind, leitet die Bassverwaltung nach vorne den niederfrequenten Teil der Surround- und Mittelkanäle in die vorderen linken/rechten Lautsprecher um. Die Verwaltung des Vorwärtsbass muss nach dem Ausfüllen des Lautsprechers in diesem Fall kommen.
  • Wenn alle Lautsprecher klein sind, wird die Bassverwaltung nach vorn zum Tieffrequenzschutz für alle Standard Lautsprecher.

Dies kann entweder vor oder nach dem Ausfüllen des Lautsprechers auftreten. Aus Leistungsgründen ist es jedoch besser, vor dem Füllen des Lautsprechers ein Vorwärtsbassmanagement zu haben.

Der Windows APO implementiert bestimmte allgemeine Lautsprecherfüllkonfigurationen, z. B. 2.0 => 5.1, mit speziellem optimiertem Code, der die Verwaltung von Umgekehrten Bass im selben Schritt wie die Lautsprecherfüllung übernimmt.

Interaktion zwischen Folddown und Bass management

Kopfhörervirtualisierung unterstützt nur reverse Bassverwaltung:

  • Die Verwaltung des Vorwärtsbass ist bei der Kopfhörervirtualisierung nicht sinnvoll.
  • Aus Gründen der Einfachheit der Implementierung werden Der Niederfrequenzschutz und die Bassverstärkung nicht unterstützt.

Wenn eine der Kopfhörervirtualisierungs-, Virtual Surround-Codierungs- oder Lautsprecherfülleffekte aktiviert ist, wird die Verwaltung des reversen Basss während dieses Schritts behandelt. Die Verwaltung des reversen Basss wird weiterhin über die APOs-Eigenschaft reverse bass management gesteuert, als wäre sie ein separates Feature. In diesen Fällen steuert die Reverse Bassverwaltung einfach die Folddownkoeffizienten für den .1-Eingabekanal. Ein offenes Problem ist, dass die Verwaltung von Reverse Bass nicht deaktiviert werden kann, wenn LTRT aktiviert ist. In diesem Fall verwendet das Reverse Bass Management einen unkonventionellen Subwooferkanalgewinn.

Die Windows-Audiosystemeffekt-APOs wenden einige geringfügige Verarbeitungen an – Verstärkung und Verzögerung –, auch wenn keine Features aktiviert sind. Das Ziel einer solchen Verarbeitung besteht darin, sicherzustellen, dass sich die Verstärkungs- und Verzögerungsparameter nicht ändern, wenn ein Feature on the fly aktiviert wird. Der Grund dafür ist, dass verzögerung bei der Implementierung einiger Features inhärent ist, und ein Gain <1 von einigen Features angewendet wird, um in bestimmten Situationen eine übermäßig hohe Ausgabe zu vermeiden. Der Satz der verfügbaren Features hängt von den Eingabe- und Ausgabeformaten und bestimmten Eigenschaften ab, ebenso von der kumulativen Normalisierungszunahme und -verzögerung.

Wenn Features nicht aktiviert oder deaktiviert werden, kann der Normalisierungsgewinn deaktiviert werden, indem die MFPKEY_CORR_NORMALIZATION_GAIN Eigenschaft auf FALSE festgelegt wird, indem IPropertyStore::SetValue aufgerufen wird. Die Eigenschaft kann standardmäßig TRUE sein.

Es gibt keinen Mechanismus zum Deaktivieren der Normalisierungsverzögerung, da angenommen wird, dass sie weniger anstößig ist als normalisierungsgewinn. Wenn die Normalisierungsverzögerung anstößig ist, umgehen Sie einfach den betreffenden APO.

Weitere Informationen