Compartir a través de


IDirectMusicSynth e IDirectMusicSynthSink

Como se describe en Sintetizadores y receptores de onda, puedes implementar un sintetizador de software personalizado o receptor de ondas que se ejecuta en modo de usuario y se comunica con DirectMusic. El objeto sintetizador debe tener una interfaz IDirectMusicSynth. El objeto receptor de onda debe tener una interfaz IDirectMusicSynthSink.

DirectMusic se comunica con un sintetizador de software a través de su interfaz IDirectMusicSynth . DirectMusic admite esta interfaz en DirectX 6.1 y versiones posteriores. IDirectMusicSynth admite los métodos que se muestran en la tabla siguiente, que organiza los métodos en grupos funcionales.

Grupo Nombres de método
Activación IDirectMusicSynth::Activate
Canales IDirectMusicSynth::GetChannelPriority, IDirectMusicSynth::SetChannelPriority
Instrumentos IDirectMusicSynth::D ownload, IDirectMusicSynth::Unload
Information IDirectMusicSynth::GetAppend, IDirectMusicSynth::GetFormat, IDirectMusicSynth::GetLatencyClock, IDirectMusicSynth::GetPortCaps , IDirectMusicSynth::GetRunningStats
Reproducción IDirectMusicSynth::P layBuffer, IDirectMusicSynth::Render
Puertos IDirectMusicSynth::Open, IDirectMusicSynth::Close, IDirectMusicSynth::SetNumChannelGroups
Varios parámetros IDirectMusicSynth::SetMasterClock, IDirectMusicSynth::SetSynthSink

La mayoría de las aplicaciones no necesitan llamar directamente a los métodos de la interfaz IDirectMusicSynth ; El puerto directMusic normalmente administra el sintetizador. Sin embargo, la aplicación puede interactuar directamente con el sintetizador durante el desarrollo y las pruebas.

El sintetizador no está completo sin una conexión a un receptor de onda, que se representa como un objeto con una interfaz IDirectMusicSynthSink . El receptor de ondas conecta la secuencia de salida de audio del sintetizador a un módulo de representación de audio, como DirectSound, DirectShow o la API waveOut multimedia de Windows.

De forma predeterminada, DirectMusic usa su implementación interna de IDirectMusicSynthSink para controlar los datos de onda que genera el sintetizador de software. Este receptor de ondas alimenta los datos a DirectSound.

Para poder activar el sintetizador, primero debe crearse un receptor de onda y conectarse al sintetizador a través de una llamada a IDirectMusicSynth::SetSynthSink. Esta debe ser la primera llamada después de crear el sintetizador porque muchas de las llamadas relacionadas con el tiempo, incluidas IDirectMusicSynth::GetLatencyClock e IDirectMusicSynth::SetMasterClock, se pasan realmente a llamadas equivalentes en IDirectMusicSynthSink.

Solo DirectX 6.1 y DirectX 7 admiten la implementación de un receptor de ondas en modo de usuario personalizado con una interfaz IDirectMusicSynthSink . IDirectMusicSynthSink admite los métodos que se muestran en la tabla siguiente, que organiza los métodos en grupos funcionales.

Grupo Nombres de método
Inicialización IDirectMusicSynthSink::Activate, IDirectMusicSynthSink::GetDesiredBufferSize
IDirectMusicSynthSink::Init, IDirectMusicSynthSink::SetDirectSound
Control de tiempo IDirectMusicSynthSink::GetLatencyClock, IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime, IDirectMusicSynthSink::SetMasterClock

En DirectX 8 y versiones posteriores, DirectMusic siempre usa su receptor de ondas interno con un sintetizador en modo de usuario. Estas versiones posteriores de DirectMusic no admiten implementaciones personalizadas de IDirectMusicSynthSink.

Sin embargo, en DirectX 6.1 y DirectX 7, puedes implementar tu propio objeto IDirectMusicSynthSink y usarlo para administrar la secuencia de salida de audio del sintetizador de cualquier manera que quieras. Por ejemplo, puede alimentar los datos de onda en DirectShow o waveOut API. Si crea un objeto wave stream, debe tener una interfaz IDirectMusicSynthSink para conectar al objeto IDirectMusicSynth .

Además de administrar el flujo de onda, el receptor de onda es responsable de controlar el tiempo del sintetizador. El receptor de onda recibe el reloj maestro mediante una llamada a IDirectMusicSynth::SetMasterClock, que pasa el origen de la hora maestra en con una llamada idéntica a IDirectMusicSynthSink::SetMasterClock. Dado que el reloj maestro no se genera a partir del mismo cristal que el flujo de onda, el receptor de onda debe mantenerlos sincronizados compensando el desfase del reloj.

Además, para que el sintetizador pueda realizar un seguimiento adecuado del tiempo, proporciona dos llamadas para convertir de hora maestra a hora de muestra y de vuelta:

  • IDirectMusicSynthSink::RefTimeToSample

  • IDirectMusicSynthSink::SampleToRefTime

El receptor de onda genera el reloj de latencia porque administra realmente las horas en las que las muestras se escriben mediante llamadas a IDirectMusicSynth::Render. Cuando DirectMusic llama a IDirectMusicSynth::GetLatencyClock en el puerto de DirectMusic, simplemente gira y llama a IDirectMusicSynthSink::GetLatencyClock.

Cuando se abre por primera vez un sintetizador de software, DirectMusic proporciona al sintetizador una estructura DMUS_PORTPARAMS (descrita en la documentación de Microsoft Windows SDK) que especifica la frecuencia de muestreo y el número de canales para la secuencia de salida de audio. A continuación, el sintetizador los convierte en una estructura WAVEFORMATEX estándar que pasa al receptor de onda cuando el receptor de onda llama al método IDirectMusicSynth::GetFormat .

Para obtener más información, consulta las descripciones de las interfaces IDirectMusic e IDirectMusicPort en la documentación de Windows SDK.