#include <dx_coremidi_device.h>
|
| stream & | attach (channel_t **[2], const std::vector< bool > &, direction::direction) |
| | the pin passes its own direction: a stream shared by two pins carries none of its own
|
| virtual bool | encoder (dx::stream::encoder::index::type, unsigned int, float) |
| void | exception (const class exception &exception, bool filtered=false) const noexcept override |
| void | flush () |
| void | info (std::ostream &os) noexcept override |
| virtual void | initialize () |
| void | launch () override |
| uint64_t | lost () const noexcept |
| | the words CoreMIDI had no room for in the ring
|
| | operator dx::midi::ump::circular * () const noexcept |
| dx::midi::ump::circular * | operator-> () const noexcept |
| void | receive (const ::MIDIEventList &list) noexcept |
| | receive Universal MIDI Packets from the system
|
| | stream (device_t &device, const decltype(super::id)&id, const super::desc &desc) |
| | creates CoreMIDI endpoint connection and attaches stream to it
|
| virtual bool | submit (dx::stream::encoder::index::type, unsigned int, uint8_t) |
| | submit encoder stage to device return true if successfully submitted; if false is returned the encode state machine will not update the stage value (i.e. if the stage can't be submitted during streaming pause), given the chance to submit the stage at start().
|
| | ~stream () override |
|
| virtual void | alloc (size_t size, bool free=true) |
| void | deposit (int64_t timestamp, const uint32_t *words, uint32_t count) noexcept |
| | a run of words into the ring, stamped at the moment they arrived: dropped where the ring is full, never stalling the endpoint's thread
|
| virtual void | free () noexcept |
| | overrides may release further alloc()-acquired resources (request buffers, isoc pools, shared-memory attachments) alongside circular; called only from alloc()'s own self-cleanup or the destructor - never from halt()/stop(), so everything alloc() acquires stays live for the object's full lifetime
|
| void | send (const dx::midi::ump::packet *packet, uint64_t count) |
| | the packets of one run to the endpoint, every one at its own moment CoreMIDI schedules what is due later itself, so a packet keeps the frame it was written at; a list that is full goes as it stands and the packet opens the next one.
|
| void | transmit () noexcept |
| | circular data driven streaming out thread
|
◆ desc
◆ event_t
◆ stream()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
creates CoreMIDI endpoint connection and attaches stream to it
The port speaks Universal MIDI Packets (MIDIInputPortCreateWithProtocol, MIDISendEventList), which CoreMIDI has since macOS 11; an older system has no MIDI endpoint of this client.
the ring reset, composed with the data-driven OUT stream's own transmit thread
◆ ~stream()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
◆ alloc()
|
|
inlineprotectedvirtualinherited |
◆ attach()
the pin passes its own direction: a stream shared by two pins carries none of its own
◆ deposit()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
a run of words into the ring, stamped at the moment they arrived: dropped where the ring is full, never stalling the endpoint's thread
◆ encoder()
◆ exception()
|
|
inlineoverridenoexceptinherited |
◆ flush()
◆ free()
|
|
inlineprotectedvirtualnoexceptinherited |
overrides may release further alloc()-acquired resources (request buffers, isoc pools, shared-memory attachments) alongside circular; called only from alloc()'s own self-cleanup or the destructor - never from halt()/stop(), so everything alloc() acquires stays live for the object's full lifetime
◆ info()
|
|
inlineoverridenoexceptinherited |
◆ initialize()
< a shared ring takes the wider of its two directions
< this stream's own contribution: the frames its transport keeps ahead of/behind the ring
< a ring stating its size is its host's (kernel, service, plugin) and attached as it stands; a fresh one, zeroed by alloc(), takes its size here
◆ launch()
◆ lost()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
the words CoreMIDI had no room for in the ring
◆ operator dx::midi::ump::circular *()
◆ operator->()
◆ receive()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
receive Universal MIDI Packets from the system
receive is seen from the based circular buffer perspective: the packets are written into the circular buffer (to be used by this client driver hosting application) at the moment CoreMIDI stamped them with - the host clock, which is dx::timestamp() itself, so nothing is converted.
flow control & signalisation this->data[dx::stream::direction::in] -> signals data arrival(in) It is the endpoint's own thread, so a full ring drops the words and counts them (lost()) rather than stalling MIDI reception.
◆ send()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
the packets of one run to the endpoint, every one at its own moment CoreMIDI schedules what is due later itself, so a packet keeps the frame it was written at; a list that is full goes as it stands and the packet opens the next one.
◆ submit()
submit encoder stage to device return true if successfully submitted; if false is returned the encode state machine will not update the stage value (i.e. if the stage can't be submitted during streaming pause), given the chance to submit the stage at start().
◆ transmit()
template<typename device_t, typename circular_t = dx::midi::ump::circular>
circular data driven streaming out thread
transmit is seen from the based circular buffer perspective coremidi::stream::transmit() -> CoreMIDI MIDISendEventList: send to OS CoreMIDI MIDI Output endpoint If the receiving endpoint is an dx::coremidi::server::pin the MIDI data is received by coremidi::server::pin::receive() and there usually be used by a HW device device to send it out to its HW MIDI Output ports
flow control & signalisation this->data[dx::stream::direction::out] -> signals data draining(out) this->data[dx::stream::direction::in] -> waits for data arrival(in) ::MIDISendEventList() controls flow by stalling when endpoint buffering would be overflowing otherwise
◆ [struct]
◆ circular
◆ control
kernel streaming: the driver's buffer switch bookkeeping, set by attach()
◆ data
event signalising data arrival(in) or draining(out)
◆ endpoint
template<typename device_t, typename circular_t = dx::midi::ump::circular>
◆ format
the container this stream's ring runs: class and width its participants agreed on
A bus that negotiates it installs its own server; without one the request stands. The seed is the desc's own pin format, so a stream that nobody contradicts runs what it was declared with.
◆ granularity
◆ id
◆ latency
◆ linesize
◆ monitor
◆ port
template<typename device_t, typename circular_t = dx::midi::ump::circular>
◆ protocol
template<typename device_t, typename circular_t = dx::midi::ump::circular>
what the port speaks: MIDI 1.0 in Universal MIDI Packets, so a legacy endpoint is translated by CoreMIDI and a MIDI 2.0 one keeps its own words
◆ samplerate
◆ status
◆ ticking
the tick's own view of this stream's session: set by the run hook once the ring stands, cleared by the halt hook before the session ends - a plain flag, the tick must never block on a promoted's transition
The documentation for this class was generated from the following file: