python - PyGame vuelve a inicializar el dispositivo MIDI USB al volver a conectar
udev pyudev (2)
Estoy usando PyGame para leer un dispositivo USB MIDI, muy similar a lo que se usa aquí , excepto que lo ejecuto como un servicio en segundo plano en una Raspberry Pi.
Me gustaría poder desconectar y volver a conectar el dispositivo MIDI y aún así poder leerlo.
He intentado dos enfoques:
- Enumere regularmente los dispositivos MIDI usando pygame.midi.get_count () e info ().
- Utilice pyudev para monitorear eventos USB, similar a este ejemplo.
El problema con (1) es que parece que pygame.midi siempre devuelve los mismos valores (tanto get_count como info), independientemente de si el dispositivo todavía está conectado.
El problema con (2) es que nunca llamaría a la función asíncrona que registré para eventos (aunque el ejemplo independiente funciona bien, simplemente cambiando el subsistema a usb). Pensé que esto podría ser un problema con el enhebrado, así que llamé a todo para registrar eventos de un hilo dedicado, que luego ejecutó glib.MainLoop.run () para esperar inactivo, pero descubrí que el pygame no podría leer el dispositivo midi si comencé cualquier hilo antes de ejecutar mi clase AMK, incluso solo un hilo que imprimía algo y lo devolvía. (Estoy usando glib ya que la versión de pyudev en el repositorio Pi es 0.13, pero supongo que la forma más nueva es el equivalente al gobject).
Así que recurrí al uso de udevd para detectar el evento de conexión y reiniciar mi servicio a través de /etc/udev/rules.d/ trigger, que funciona bien, pero es kludgy, y pierde el estado en mi script (que me gustaría guardar) )
Entonces, antes de perder muchas más horas depurando (2), esperaba que alguien pudiera señalarme en la dirección correcta.
pygame usa PortMidi, que fue diseñado originalmente para Windows MIDI API y asume que el conjunto de puertos MIDI nunca cambia.
Debe usar un proceso de monitor por separado que reinicie su programa cada vez que cambien los puertos MIDI.
Todavía no lo he probado a fondo, pero creo que si llamas a quit
y luego a init
, puedes obtener una lista de dispositivos MIDI debidamente actualizada. Aquí hay un ejemplo:
import pygame, pygame.midi
pygame.midi.init()
print pygame.midi.get_count()
a=raw_input(''Connect or disconnect some MIDI devices'')
pygame.midi.quit()
pygame.midi.init()
print pygame.midi.get_count()