a stream of a Windows MIDI Services endpoint: Universal MIDI Packets through the device's connection, an ump::circular ring on this side
More...
|
| stream& | attach(void **[2], const std::vector<bool> &, direction::direction, const dx::stream::format &) |
| | the pin passes its own direction: a stream shared by two pins carries none of its own
|
| bool | claim(direction::direction direction) |
| | taken while there is none
|
| 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() |
| virtual void | initialize() |
| void | launch() override |
| uint64_t | lost() const noexcept |
| | operator ump::circular*() const noexcept |
| ump::circular* | operator ->() const noexcept |
| void | receive(uint64_t timestamp, uint32_t count, const uint32_t* words) noexcept |
| | what the service hands over, from its thread, stamped by its clock: into the ring or dropped
|
| virtual os_result | status() noexcept |
| | stream(device_t& device, const decltype(super::id)& id, const super::desc& descdesc) |
| 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 |
|
| bool | anchored |
| | origin is set: by the tick that first finds the ring ticking, reset by the run hook
|
| struct dx::stream::stream:: { ... } | cache |
| dx::stream::channel::control* | control |
| | kernel streaming: the driver's buffer switch bookkeeping, set by attach()
|
| event_t | data [direction::directions] |
| | event signalising data arrival(in) or draining(out)
|
| dx::promoted<dx::stream::format> | format |
| | the container this stream's ring runs: class and width its participants agreed on
|
| const decltype(desc::target.idx()) | id |
| uint32_t | latency |
| int64_t | origin |
| | the ring's index at the device's sample zero: a ticking group keeps every ring's cycle from its device time and this
|
| decltype(device_t::samplerate)& | samplerate |
| bool | 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
|
| volatile int64_t | transport |
| std::mutex | writer |
| | the ring's client writers one at a time: a stream's pins write one ring, each on its own port
|
template<typename device_t, typename circular_t = ump::circular>
class dx::midi::services::stream< device_t, circular_t >
a stream of a Windows MIDI Services endpoint: Universal MIDI Packets through the device's connection, an ump::circular ring on this side
in*: the connection's raw callback (the device's sink) writes the words it is handed into the ring and signals data[in]; it is the service's thread, so a ring that is full drops the words and counts them. out: the transmit thread reads whole packets off the ring and hands them to the connection, at most what one transmission takes, a run due at one moment in one transmission the service schedules; a writer signals data[in] after writing, the thread signals data[out] for every run it drained.
The connection stands while a stream runs: the first stream to run opens it, the last to halt closes it. one direction of a UMP endpoint: the in side takes the service's raw callback, stamps the words with the service's clock and never stalls - a full ring drops and counts - while the out side's thread sends a run due at one moment in one raw transmission of at most maximum words
< 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 hosted device's ring is its host's (kernel, service, plugin) and attached as it stands - sizing it here would write the ring into a mapping of the host's making
< a fresh ring, zeroed by alloc(), takes its size here