dxd - dynax driver framework 3.0.2
cross platform open source driver development framework
Loading...
Searching...
No Matches
dx::midi::services::driver< device_t > Class Template Referenceabstract

Windows MIDI Services client driver interface class. More...

#include <dx_midi_services_driver.h>

Inheritance diagram for dx::midi::services::driver< device_t >:
Collaboration diagram for dx::midi::services::driver< device_t >:

Classes

struct  property
 this bus's name in the device tree and the preference store More...

Public Types

typedef std::conditional_t<held, typename view::template iterator<typename holders::const_iterator>, typename holders::const_iterator> const_iterator
typedef std::conditional_t<held, typename view::template iterator<typename holders::iterator>, typename holders::iterator> iterator
typedef driver map
typedef super::match match
typedef driver_settings<dx::promoted<dx::log>::preference<preference_t>> settings
typedef driver_settings<dx::promoted<dx::log>::preference<decltype(device_t::preference)>> settings
typedef std::conditional_t<held, typename view::value_type, typename holders::value_type> value_type

Public Member Functions

const_iterator begin() const noexcept
iterator begin() noexcept
virtual bool boot()
virtual bool boot()
void conclude() noexcept override
 conclude notification: object will be removed. If you overwrite conclude() you also need to overwrite destructor and check if its needed to be called from there. Called only through try_conclude() - never call this directly from outside the class hierarchy.
 driver(const match& matching_ids, const char* product_id, const decltype(super::preference)& preferencepreference, dx::log log= {})
 the Windows MIDI Services client driver interface class constructor
 driver(const match& matching_ids, const char* product_id, dx::log log= {})
const_iterator end() const noexcept
iterator end() noexcept
void exception(const class exception& exception, bool filtered= false) const noexcept override
 notification exception handler
void exception(const class exception& exception, bool filtered= false) const noexcept override
 notification exception handler
virtual void exception(const exception& exception, bool filtered= false) const noexcept= 0
 notification exception handler
virtual void exception(const exception& exception, bool filtered= false) const noexcept= 0
 notification exception handler
iterator find(const device_id_t& device_id)
const_iterator find(const device_id_t& device_id) const
void launch() override
 launch notification: object mounted and ready to use. Called only through try_launch() - never call this directly from outside the class hierarchy.
virtual operator bool() const noexcept
virtual driver& operator <<(const char* file)
virtual driver& operator <<(std::ifstream &)
 restores device settings
virtual driver& operator >>(const char* file) const
virtual driver& operator >>(std::ostream& ostream) const
 saves device tree
virtual bool shutdown()
 client driver::shutdown/boot(): override to shutdown/boot host driver
virtual bool shutdown()
 client driver::shutdown/boot(): override to shutdown/boot host driver
bool try_conclude() noexcept
 atomically conclude()s if currently launched; returns whether this call did it
bool try_conclude() noexcept
 atomically conclude()s if currently launched; returns whether this call did it
bool try_launch()
 atomically launch()es if not already launched; returns whether this call did it. A launch() that throws is concluded before the exception leaves: the object never claims a launch it did not finish
bool try_launch()
 atomically launch()es if not already launched; returns whether this call did it. A launch() that throws is concluded before the exception leaves: the object never claims a launch it did not finish
 ~driver() override

Static Public Member Functions

static device_t::desc_t endpoint()
 what every endpoint is to this bus: an in and an out stream of Universal MIDI Packets, one pin each, the group inside the word, a ring of buffers words; a product sets its own ahead of launch, the device takes it and adds what the service says of the endpoint

Public Attributes

device_t::desc_t desc{endpoint()}
T elements
 STL member.
T elements
 STL member.
enumeration::MidiEndpointDeviceInformationFilters filters{enumeration::MidiEndpointDeviceInformationFilters::AllStandardEndpoints}
 what the watcher lists, set ahead of launch: the standard endpoints, DiagnosticLoopback beside them for a round trip without a device
K keys
 STL member.
K keys
 STL member.
std::atomic<bool> launched
std::atomic<bool> launched{}
dx::log log{}
 cached local log level, mirrors settings::log
dx::log log
 cached local log level, mirrors settings::log
api::MidiApiMode mode{}
redirect::pipe pipe
 where the process's lines go: the log's pipes, files under its path named after the product
redirect::pipe pipe
 where the process's lines go: the log's pipes, files under its path named after the product
preference_t preference
decltype(device_t::preference) preference
const char* product_id
const char* product_id
promoted<os_result> status{driver_not_connected}
 the driver's condition, promoted so a host follows it without polling
promoted<os_result> status
 the driver's condition, promoted so a host follows it without polling
uint32_t version{DX_VERSION32}
uint32_t version

Protected Types

typedef decltype(device_t::id) device_id_t
typedef std::map<device_id_t, std::shared_ptr<device_t>> holders

Protected Member Functions

virtual bool add(const device_id_t &)= 0
 adds a new device to the device list
virtual bool add(const decltype(device_t::id) &)= 0
 adds a new device to the device list
bool add(const device_id_t& device_id) override
 a device whose bus states nothing of it: an empty match takes it
bool add(const device_id_t& device_id, const lookup_t& lookup)
 adds a new device to the device list where the match takes it, asked ahead of the device - lookup(verb) what the bus's system or a desc it holds states of the device, none where neither does
virtual void arrived()
 notify device arrivals completed stub
virtual void arrived(device_t &)
 notify specific device arrival stub
virtual void clear() noexcept
 replaces std::map::clear to call virtual notification methods
void found(const enumeration::MidiEndpointDeviceInformation& endpoint)
 an endpoint the watcher reports: taken where it matches - the verbs the service's API names, the transport's USB ids as usb::vid/pid
virtual void remove(const device_id_t &)= 0
 finds and removes a device from the device list
virtual void remove(const decltype(device_t::id) &)= 0
 finds and removes a device from the device list
void remove(const device_id_t& device_id) override
 finds and removes a device from the device list
virtual void removed() noexcept
 notify device removals completed stub
virtual void removed(device_t &) noexcept
 notify specific device removal stub
void sleep() override
 < notify system will sleep
void wake() override

Protected Attributes

match matching_ids
 which devices of the bus this driver takes

Detailed Description

template<class device_t>
class dx::midi::services::driver< device_t >

Windows MIDI Services client driver interface class.

One device per UMP endpoint, identified by its endpoint device id and matched by substrings of what the service says of it. Arrival and removal come from the SDK's endpoint watcher.

Exceptions
incase of an error returned by the underlaying API the driver class throws a dx::exception.

Member Typedef Documentation

◆ const_iterator

typedef std::conditional_t<held, typename view::template iterator<typename holders::const_iterator>, typename holders::const_iterator> dx::map::driver<device_t, device_t>::const_iterator
inherited

◆ device_id_t

typedef decltype(device_t::id) dx::map::driver<device_t, device_t>::device_id_t
protectedinherited

◆ holders

typedef std::map<device_id_t, std::shared_ptr<device_t>> dx::map::driver<device_t, device_t>::holders
protectedinherited

◆ iterator

typedef std::conditional_t<held, typename view::template iterator<typename holders::iterator>, typename holders::iterator> dx::map::driver<device_t, device_t>::iterator
inherited

◆ map

typedef driver dx::map::driver<device_t, device_t>::map
inherited

◆ match

◆ settings [1/2]

template<typename device_id_t, typename preference_t>
typedef driver_settings<dx::promoted<dx::log>::preference<preference_t>> dx::driver<device_id_t, preference_t>::settings
inherited

the driver's own settings: the log a promoted::preference on the store's dx::log::id node, resolved like a stream desc (dx::log's DX_TREE_SERIALIZE), the constructor's log its default - stored as no entry, reloaded on the store's change

◆ settings [2/2]

typedef driver_settings<dx::promoted<dx::log>::preference<decltype(device_t::preference)>> dx::driver<decltype(device_t::id), decltype(device_t::preference)>::settings
inherited

the driver's own settings: the log a promoted::preference on the store's dx::log::id node, resolved like a stream desc (dx::log's DX_TREE_SERIALIZE), the constructor's log its default - stored as no entry, reloaded on the store's change

◆ value_type

typedef std::conditional_t<held, typename view::value_type, typename holders::value_type> dx::map::driver<device_t, device_t>::value_type
inherited

Constructor & Destructor Documentation

◆ driver() [1/2]

template<class device_t>
dx::midi::services::driver<device_t>::driver(const match& matching_ids, const char* product_id, const decltype(super::preference)& preference, dx::log log= {})
inline

the Windows MIDI Services client driver interface class constructor

Parameters
matching_idsthe matching dictionaries identifying the endpoints
product_idclient driver ID
preferencepreference
loglog settings

◆ driver() [2/2]

template<class device_t>
dx::midi::services::driver<device_t>::driver(const match& matching_ids, const char* product_id, dx::log log= {})
inline

◆ ~driver()

template<class device_t>
dx::midi::services::driver<device_t>::~driver()
inlineoverride
Here is the call graph for this function:

Member Function Documentation

◆ add() [1/4]

template<typename device_id_t, typename preference_t>
virtual bool dx::driver<device_id_t, preference_t>::add(const device_id_t&)
protectedpure virtualinherited

adds a new device to the device list

Returns
the device was taken
Exceptions
dx::exception

◆ add() [2/4]

virtual bool dx::driver<decltype(device_t::id), decltype(device_t::preference)>::add(const decltype(device_t::id)&)
protectedpure virtualinherited

adds a new device to the device list

Returns
the device was taken
Exceptions
dx::exception

◆ add() [3/4]

bool dx::map::driver<device_t, device_t>::add(const device_id_t& device_id)
inlineoverrideprotectedinherited

a device whose bus states nothing of it: an empty match takes it

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add() [4/4]

bool dx::map::driver<device_t, device_t>::add(const device_id_t& device_id, const lookup_t& lookup)
inlineprotectedinherited

adds a new device to the device list where the match takes it, asked ahead of the device - lookup(verb) what the bus's system or a desc it holds states of the device, none where neither does

Returns
the device was taken
Exceptions
dx::exception
Here is the call graph for this function:

◆ arrived() [1/2]

()
protectedvirtualinherited

notify device arrivals completed stub

Reimplemented from dx::driver< device_id_t, preference_t >.

◆ arrived() [2/2]

virtual void dx::map::driver<device_t, device_t>::arrived(device_t&)
inlineprotectedvirtualinherited

notify specific device arrival stub

Reimplemented in dx::stream::driver< dx::map::driver< device_t > >, and dx::stream::driver< map::driver< device_t > >.

Here is the caller graph for this function:

◆ begin() [1/2]

const_iterator dx::map::driver<device_t, device_t>::begin() const
inlinenoexceptinherited

◆ begin() [2/2]

iterator dx::map::driver<device_t, device_t>::begin()
inlinenoexceptinherited
Here is the call graph for this function:
Here is the caller graph for this function:

◆ boot() [1/2]

template<typename device_id_t, typename preference_t>
virtual bool dx::driver<device_id_t, preference_t>::boot()
inlinevirtualinherited

Reimplemented in dx::coreaudio::driver< device_t >.

Here is the caller graph for this function:

◆ boot() [2/2]

virtual bool dx::driver<decltype(device_t::id), decltype(device_t::preference)>::boot()
inlinevirtualinherited

◆ clear()

virtual void dx::map::driver<device_t, device_t>::clear()
inlineprotectedvirtualnoexceptinherited

replaces std::map::clear to call virtual notification methods

Here is the call graph for this function:
Here is the caller graph for this function:

◆ conclude()

template<class device_t>
void dx::midi::services::driver<device_t>::conclude()
inlineoverridevirtualnoexcept

conclude notification: object will be removed. If you overwrite conclude() you also need to overwrite destructor and check if its needed to be called from there. Called only through try_conclude() - never call this directly from outside the class hierarchy.

Reimplemented from dx::map::driver< device_t >.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ end() [1/2]

const_iterator dx::map::driver<device_t, device_t>::end() const
inlinenoexceptinherited

◆ end() [2/2]

iterator dx::map::driver<device_t, device_t>::end()
inlinenoexceptinherited
Here is the caller graph for this function:

◆ endpoint()

template<class device_t>
device_t::desc_t dx::midi::services::driver<device_t>::endpoint()
inlinestatic

what every endpoint is to this bus: an in and an out stream of Universal MIDI Packets, one pin each, the group inside the word, a ring of buffers words; a product sets its own ahead of launch, the device takes it and adds what the service says of the endpoint

Here is the caller graph for this function:

◆ exception() [1/4]

template<typename device_id_t, typename preference_t>
void dx::driver<device_id_t, preference_t>::exception(const class exception& exception, bool filtered= false) const
inlineoverridenoexceptinherited

notification exception handler

Here is the caller graph for this function:

◆ exception() [2/4]

void dx::driver<decltype(device_t::id), decltype(device_t::preference)>::exception(const class exception& exception, bool filtered= false) const
inlineoverridenoexceptinherited

notification exception handler

◆ exception() [3/4]

virtual void dx::object::exception(const exception& exception, bool filtered= false) const
pure virtualnoexceptinherited

notification exception handler

◆ exception() [4/4]

virtual void dx::object::exception(const exception& exception, bool filtered= false) const
pure virtualnoexceptinherited

notification exception handler

Implemented in dx::asio::client::_device< desc_t, preference_t, stream_t, group_t >, dx::asio::client::_device< desc, preference, stream< device< desc, preference, stream, group > >, group< device< desc, preference, stream, group > > >, dx::asio::client::_device< desc_t, preference_t, stream_t< device< desc_t, preference_t, stream_t, group_t > >, group_t< device< desc_t, preference_t, stream_t, group_t > > >, dx::device< id_t, preference_t >, dx::device< dx::guid, preference >, dx::device< std::string, dx::preference >, dx::device< std::string, preference >, dx::device< std::string, preference_t >, dx::device<::AudioObjectID, cf::preference >, dx::device<::io_service_t, dx::preference >, dx::device<::io_service_t, preference_t >, dx::device<::MIDIDeviceRef, cf::preference >, dx::device<>, dx::proxy::device< preference_t >, dx::proxy::device< preference_t >, dx::proxy::device< dx::preference >, dx::proxy::device<>, dx::registry::device< preference_t >, dx::registry::device< dx::preference >, dx::service::app, dx::service::app, dx::service::client::_device< desc_t, preference_t, stream_t, group_t >, dx::service::client::_device< desc, preference, stream< device< desc, preference, stream, group > >, group< device< desc, preference, stream, group > > >, dx::service::client::_device< desc_t, preference_t, stream_t< device< desc_t, preference_t, stream_t, group_t > >, group_t< device< desc_t, preference_t, stream_t, group_t > > >, dx::stream::object< _device_t >, dx::stream::object< device<> >, dx::stream::pin< device_t, _circular_t >, dx::usb::device< preference_t >, dx::usb::device< dx::preference >, dx::usb::platform::device< preference_t >, dx::usb::platform::device< preference_t >, dx::usb::platform::device< dx::preference >, dx::usb::platform::device< preference_t >, dx::usb::platform::device< preference_t >, dx::usb::stream::pipe< device_t, circular_t, stream_t >, dx::virtuel::stream::_device< desc_t, preference_t, stream_t, group_t >, dx::virtuel::stream::_device< desc, dx::preference, dx::stream::shared::stream< device< desc, dx::preference, dx::stream::shared::stream, group > >, group< device< desc, dx::preference, dx::stream::shared::stream, group > > >, dx::virtuel::stream::_device< desc_t, preference_t, stream_t< device< desc_t, preference_t, stream_t, group_t > >, group_t< device< desc_t, preference_t, stream_t, group_t > > >, and dx::wasapi::client::_device< desc, preference, stream< device< desc, preference, stream, group > >, group< device< desc, preference, stream, group > > >.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find() [1/2]

iterator dx::map::driver<device_t, device_t>::find(const device_id_t& device_id)
inlineinherited
Here is the caller graph for this function:

◆ find() [2/2]

const_iterator dx::map::driver<device_t, device_t>::find(const device_id_t& device_id) const
inlineinherited

◆ found()

template<class device_t>
void dx::midi::services::driver<device_t>::found(const enumeration::MidiEndpointDeviceInformation& endpoint)
inlineprotected

an endpoint the watcher reports: taken where it matches - the verbs the service's API names, the transport's USB ids as usb::vid/pid

Here is the call graph for this function:
Here is the caller graph for this function:

◆ launch()

template<class device_t>
void dx::midi::services::driver<device_t>::launch()
inlineoverridevirtual

launch notification: object mounted and ready to use. Called only through try_launch() - never call this directly from outside the class hierarchy.

Reimplemented from dx::map::driver< device_t >.

Here is the call graph for this function:

◆ operator bool()

template<class device_t>
virtual dx::midi::services::driver<device_t>::operator bool() const
inlinevirtualnoexcept

◆ operator <<() [1/2]

virtual driver& dx::map::driver<device_t, device_t>::operator <<(const char* file)
inlinevirtualinherited

Reimplemented in dx::coreaudio::driver< device_t >.

Here is the call graph for this function:

◆ operator <<() [2/2]

virtual driver& dx::map::driver<device_t, device_t>::operator <<(std::ifstream&)
inlinevirtualinherited

restores device settings

Reimplemented in dx::coreaudio::driver< device_t >, and dx::coremidi::driver< device_t >.

◆ operator >>() [1/2]

virtual driver& dx::map::driver<device_t, device_t>::operator >>(const char* file) const
inlinevirtualinherited

◆ operator >>() [2/2]

virtual driver& dx::map::driver<device_t, device_t>::operator >>(std::ostream& ostream) const
inlinevirtualinherited

saves device tree

Reimplemented in dx::coreaudio::driver< device_t >.

◆ remove() [1/3]

template<typename device_id_t, typename preference_t>
virtual void dx::driver<device_id_t, preference_t>::remove(const device_id_t&)
protectedpure virtualinherited

finds and removes a device from the device list

◆ remove() [2/3]

virtual void dx::driver<decltype(device_t::id), decltype(device_t::preference)>::remove(const decltype(device_t::id)&)
protectedpure virtualinherited

finds and removes a device from the device list

◆ remove() [3/3]

void dx::map::driver<device_t, device_t>::remove(const device_id_t& device_id)
inlineoverrideprotectedinherited

finds and removes a device from the device list

Exceptions
dx::exception
Here is the call graph for this function:
Here is the caller graph for this function:

◆ removed() [1/2]

()
protectedvirtualinherited

notify device removals completed stub

Reimplemented from dx::driver< device_id_t, preference_t >.

◆ removed() [2/2]

virtual void dx::map::driver<device_t, device_t>::removed(device_t&)
inlineprotectedvirtualnoexceptinherited

notify specific device removal stub

Here is the caller graph for this function:

◆ shutdown() [1/2]

template<typename device_id_t, typename preference_t>
virtual bool dx::driver<device_id_t, preference_t>::shutdown()
inlinevirtualinherited

client driver::shutdown/boot(): override to shutdown/boot host driver

Reimplemented in dx::coreaudio::driver< device_t >.

Here is the caller graph for this function:

◆ shutdown() [2/2]

virtual bool dx::driver<decltype(device_t::id), decltype(device_t::preference)>::shutdown()
inlinevirtualinherited

client driver::shutdown/boot(): override to shutdown/boot host driver

◆ sleep()

void dx::map::driver<device_t, device_t>::sleep()
inlineoverrideprotectedinherited

< notify system will sleep

notify system wake completed stub

◆ try_conclude() [1/2]

bool dx::object::try_conclude()
inlinenoexceptinherited

atomically conclude()s if currently launched; returns whether this call did it

◆ try_conclude() [2/2]

bool dx::object::try_conclude()
inlinenoexceptinherited

atomically conclude()s if currently launched; returns whether this call did it

Here is the call graph for this function:
Here is the caller graph for this function:

◆ try_launch() [1/2]

bool dx::object::try_launch()
inlineinherited

atomically launch()es if not already launched; returns whether this call did it. A launch() that throws is concluded before the exception leaves: the object never claims a launch it did not finish

◆ try_launch() [2/2]

bool dx::object::try_launch()
inlineinherited

atomically launch()es if not already launched; returns whether this call did it. A launch() that throws is concluded before the exception leaves: the object never claims a launch it did not finish

Here is the call graph for this function:
Here is the caller graph for this function:

◆ wake()

void dx::map::driver<device_t, device_t>::wake()
inlineoverrideprotectedinherited

Member Data Documentation

◆ desc

template<class device_t>
device_t::desc_t dx::midi::services::driver<device_t>::desc{endpoint()}

◆ elements [1/2]

T std::map<K, T>::elements
inherited

STL member.

◆ elements [2/2]

T std::map<K, T>::elements
inherited

STL member.

◆ filters

template<class device_t>
enumeration::MidiEndpointDeviceInformationFilters dx::midi::services::driver<device_t>::filters{enumeration::MidiEndpointDeviceInformationFilters::AllStandardEndpoints}

what the watcher lists, set ahead of launch: the standard endpoints, DiagnosticLoopback beside them for a round trip without a device

◆ keys [1/2]

K std::map<K, T>::keys
inherited

STL member.

◆ keys [2/2]

K std::map<K, T>::keys
inherited

STL member.

◆ launched [1/2]

std::atomic<bool> dx::object::launched
inherited

◆ launched [2/2]

std::atomic<bool> dx::object::launched{}
inherited

◆ log [1/2]

template<typename device_id_t, typename preference_t>
dx::log dx::driver<device_id_t, preference_t>::log{}
inherited

cached local log level, mirrors settings::log

◆ log [2/2]

dx::log dx::driver<decltype(device_t::id), decltype(device_t::preference)>::log
inherited

cached local log level, mirrors settings::log

◆ matching_ids

match dx::map::driver<device_t, device_t>::matching_ids
protectedinherited

which devices of the bus this driver takes

◆ mode

template<class device_t>
api::MidiApiMode dx::midi::services::driver<device_t>::mode{}

the API mode the machine runs in, read at launch: in legacy mode the service lists no device

◆ pipe [1/2]

template<typename device_id_t, typename preference_t>
redirect::pipe dx::driver<device_id_t, preference_t>::pipe
inherited

where the process's lines go: the log's pipes, files under its path named after the product

◆ pipe [2/2]

redirect::pipe dx::driver<decltype(device_t::id), decltype(device_t::preference)>::pipe
inherited

where the process's lines go: the log's pipes, files under its path named after the product

◆ preference [1/2]

template<typename device_id_t, typename preference_t>
preference_t dx::driver<device_id_t, preference_t>::preference
inherited

◆ preference [2/2]

decltype(device_t::preference) dx::driver<decltype(device_t::id), decltype(device_t::preference)>::preference
inherited

◆ product_id [1/2]

template<typename device_id_t, typename preference_t>
const char* dx::driver<device_id_t, preference_t>::product_id
inherited

◆ product_id [2/2]

const char* dx::driver<decltype(device_t::id), decltype(device_t::preference)>::product_id
inherited

◆ status [1/2]

template<typename device_id_t, typename preference_t>
promoted<os_result> dx::driver<device_id_t, preference_t>::status{driver_not_connected}
inherited

the driver's condition, promoted so a host follows it without polling

◆ status [2/2]

promoted<os_result> dx::driver<decltype(device_t::id), decltype(device_t::preference)>::status
inherited

the driver's condition, promoted so a host follows it without polling

◆ version [1/2]

template<typename device_id_t, typename preference_t>
uint32_t dx::driver<device_id_t, preference_t>::version{DX_VERSION32}
inherited

◆ version [2/2]

uint32_t dx::driver<decltype(device_t::id), decltype(device_t::preference)>::version
inherited

The documentation for this class was generated from the following file: