Modalità utente rispetto alla modalità kernel
Un synth personalizzato può essere scritto per l'esecuzione in modalità utente o in modalità kernel. In generale, i synth software sono più facili da implementare in modalità utente, ma spesso possono ottenere una latenza inferiore in modalità kernel. I componenti hardware possono essere supportati solo in modalità kernel. Esistono tuttavia motivi validi per iniziare lo sviluppo in modalità utente anche se l'implementazione finale consiste nell'eseguire in modalità kernel.
La creazione di sintetizzatori software (e sink wave) è molto più semplice in modalità utente. Le interfacce in modalità utente sono facili da usare e il debug è semplificato. Un altro vantaggio è che il componente risultante è un file eseguibile di Microsoft Windows. Poiché questo file eseguibile è un oggetto COM, l'installazione è semplicemente una questione di registrazione automatica dalla riga di comando con regsvr32.exe. L'applicazione di sistema RegSvr32 chiama la funzione DllRegisterServer della DLL. Per altre informazioni, vedere la documentazione di Microsoft Windows SDK.
Se è necessaria un'implementazione in modalità utente, è possibile distribuire il prodotto con un programma applicazione anziché un driver. L'utente evita un processo di installazione del driver complicato e non è necessario riavviare dopo l'installazione. Il componente in modalità utente può quindi essere enumerato come una delle porte disponibili, a seconda che si voglia che altre applicazioni possano usarla. Per altre informazioni, vedere Registrazione del sintetizzatore.
Il vantaggio di un'implementazione software in modalità kernel è minore latenza. Con l'avvento dei messaggi con timestamp, tuttavia, questo vantaggio non è così grande come usato per essere. Le API MIDI legacy non avevano un timestamp, quindi quando hai giocato una nota, che era esattamente quando era in coda per riprodurre. Il timestamp consente di riprodurre le note in coda in un momento specificato in futuro. L'uso del timestamp significa che la nota viene riprodotta al momento corretto, a meno che l'avviso anticipato non sia minore della latenza intrinseca nel sistema.
La latenza è solo un problema quando i suoni vengono accodati per riprodurre con poco o nessun avviso anticipato. Pertanto, le implementazioni in modalità kernel sono consigliate solo quando esiste una limitazione indesiderata a un'implementazione software in modalità utente o quando supporta l'accelerazione hardware.
Se si decide di eseguire un'implementazione in modalità kernel, l'approccio migliore è ancora quello di iniziare lo sviluppo in modalità utente. Il codice sorgente per il synth in modalità utente di Microsoft viene fornito in Microsoft Windows Driver Kit (WDK), quindi non è necessario scrivere un nuovo synth da zero. È possibile usare il codice esistente per comprendere il modo in cui vengono analizzato i download dei suoni scaricabili (DLS). È quindi possibile aggiungere qualsiasi nuova funzionalità, ad esempio l'analisi di blocchi aggiuntivi, e eseguire il debug di questa logica in modalità utente prima, stubando le routine che accedono all'hardware. Una routine sbbed-out può fare nulla o emulare la funzione hardware nel software. Per altre informazioni su DLS, vedere la documentazione di Windows SDK.
Quando si ha l'implementazione in modalità utente, è possibile spostarla in modalità kernel e renderla disponibile. Dopo aver eseguito la versione del software in modalità kernel, il passaggio successivo consiste nel iniziare a spostare le funzionalità nell'hardware. I synth software in modalità utente e in modalità kernel fungono da passaggi intermedi utili nel processo di recupero e esecuzione dell'hardware.
Per riepilogare le raccomandazioni riportate sopra:
Per i componenti solo software, implementare i componenti prima in modalità utente (per risolvere i problemi di progettazione con interfacce semplici, debug, installazione e rimozione) e quindi convertirli in modalità kernel, se necessario a causa della latenza o di altre considerazioni.
Per i componenti hardware, implementare prima una versione software in modalità utente (per risolvere i problemi di progettazione con interfacce semplici, debug, installazione e rimozione), quindi convertirla in una versione software in modalità kernel. Infine, connettere il componente in modalità kernel all'hardware, una funzionalità alla volta, fino a quando tutto funziona come desiderato.