Пользовательский режим и режим ядра
Пользовательский синтезатор можно записать для выполнения в пользовательском режиме или режиме ядра. Как правило, программные синтезаторы проще реализовать в пользовательском режиме, но часто они могут достичь меньшей задержки в режиме ядра. Аппаратные компоненты могут поддерживаться только в режиме ядра. Однако существуют веские причины для начала разработки в пользовательском режиме, даже если окончательная реализация должна выполняться в режиме ядра.
Создание программных синтезаторов (и приемников волн) гораздо проще в пользовательском режиме. Интерфейсы пользовательского режима просты в использовании, а отладка упрощена. Еще одним преимуществом является то, что результирующий компонент является исполняемым файлом Microsoft Windows. Так как этот исполняемый файл является COM-объектом, его установка заключается в самостоятельной регистрации из командной строки с помощью regsvr32.exe. (Системное приложение RegSvr32 вызывает функцию DLL DllRegisterServer. Дополнительные сведения см. в документации по Microsoft Windows SDK.)
Если вам нужно реализовать пользовательский режим, вы можете доставить продукт с помощью программы приложения, а не драйвера. Пользователь избегает сложного процесса установки драйвера, и после установки перезагрузка не требуется. Затем компонент пользовательского режима можно перечислить как один из доступных портов в зависимости от того, должны ли другие приложения использовать его. Дополнительные сведения см. в разделе Регистрация синтезатора.
Преимуществом реализации программного обеспечения в режиме ядра является меньшая задержка. Однако с появлением сообщений, помеченных временем, это преимущество не так велико, как раньше. Устаревшие API MIDI не имели метки времени, поэтому, когда вы воспроизводили заметку, именно тогда она была поставлена в очередь. Метка времени позволяет ставить заметки в очередь для воспроизведения в указанное время в будущем. Использование метки времени означает, что заметка воспроизводится в нужное время, если предварительное предупреждение не меньше задержки, присущей системе.
Задержка возникает только в том случае, если звуки помещаются в очередь для воспроизведения с небольшим предварительным предупреждением или без него. Таким образом, реализации в режиме ядра рекомендуется использовать только при наличии нежелательного ограничения для реализации программного обеспечения в пользовательском режиме или при поддержке аппаратного ускорения.
Если вы решили выполнить реализацию в режиме ядра, лучше всего начать разработку в пользовательском режиме. Исходный код для синтезатора в пользовательском режиме корпорации Майкрософт предоставляется в комплекте драйверов Microsoft Windows (WDK), поэтому вам не нужно писать новый синтезатор с нуля. Вы можете использовать существующий код, чтобы понять, как анализируются скачиваемые звуки (DLS). Затем можно добавить любые новые функции (например, анализ дополнительных блоков) и сначала выполнить отладку этой логики в пользовательском режиме, заглусив подпрограммы, которые обращаются к оборудованию. (Подпрограмма с заглублением может либо ничего не делать, либо эмулировать аппаратную функцию в программном обеспечении.) Дополнительные сведения о DLS см. в документации по Windows SDK.
Если ваша реализация работает в пользовательском режиме, ее можно перевести в режим ядра и заставить ее работать там. После того как версия программного обеспечения будет работать в режиме ядра, необходимо приступить к перемещению функциональных возможностей на оборудование. Программные синтезаторы в пользовательском режиме и режиме ядра служат полезными промежуточными шагами в процессе запуска и запуска аппаратного синтезатора.
Ниже приведены общие сведения о рекомендациях, приведенных выше.
Для компонентов, доступных только для программного обеспечения, сначала реализуйте компоненты в пользовательском режиме (для решения проблем проектирования с помощью простых интерфейсов, отладки, установки и удаления), а затем при необходимости преобразуйте их в режим ядра из-за задержки или других соображений.
Для аппаратных компонентов сначала реализуйте версию программного обеспечения в пользовательском режиме (чтобы решить проблемы проектирования с простыми интерфейсами, отладкой, установкой и удалением), а затем преобразуйте ее в версию программного обеспечения в режиме ядра. Наконец, подключите компонент режима ядра к оборудованию, по одной функции за раз, пока все не будет работать должным образом.