Compartir a través de


Receptor de onda para sintetizadores de software de Kernel-Mode

Como se explica en Sintetizadores y receptores de onda, el controlador de puerto DMus implementa el receptor de onda para un sintetizador de software que funciona en modo kernel. El controlador miniport para el sintetizador expone una interfaz ISynthSinkDMus al controlador de puerto. El receptor de onda del controlador de puerto usa esta interfaz para leer los datos de onda que genera el sintetizador.

Para usar el receptor de onda del controlador de puerto DMus, un controlador de miniporte DMus debe definir un filtro DirectMusic con dos tipos de patillas:

  • Un pin de entrada de DirectMusic o un pin de entrada MIDI. Este pin es un receptor para una secuencia de representación que contiene mensajes MIDI.

  • Una patilla de salida de onda. Este pin es un origen de una secuencia de representación que contiene ejemplos de PCM.

En la ilustración siguiente se muestra un filtro directMusic que contiene un nodo de sintetizador (KSNODETYPE_SYNTHESIZER). Este filtro cumple los requisitos anteriores para un sintetizador de software en modo kernel proporcionando un pin de entrada de DirectMusic y un pin de salida de onda. (Además, un controlador DMus miniport que admite síntesis MIDI heredada puede proporcionar un pin de entrada MIDI).

Diagrama que ilustra un filtro de DirectMusic para un sintetizador de software en modo kernel con pin de entrada de DirectMusic y un pin de salida de onda.

En el lado izquierdo de la figura, una secuencia MIDI entra en el filtro a través del pin de entrada de DirectMusic. Este pin tiene una interfaz IMXF que expone al controlador de puerto. El controlador de puerto obtiene esta interfaz llamando al método IMiniportDMus::NewStream . El controlador de puerto alimenta los mensajes MIDI al pin llamando al método IMXF::P utMessage .

En el lado derecho de la figura, una secuencia de onda sale del filtro a través del pin de salida de onda y fluye al receptor de onda del controlador del puerto. El controlador de puerto se comunica con el pin a través de su interfaz ISynthSinkDMus . El controlador de puerto obtiene esta interfaz llamando primero a IMiniportDMus::NewStream para obtener un objeto de secuencia con una interfaz IMXF y, a continuación, consultando el objeto para su interfaz ISynthSinkDMus . El receptor de onda extrae los datos de onda del pin mediante una llamada al método ISynthSinkDMus::Render .

Aunque un sintetizador de hardware podría, en principio, confiar en el receptor de onda del controlador de puerto para la representación, la llamada a ISynthSinkDMus::Render agrega suficiente latencia a la secuencia MIDI para que no sea atractiva para muchas aplicaciones interactivas. Para reducir la latencia del flujo, es probable que los sintetizadores de hardware tengan conexiones internas para mezclar y representar el hardware de representación de onda en lugar de usar el receptor de onda del controlador de puerto. Este tipo de sintetizador reemplaza el pin de salida de onda en el lado derecho de la ilustración anterior por una conexión cableada (representada como un pin de puente) a un mezclador de hardware.

La interfaz ISynthSinkDMus proporciona métodos para representar datos de onda a través de un receptor de onda, convertir de tiempo de referencia a tiempo de muestra y atrás, y sincronizar con el reloj maestro:

ISynthSinkDMus::RefTimeToSample

ISynthSinkDMus::Render

ISynthSinkDMus::SampleToRefTime

ISynthSinkDMus::SyncToMaster

ISynthSinkDMus hereda de la interfaz IMXF . Para obtener más información, consulte ISynthSinkDMus.

El controlador de miniporte DMus de la ilustración anterior identifica su pin de entrada de DirectMusic y su pin de salida de onda de la siguiente manera:

  • Para identificar su pin de entrada de DirectMusic, el controlador de minipuerto define el intervalo de datos del pin para tener un formato principal de tipo KSDATAFORMAT_TYPE_MUSIC y un subformato de tipo KSDATAFORMAT_SUBTYPE_DIRECTMUSIC. Esta combinación indica que el pin acepta una secuencia MIDI con marca de tiempo. El descriptor de intervalo de datos es una estructura de tipo KSDATARANGE_MUSIC. (Para obtener un ejemplo, vea DirectMusic Stream Data Range). El controlador de minipuerto define la dirección del flujo de datos del pin que se va a KSPIN_DATAFLOW_IN. (KsPinDescriptor de la estructura PCPIN_DESCRIPTOR. El miembro DataFlow indica la dirección del flujo de datos). Al llamar a IMiniportDMus::NewStream para crear el objeto de secuencia para este pin, el controlador de puerto establece el parámetro StreamType en DMUS_STREAM_MIDI_RENDER.

  • Para identificar su pin de salida de onda, el controlador de minipuerto define el intervalo de datos del pin para tener un formato principal de tipo KSDATAFORMAT_TYPE_AUDIO y un subformato de tipo KSDATAFORMAT_SUBTYPE_PCM. Esta combinación indica que el pin emite una secuencia de audio de onda que contiene muestras de PCM. El descriptor de intervalo de datos es una estructura de tipo KSDATARANGE_AUDIO. (Vea el ejemplo en intervalo de datos de flujo de PCM). El controlador de minipuerto define la dirección del flujo de datos del pin que se va a KSPIN_DATAFLOW_OUT. Al llamar a IMiniportDMus::NewStream para crear el objeto de secuencia para este pin, el controlador de puerto establece el parámetro StreamType en DMUS_STREAM_WAVE_SINK.

Además, si el controlador fuera a admitir un pin de entrada MIDI para el sintetizador, su definición sería similar a la del pin de entrada directMusic, pero la definición del pin especificaría un subformato de tipo KSDATAFORMAT_SUBTYPE_MIDI, y el pin aceptaría una secuencia MIDI sin formato en lugar de una secuencia MIDI con marca de tiempo.