2010-07-01 21 views
5

Necesito algunos consejos sobre programación de Windows, MIDI y WDM. Intento escribir una pequeña aplicación que se colocará en la bandeja del sistema y se anunciará en el sistema como un dispositivo MIDI In/Out para que los programas MIDI puedan enviarlo y los convierta en un formato diferente. He estado leyendo el libro WDM de Cant y buscando información sobre cómo escribir controladores de dispositivos, pero no sé si estoy yendo por el camino correcto. no veo todavía cómo: -?Simulando un dispositivo MIDI - Windows

a) registrar mi conductor como MIDI capaz (no me pego un árbitro en el registery y dejar que el sistema operativo directa MIDI llama a la función en un DLL)

b) dirigir datos MIDI a través de mi controlador a mi aplicación, que probablemente será demasiado grande para ser un controlador.

Cualquier consejo sobre por dónde empezar sería muy apreciado. gracias, Pete

Respuesta

1

Los dispositivos están enumerados (o simulados) por los controladores del dispositivo, no por las aplicaciones. Lo que ves en la bandeja del sistema es un icono de la aplicación. Por lo tanto, necesitará tener un controlador y una aplicación: no puede tener un código compilado que actúe como ambos.

En el lado del conductor, es posible que desee echar un vistazo a the MSDN docs. Esto responderá la parte (a) de la pregunta yopur.

Suponiendo que todavía desea continuar, (b) es mejor donar al permitir que su aplicación extraiga los datos del controlador. Eso es mucho más fácil que al revés: una aplicación puede encontrar un controlador trivialmente, pero un controlador tiene grandes problemas para encontrar una aplicación específica (proceso)

+0

Gracias por la respuesta. He estado leyendo más sobre el libro de pilotos y ejecutando las muestras esta tarde y estoy empezando a ver un camino a través de esto. ¿Una cosa? Hacer que mi aplicación realice continuamente una lectura para extraer información del controlador del dispositivo parece ineficaz. ¿No hay una manera fácil de registrar mi aplicación con el controlador para que se le pueda dar un empujón a través de algún tipo de IPC para activar y extraer los datos? Las cosas se vuelven más claras ... lentamente. cheers, Pete – user380998

+0

Simplemente use un búfer cíclico en su controlador. MIDI es bastante en tiempo real; si no hay una aplicación que lo consuma, el controlador puede sobrescribir con seguridad los datos anteriores. – MSalters

0

Si está buscando una manera más fácil de comenzar, hay una Controlador de bucle de retorno MIDI por ahí, y las personas que lo hacen también ofrecen (o solían ofrecer) una versión que permite que su programa se comunique directamente con el controlador. Esto le proporciona el comportamiento que está buscando, donde un programa aparece como un dispositivo MIDI. El controlador de bucle invertido está en http://nerds.de/en/loopbe1.html. Ya no veo la página del desarrollador, pero si se comunica con ellos, es posible que pueda comprar una licencia para un controlador al que puede acceder directamente sin el bucle invertido.

+0

Desafortunadamente, estos están gravados con licencia y no se pueden utilizar para aprender o incluso ampliar para sus propias implementaciones. –

+0

@ Mike'Pomax'Kamermans Por supuesto ... ese es el costo de que alguien más haga el trabajo. En cualquier caso, envíe un correo electrónico a Tobias Erichsen. https://www.tobias-erichsen.de/software/loopmidi.html Su controlador tiene una buena API para configurar puertos con el nombre que desee, en varias configuraciones. – Brad

+0

Sé que ya lo hizo, pero dado que su controlador es el único, como desarrollador de código abierto que es "ideal para mi propio trabajo de audio, pero no lo suficientemente bueno para la programación de código abierto que necesito hacer" =) –

6

Los controladores de Windows MIDI no necesitan ser implementados en el kernel, pueden implementarse completamente en el espacio de usuario como archivos DLL.

MSDN tiene alguna información sobre las funciones que necesita implementar - Audio Device Messages for MIDI - desafortunadamente es algo que falta.

Solía ​​haber un código de muestra para este tipo de controlador, como parte del NT4 DDK, pero las versiones más recientes del DDK/WDK desafortunadamente ya no lo incluyen.

Algunos mejor (aunque más) documentación y código de ejemplo, pueden encontrarse aún después de buscar: