# # This file is part of usb_protocol. # """ Convenience emitters for USB Audio Class 2 descriptors. """ from contextlib import contextmanager from .. import emitter_for_format from ...types.descriptors.uac import * from ...types.descriptors.uac2 import * from ...emitters.descriptor import ComplexDescriptorEmitter ###################### MIDI ######################### StandardMidiStreamingInterfaceDescriptorEmitter = emitter_for_format(StandardMidiStreamingInterfaceDescriptor) ClassSpecificMidiStreamingInterfaceHeaderDescriptorEmitter = emitter_for_format(ClassSpecificMidiStreamingInterfaceHeaderDescriptor) StandardMidiStreamingDataEndpointDescriptorEmitter = emitter_for_format(StandardMidiStreamingDataEndpointDescriptor) StandardMidiStreamingBulkDataEndpointDescriptorEmitter = emitter_for_format(StandardMidiStreamingBulkDataEndpointDescriptor) MidiInJackDescriptorEmitter = emitter_for_format(MidiInJackDescriptor) MidiOutJackDescriptorElementEmitter = emitter_for_format(MidiOutJackDescriptorElement) MidiOutJackDescriptorFootEmitter = emitter_for_format(MidiOutJackDescriptorFoot) ClassSpecificMidiStreamingBulkDataEndpointDescriptorHeadEmitter = emitter_for_format(ClassSpecificMidiStreamingBulkDataEndpointDescriptorHead) ClassSpecificMidiStreamingBulkDataEndpointDescriptorElementEmitter = emitter_for_format(ClassSpecificMidiStreamingBulkDataEndpointDescriptorElement) class ClassSpecificMidiStreamingInterfaceDescriptorEmitter(ComplexDescriptorEmitter): DESCRIPTOR_FORMAT = ClassSpecificMidiStreamingInterfaceHeaderDescriptor def _pre_emit(self): # Figure out the total length of our descriptor, including subordinates. subordinate_length = sum(len(sub) for sub in self._subordinates) self.wTotalLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof() class MidiOutJackDescriptorEmitter(ComplexDescriptorEmitter): DESCRIPTOR_FORMAT = MidiOutJackDescriptorHead def add_subordinate_descriptor(self, subordinate): subordinate = subordinate.emit() self._subordinates.append(subordinate) def add_source(self, sourceId, sourcePin=1): sourceDescriptor = MidiOutJackDescriptorElementEmitter() sourceDescriptor.baSourceID = sourceId sourceDescriptor.BaSourcePin = sourcePin self.add_subordinate_descriptor(sourceDescriptor) def _pre_emit(self): self.add_subordinate_descriptor(MidiOutJackDescriptorFootEmitter()) # Figure out the total length of our descriptor, including subordinates. subordinate_length = sum(len(sub) for sub in self._subordinates) self.bLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof() class ClassSpecificMidiStreamingBulkDataEndpointDescriptorEmitter(ComplexDescriptorEmitter): DESCRIPTOR_FORMAT = ClassSpecificMidiStreamingBulkDataEndpointDescriptorHead def add_subordinate_descriptor(self, subordinate): subordinate = subordinate.emit() self._subordinates.append(subordinate) def add_associated_jack(self, jackID): jackDescriptor = ClassSpecificMidiStreamingBulkDataEndpointDescriptorElementEmitter() jackDescriptor.baAssocJackID = jackID self.add_subordinate_descriptor(jackDescriptor) def _pre_emit(self): # Figure out the total length of our descriptor, including subordinates. subordinate_length = sum(len(sub) for sub in self._subordinates) self.bLength = subordinate_length + self.DESCRIPTOR_FORMAT.sizeof()