[Python] PyGame Повторно инициализирует USB-MIDI-устройство при повторном подключении


Answers

Я еще не тестировал это полностью, но я считаю, что если вы вызываете quit а затем снова init , вы можете получить правильно обновленный список MIDI-устройств. Вот пример:

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()
Question

Я использую PyGame для чтения USB-устройства MIDI, очень похожего на то, что здесь используется, за исключением того, что я запускаю его как фоновый сервис на малине Pi.

Я хотел бы иметь возможность отключить и снова подключить MIDI-устройство и все еще читать его.

Я пробовал два подхода:

  1. Регулярно перечисляйте MIDI-устройства, используя pygame.midi.get_count () и info ().
  2. Используйте pyudev для отслеживания событий USB, подобных этому примеру.

Проблема с (1) заключается в том, что кажется, что pygame.midi всегда возвращает те же значения (как get_count, так и информацию), независимо от того, все ли подключено устройство.

Проблема с (2) заключается в том, что она никогда не вызовет асинхронную функцию, которую я зарегистрировал для событий (хотя автономный пример работает отлично, просто изменяя подтип в usb). Я решил, что это может быть проблемой с потоковой обработкой, поэтому я позвонил всем, чтобы регистрироваться для событий из выделенного потока, который затем запускал glib.MainLoop.run () для ожидания ожидания, но обнаружил, что pygame не сможет прочитать устройство midi если бы я начал какой-либо поток перед запуском моего класса AMK, даже просто поток, который что-то печатал и возвращал. (Я использую glib, так как версия pudev в Pi repo равна 0,13, но я думаю, что более новым способом является эквивалент gobject).

Таким образом, я прибегал к использованию udevd для обнаружения события connect и перезапуска моего сервиса с помощью /etc/udev/rules.d/ триггера, который работает нормально, но является kludgy и теряет состояние в моем сценарии (который я хотел бы сохранить ).

Поэтому, прежде чем тратить много времени на отладку (2), я надеялся, что кто-то может указать мне в правильном направлении.