Benutzermodus im Vergleich zu Kernelmodus
Ein benutzerdefinierter Synth kann für die Ausführung im Benutzer- oder Kernelmodus geschrieben werden. Im Allgemeinen sind Softwaresynths einfacher im Benutzermodus zu implementieren, können aber häufig eine geringere Latenz im Kernelmodus erzielen. Hardwarekomponenten können nur im Kernelmodus unterstützt werden. Es gibt jedoch gute Gründe für den Beginn der Entwicklung im Benutzermodus, auch wenn die endgültige Implementierung im Kernelmodus ausgeführt werden soll.
Das Erstellen von Softwaresynthesizern (und Wellensenken) ist im Benutzermodus viel einfacher. Die Benutzermodusschnittstellen sind einfach zu verwenden, und das Debuggen wird vereinfacht. Ein weiterer Vorteil ist, dass die resultierende Komponente eine ausführbare Microsoft Windows-Datei ist. Da es sich bei dieser ausführbaren Datei um ein COM-Objekt handelt, ist die Installation einfach eine Frage der Selbstregistrierung über die Befehlszeile mit regsvr32.exe. (Die RegSvr32-Systemanwendung ruft die DllRegisterServer-Funktion Ihrer DLL auf. Weitere Informationen finden Sie in der Microsoft Windows SDK-Dokumentation.)
Wenn Sie nur eine Implementierung im Benutzermodus benötigen, können Sie Ihr Produkt mit einem Anwendungsprogramm anstelle eines Treibers bereitstellen. Der Benutzer vermeidet einen komplizierten Treiberinstallationsprozess, und nach der Installation ist kein Neustart erforderlich. Ihre Benutzermoduskomponente kann dann als einer der verfügbaren Ports aufgelistet werden, je nachdem, ob sie von anderen Anwendungen verwendet werden soll. Weitere Informationen finden Sie unter Registrieren Ihres Synthesizers.
Der Vorteil einer Kernelmodus-Softwareimplementierung ist eine geringere Latenz. Mit dem Aufkommen von zeitstempelten Nachrichten ist dieser Vorteil jedoch nicht mehr so groß wie früher. Legacy-MIDI-APIs hatten keine Zeitstempelung. Wenn Sie also eine Notiz abgespielt haben, war dies genau der Zeitpunkt, an dem sie für die Wiedergabe in die Warteschlange eingereiht wurde. Der Zeitstempel ermöglicht es, Notizen in eine Warteschlange zu bestimmten Zeitpunkten in der Zukunft abzuspielen. Die Verwendung des Zeitstempels bedeutet, dass die Notiz zur richtigen Zeit wiedergegeben wird, es sei denn, die Vorabwarnung ist kleiner als die im System inhärente Latenz.
Latenz ist nur ein Problem, wenn Sounds in die Warteschlange gestellt werden, um mit wenig oder ohne Vorheriger Warnung wiedergegeben zu werden. Daher werden Kernelmodusimplementierungen nur dann empfohlen, wenn eine unerwünschte Einschränkung für eine Softwareimplementierung im Benutzermodus besteht oder die Hardwarebeschleunigung unterstützt wird.
Wenn Sie sich für eine Kernelmodusimplementierung entscheiden, besteht der beste Ansatz immer noch darin, mit der Entwicklung im Benutzermodus zu beginnen. Der Quellcode für den Benutzermodussynth von Microsoft wird im Microsoft Windows Driver Kit (WDK) bereitgestellt, sodass Sie keinen neuen Synth von Grund auf neu schreiben müssen. Sie können den vorhandenen Code verwenden, um zu verstehen, wie dlS-Downloads (Downloadable Sounds) analysiert werden. Anschließend können Sie alle neuen Funktionen hinzufügen (z. B. das Analysieren zusätzlicher Blöcke) und diese Logik zuerst im Benutzermodus debuggen, indem Sie die Routinen, die auf die Hardware zugreifen, durchführen. (Eine ausgestumpfte Routine kann entweder nichts tun oder die Hardwarefunktion in der Software emulieren.) Weitere Informationen zu DLS finden Sie in der Dokumentation zum Windows SDK.
Wenn Ihre Implementierung im Benutzermodus funktioniert, können Sie sie in den Kernelmodus verschieben und dort funktionieren lassen. Nachdem die Softwareversion im Kernelmodus funktioniert, besteht ihr nächster Schritt darin, die Funktionalität auf Ihre Hardware zu verschieben. Die Benutzermodus- und Kernelmodus-Softwaresynths dienen als nützliche Zwischenschritte bei der Einrichtung Ihres Hardwaresynths.
So fassen Sie die obigen Empfehlungen zusammen:
Für reine Softwarekomponenten implementieren Sie die Komponenten zuerst im Benutzermodus (um die Entwurfsprobleme mit einfachen Schnittstellen zu beheben, debuggen, installieren und entfernen) und konvertieren Sie dann aufgrund von Latenz oder anderen Überlegungen bei Bedarf in den Kernelmodus.
Implementieren Sie für Hardwarekomponenten zunächst eine Softwareversion im Benutzermodus (um die Entwurfsprobleme mit einfachen Schnittstellen zu beheben, debuggen, installieren und entfernen), und konvertieren Sie sie dann in eine Kernelmodus-Softwareversion. Verbinden Sie schließlich die Kernelmoduskomponente mit Hardware, jeweils ein Feature nach dem anderen, bis alles wie gewünscht funktioniert.