Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Niestandardowy syntezator można napisać, aby działał w trybie użytkownika lub w trybie jądra. Ogólnie rzecz biorąc, syntezatory oprogramowania są łatwiejsze do zaimplementowania w trybie użytkownika, ale często uzyskują mniejsze opóźnienie w trybie jądra. Składniki sprzętowe mogą być obsługiwane tylko w trybie jądra. Istnieją jednak dobre przyczyny rozpoczęcia programowania w trybie użytkownika, nawet jeśli ostateczna implementacja ma być uruchamiana w trybie jądra.
Kompilowanie syntezatorów oprogramowania (i ujścia fal) jest znacznie prostsze w trybie użytkownika. Interfejsy trybu użytkownika są łatwe w użyciu, a debugowanie jest uproszczone. Kolejną korzyścią jest to, że wynikowy składnik jest plikiem wykonywalnym systemu Microsoft Windows. Ponieważ ten plik wykonywalny jest obiektem COM, instalowanie go jest po prostu kwestią samodzielnego rejestrowania z wiersza polecenia za pomocą regsvr32.exe. (Aplikacja systemowa RegSvr32 wywołuje funkcję DllRegisterServer biblioteki DLL. Aby uzyskać więcej informacji, zobacz dokumentację zestawu Microsoft Windows SDK).
Jeśli implementacja w trybie użytkownika jest wszystkim, czego potrzebujesz, możesz dostarczyć produkt za pomocą programu aplikacyjnego zamiast sterownika. Użytkownik unika skomplikowanego procesu instalacji sterowników i nie jest wymagany ponowny rozruch po zainstalowaniu. Składnik trybu użytkownika może być następnie wyliczany jako jeden z dostępnych portów, w zależności od tego, czy inne aplikacje mają być w stanie z niego korzystać. Aby uzyskać więcej informacji, zobacz Rejestrowanie syntetyzatora.
Zaletą implementacji oprogramowania w trybie jądra jest mniejsze opóźnienie. Jednak wraz z pojawieniem się wiadomości z sygnaturą czasową, ta zaleta nie jest tak wielka, jak kiedyś. Stare interfejsy API MIDI nie miały sygnatur czasowych, więc kiedy grałeś nutę, była ona dokładnie wtedy ustawiana w kolejce do zagrania. Znacznik czasu umożliwia kolejkowanie notatek do odtwarzania w określonych momentach w przyszłości. Użycie znacznika czasowego oznacza, że dźwięk jest odtwarzany w odpowiednim czasie, chyba że ostrzeżenie z wyprzedzeniem jest mniejsze niż opóźnienie inherentne w systemie.
Opóźnienie jest problemem tylko wtedy, gdy dźwięki są ustawione do odtwarzania z krótkim lub żadnym wcześniejszym ostrzeżeniem. W związku z tym implementacje trybu jądra są zalecane tylko wtedy, gdy istnieje niepożądane ograniczenie implementacji oprogramowania w trybie użytkownika lub podczas obsługi przyspieszania sprzętowego.
Jeśli zdecydujesz się wykonać implementację w trybie jądra, najlepszym rozwiązaniem jest nadal rozpoczęcie programowania w trybie użytkownika. Kod źródłowy syntezatora w trybie użytkownika firmy Microsoft jest udostępniany w zestawie Microsoft Windows Driver Kit (WDK), więc nie trzeba pisać nowego syntezatora od podstaw. Możesz użyć istniejącego kodu, aby zrozumieć, jak pobieralne dźwięki (DLS) są parsowane. Następnie można dodać każdą nową funkcję (taką jak analizowanie dodatkowych fragmentów) i najpierw debugować tę logikę w trybie użytkownika, zastępując procedury, które uzyskują dostęp do sprzętu. (Rutyna stubbed-out może nie robić nic lub emulować funkcję sprzętową w oprogramowaniu). Aby uzyskać więcej informacji na temat biblioteki DLS, zobacz dokumentację zestawu Windows SDK.
Jeśli implementacja działa w trybie użytkownika, możesz przenieść ją w dół do trybu jądra i sprawić, że działa. Po uruchomieniu wersji oprogramowania w trybie jądra następnym krokiem jest rozpoczęcie przenoszenia funkcji do sprzętu. Syntezatory oprogramowania w trybie użytkownika i trybie jądra pełnią rolę przydatnych kroków pośrednich w procesie uruchamiania syntezatora sprzętowego.
Aby podsumować powyższe zalecenia:
W przypadku składników tylko do oprogramowania zaimplementuj składniki najpierw w trybie użytkownika (aby rozwiązać problemy projektowe z łatwymi interfejsami, debugowaniem, instalacją i usuwaniem), a następnie przekonwertuj je na tryb jądra, jeśli jest to konieczne z powodu opóźnienia lub innych zagadnień.
W przypadku składników sprzętowych najpierw zaimplementuj wersję oprogramowania w trybie użytkownika (aby rozwiązać problemy projektowe z łatwymi interfejsami, debugowaniem, instalacją i usuwaniem), a następnie przekonwertuj ją na wersję oprogramowania w trybie jądra. Na koniec połącz składnik trybu jądra ze sprzętem, jedną funkcję na raz, aż wszystko zacznie działać zgodnie z oczekiwaniami.