ariel_os::reexports::embassy_usb::class::midi

Struct MidiClass

pub struct MidiClass<'d, D>
where D: Driver<'d>,
{ /* private fields */ }
Expand description

Packet level implementation of a USB MIDI device.

This class can be used directly and it has the least overhead due to directly reading and writing USB packets with no intermediate buffers, but it will not act like a stream-like port. The following constraints must be followed if you use this class directly:

  • read_packet must be called with a buffer large enough to hold max_packet_size bytes.
  • write_packet must not be called with a buffer larger than max_packet_size bytes.
  • If you write a packet that is exactly max_packet_size bytes long, it won’t be processed by the host operating system until a subsequent shorter packet is sent. A zero-length packet (ZLP) can be sent if there is no other data to send. This is because USB bulk transactions must be terminated with a short packet, even if the bulk endpoint is used for stream-like data.

Implementations§

§

impl<'d, D> MidiClass<'d, D>
where D: Driver<'d>,

pub fn new( builder: &mut Builder<'d, D>, n_in_jacks: u8, n_out_jacks: u8, max_packet_size: u16, ) -> MidiClass<'d, D>

Creates a new MidiClass with the provided UsbBus, number of input and output jacks and max_packet_size in bytes. For full-speed devices, max_packet_size has to be one of 8, 16, 32 or 64.

pub fn max_packet_size(&self) -> u16

Gets the maximum packet size in bytes.

pub async fn write_packet(&mut self, data: &[u8]) -> Result<(), EndpointError>

Writes a single packet into the IN endpoint.

pub async fn read_packet( &mut self, data: &mut [u8], ) -> Result<usize, EndpointError>

Reads a single packet from the OUT endpoint.

pub async fn wait_connection(&mut self)

Waits for the USB host to enable this interface

pub fn split(self) -> (Sender<'d, D>, Receiver<'d, D>)

Split the class into a sender and receiver.

This allows concurrently sending and receiving packets from separate tasks.

Auto Trait Implementations§

§

impl<'d, D> Freeze for MidiClass<'d, D>
where <D as Driver<'d>>::EndpointOut: Freeze, <D as Driver<'d>>::EndpointIn: Freeze,

§

impl<'d, D> RefUnwindSafe for MidiClass<'d, D>

§

impl<'d, D> Send for MidiClass<'d, D>
where <D as Driver<'d>>::EndpointOut: Send, <D as Driver<'d>>::EndpointIn: Send,

§

impl<'d, D> Sync for MidiClass<'d, D>
where <D as Driver<'d>>::EndpointOut: Sync, <D as Driver<'d>>::EndpointIn: Sync,

§

impl<'d, D> Unpin for MidiClass<'d, D>
where <D as Driver<'d>>::EndpointOut: Unpin, <D as Driver<'d>>::EndpointIn: Unpin,

§

impl<'d, D> UnwindSafe for MidiClass<'d, D>
where <D as Driver<'d>>::EndpointOut: UnwindSafe, <D as Driver<'d>>::EndpointIn: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

§

const WITNESS: W = W::MAKE

A constant of the type witness
§

impl<T> Identity for T
where T: ?Sized,

§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V