You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
3.6 KiB

  1. #
  2. # This file is part of usb_protocol.
  3. #
  4. """ Convenience emitters for USB Audio Class 2 descriptors. """
  5. from contextlib import contextmanager
  6. from .. import emitter_for_format
  7. from ...types.descriptors.uac import *
  8. from ...types.descriptors.uac2 import *
  9. from ...emitters.descriptor import ComplexDescriptorEmitter
  10. ###################### MIDI #########################
  11. StandardMidiStreamingInterfaceDescriptorEmitter = emitter_for_format(StandardMidiStreamingInterfaceDescriptor)
  12. ClassSpecificMidiStreamingInterfaceHeaderDescriptorEmitter = emitter_for_format(ClassSpecificMidiStreamingInterfaceHeaderDescriptor)
  13. StandardMidiStreamingDataEndpointDescriptorEmitter = emitter_for_format(StandardMidiStreamingDataEndpointDescriptor)
  14. StandardMidiStreamingBulkDataEndpointDescriptorEmitter = emitter_for_format(StandardMidiStreamingBulkDataEndpointDescriptor)
  15. MidiInJackDescriptorEmitter = emitter_for_format(MidiInJackDescriptor)
  16. MidiOutJackDescriptorElementEmitter = emitter_for_format(MidiOutJackDescriptorElement)
  17. MidiOutJackDescriptorFootEmitter = emitter_for_format(MidiOutJackDescriptorFoot)
  18. ClassSpecificMidiStreamingBulkDataEndpointDescriptorHeadEmitter = emitter_for_format(ClassSpecificMidiStreamingBulkDataEndpointDescriptorHead)
  19. ClassSpecificMidiStreamingBulkDataEndpointDescriptorElementEmitter = emitter_for_format(ClassSpecificMidiStreamingBulkDataEndpointDescriptorElement)
  20. class ClassSpecificMidiStreamingInterfaceDescriptorEmitter(ComplexDescriptorEmitter):
  21. DESCRIPTOR_FORMAT = ClassSpecificMidiStreamingInterfaceHeaderDescriptor
  22. def _pre_emit(self):
  23. # Figure out the total length of our descriptor, including subordinates.
  24. subordinate_length = sum(len(sub) for sub in self._subordinates)
  25. self.wTotalLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof()
  26. class MidiOutJackDescriptorEmitter(ComplexDescriptorEmitter):
  27. DESCRIPTOR_FORMAT = MidiOutJackDescriptorHead
  28. def add_subordinate_descriptor(self, subordinate):
  29. subordinate = subordinate.emit()
  30. self._subordinates.append(subordinate)
  31. def add_source(self, sourceId, sourcePin=1):
  32. sourceDescriptor = MidiOutJackDescriptorElementEmitter()
  33. sourceDescriptor.baSourceID = sourceId
  34. sourceDescriptor.BaSourcePin = sourcePin
  35. self.add_subordinate_descriptor(sourceDescriptor)
  36. def _pre_emit(self):
  37. self.add_subordinate_descriptor(MidiOutJackDescriptorFootEmitter())
  38. # Figure out the total length of our descriptor, including subordinates.
  39. subordinate_length = sum(len(sub) for sub in self._subordinates)
  40. self.bLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof()
  41. class ClassSpecificMidiStreamingBulkDataEndpointDescriptorEmitter(ComplexDescriptorEmitter):
  42. DESCRIPTOR_FORMAT = ClassSpecificMidiStreamingBulkDataEndpointDescriptorHead
  43. def add_subordinate_descriptor(self, subordinate):
  44. subordinate = subordinate.emit()
  45. self._subordinates.append(subordinate)
  46. def add_associated_jack(self, jackID):
  47. jackDescriptor = ClassSpecificMidiStreamingBulkDataEndpointDescriptorElementEmitter()
  48. jackDescriptor.baAssocJackID = jackID
  49. self.add_subordinate_descriptor(jackDescriptor)
  50. def _pre_emit(self):
  51. # Figure out the total length of our descriptor, including subordinates.
  52. subordinate_length = sum(len(sub) for sub in self._subordinates)
  53. self.bLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof()