Condividi tramite


Sink wave per Kernel-Mode sintetizzatori software

Come illustrato in Sintetizzatori e Sink wave, il driver di porta DMus implementa il sink di onda per un sintetizzatore software che opera in modalità kernel. Il driver miniport per il sintetizzatore espone un'interfaccia ISynthSinkDMus al driver della porta. Il sink dell'onda del driver di porta usa questa interfaccia per leggere i dati dell'onda prodotti dal sintetizzatore.

Per usare il sink dell'onda della porta DMus, un driver miniport DMus deve definire un filtro DirectMusic con due tipi di pin:

  • Pin di input DirectMusic o pin di input MIDI. Questo pin è un sink per un flusso di rendering contenente messaggi MIDI.

  • Un pin di output dell'onda. Questo pin è un'origine per un flusso di rendering contenente esempi PCM.

La figura seguente mostra un filtro DirectMusic contenente un nodo del sintetizzatore (KSNODETYPE_SYNTHESIZER). Questo filtro soddisfa i requisiti precedenti per un sintetizzatore software in modalità kernel fornendo un pin di input DirectMusic e un pin di output dell'onda. Inoltre, un driver miniport DMus che supporta la sintesi MIDI legacy può fornire un pin di input MIDI.

Diagramma che illustra un filtro DirectMusic per un sintetizzatore software in modalità kernel con pin di input DirectMusic e pin di output wave.

Sul lato sinistro della figura, un flusso MIDI entra nel filtro tramite il pin di input DirectMusic. Questo pin ha un'interfaccia IMXF che espone al driver della porta. Il driver di porta ottiene questa interfaccia chiamando il metodo IMiniportDMus::NewStream . Il driver della porta invia messaggi MIDI al pin chiamando il metodo IMXF::P utMessage .

Sul lato destro della figura, un flusso di onda esce dal filtro attraverso il pin di output dell'onda e passa al sink dell'onda del driver di porta. Il driver di porta comunica con il pin tramite la relativa interfaccia ISynthSinkDMus . Il driver di porta ottiene questa interfaccia chiamando prima IMiniportDMus::NewStream per ottenere un oggetto di flusso con un'interfaccia IMXF e quindi eseguendo query sull'oggetto per l'interfaccia ISynthSinkDMus . Il sink di onda esegue il pull dei dati dell'onda dal pin chiamando il metodo ISynthSinkDMus::Render .

Anche se un sintetizzatore hardware potrebbe, in linea di principio, basarsi sul sink dell'onda del driver di porta per il rendering, la chiamata a ISynthSinkDMus::Render aggiunge una latenza sufficiente al flusso MIDI per renderlo nonttrattivo per molte applicazioni interattive. Per ridurre la latenza del flusso, è probabile che i sintetizzatori hardware abbiano connessioni interne per la combinazione e il rendering dell'hardware a onda anziché l'uso del sink dell'onda del driver della porta. Questo tipo di sintetizzatore sostituisce il pin di output dell'onda sul lato destro della figura precedente con una connessione hardwired (rappresentata come pin bridge) a un mixer hardware.

L'interfaccia ISynthSinkDMus fornisce metodi per eseguire il rendering dei dati dell'onda tramite un sink di onda, convertire dal tempo di riferimento all'ora di esempio e indietro e sincronizzare l'orologio master:

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Rendering

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMus eredita dall'interfaccia IMXF . Per altre informazioni, vedere ISynthSinkDMus.

Il driver miniport DMus nella figura precedente identifica il pin di input DirectMusic e il pin di output wave come indicato di seguito:

  • Per identificare il pin di input DirectMusic, il driver miniport definisce l'intervallo di dati del pin per avere un formato principale di tipo KSDATAFORMAT_TYPE_MUSIC e un sottoformat di tipo KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Questa combinazione indica che il pin accetta un flusso MIDI con timestamp. Il descrittore dell'intervallo di dati è una struttura di tipo KSDATARANGE_MUSIC. Per un esempio, vedere Intervallo di dati di flusso DirectMusic. Il driver miniport definisce la direzione del flusso di dati del pin da KSPIN_DATAFLOW_IN. (KsPinDescriptor della struttura di PCPIN_DESCRIPTOR. Il membro DataFlow indica la direzione del flusso di dati. Quando si chiama IMiniportDMus::NewStream per creare l'oggetto di flusso per questo pin, il driver della porta imposta il parametro StreamType su DMUS_STREAM_MIDI_RENDER.

  • Per identificare il pin di output dell'onda, il driver miniport definisce l'intervallo di dati del pin per avere un formato principale di tipo KSDATAFORMAT_TYPE_AUDIO e un sottoformat di tipo KSDATAFORMAT_SUBTYPE_PCM. Questa combinazione indica che il pin genera un flusso audio a onda contenente esempi PCM. Il descrittore dell'intervallo di dati è una struttura di tipo KSDATARANGE_AUDIO. Vedere l'esempio nell'intervallo di dati di flusso PCM. Il driver miniport definisce la direzione del flusso di dati del pin da KSPIN_DATAFLOW_OUT. Quando si chiama IMiniportDMus::NewStream per creare l'oggetto di flusso per questo pin, il driver di porta imposta il parametro StreamType su DMUS_STREAM_WAVE_SINK.

Inoltre, se il driver doveva supportare un pin di input MIDI per il sintetizzatore, la sua definizione sarebbe simile a quella del pin di input DirectMusic, ma la definizione del pin specificava un sottoformat di tipo KSDATAFORMAT_SUBTYPE_MIDI e il pin accetterebbe un flusso MIDI non elaborato anziché un flusso MIDI con timestamp.