dxd - dynax driver framework 3.0.1d223
cross platform open source driver development framework
Loading...
Searching...
No Matches
dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t > Class Template Reference

CoreAudio stream client device. More...

#include <dx_coreaudio_stream_device.h>

Inheritance diagram for dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >:
Collaboration diagram for dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >:

Public Types

typedef dx::virtuel::stream::desc desc_t
typedef dx::event< dx::kernel > event
typedef event event_t
typedef promoted< uint32_t >::template preference< decltype(dx::device<::AudioObjectID, cf::preference >::preference)> source_t
typedef dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > stream_t
typedef desc value_t

Public Member Functions

struct stream * align (struct stream *sync_reference)
 the given stream where it may be the sync reference, else the first one that may - what a stored reference is aligned to when the desc changed under it
uint32_t align (uint32_t sync_reference) const
void attach (channel_t **io[dx::stream::direction::directions][2], const std::vector< bool >(&channel_map)[2])
void conclude () noexcept override
 ends every group's session before the device's resources go; the start counts stay with their holders
 device (decltype(super::driver)&driver, decltype(super::id)&id)
uint32_t enumerate (const format &format=any) const
 enumerate typified pins
uint32_t enumerate (const format &format=any) const
 enumerate typified pins
void exception (const dx::exception &exception, bool filtered=false) const noexcept override
 notification exception handler
struct stream * find (const decltype(stream::target.idx())&target)
struct stream * find (const format &format=any, enum direction::direction direction=direction::any)
struct stream * find (const target &target)
struct stream * find (uint32_t &pin, const format &format=any, enum direction::direction direction=direction::any)
 finds and returns the stream description and pin idx into this stream
struct stream * find (const format &format=any, enum direction::direction direction=direction::any)
struct stream * find (uint32_t &pin, const format &format=any, enum direction::direction direction=direction::any)
 finds and returns the stream description and pin idx into this stream
virtual uint64_t frame () const
virtual bool hw_clock () const noexcept
virtual void hw_clock (abstract::event *hw_clock, uint32_t iosize)
 registers a consumer with the device's clock: it is signalled every iosize samples of the clock's own advance. A bus whose driver owns the clock hands the registration on instead
void info (std::ostream &os) noexcept override
 log object class information
std::shared_ptr< stream > open (const typename dx::virtuel::stream::desc::stream::desc &desc)
 the desc's stream: the registered one, else created, registered and launched
bool operator== (const desc &desc) const
bool operator== (const desc &desc) const
virtual device & operator>> (std::ostream &) const
 the device's own diagnostics, beyond dx::object::info
coreaudio::group & operator[] (const typename dx::virtuel::stream::desc::stream::desc &stream)
 the stream's group, created on first use
virtual _device & reset ()
virtual void sleep ()
 notify system will sleep stub
virtual std::pair< source_t &, bool > source (const struct dx::virtuel::stream::desc::stream &stream)
 the stream's source selector, created on first use: the preference by stream target, the value an index into the stream's sources
std::string string (uint8_t idx)
uint32_t sync_reference (struct stream *sync_reference)
struct stream * sync_reference (uint32_t sync_reference)
 the n-th stream qualifying as sync reference, and the twin below the index of a given one - the two directions of the preference's value
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
void wake () override

Public Attributes

dx::stream::bus::bus bus
 the bus this device hangs on
promoted::property< typename super::client_map, typename super::client_map::value_t, false > clients
struct dx::stream::desc::clock clock [1]
uint32_t clocks
promoted< uint32_t >::preference< decltype(super::preference)> clocksource
bool dflt
 can be selected as default (OS audio) device
dx::driver< decltype(id), cf::preference > & driver
bool editable
 can be edited
struct dx::stream::desc::firmware firmware
std::map< decltype(dx::virtuel::stream::desc::stream::group), coreaudio::group > group
 streaming groups by desc::stream::group id: every stream of this device is registered with its group - behind the settings its groups listen to, so they go first
bool hidden
 hide device
struct dx::stream::device:: { ... }  hw
promoted::property< icon, ::CFURLRef, false > icon
dx::coreaudio::_device::clocksource id
promoted< uint32_t >::preference< decltype(super::preference)> iosize
std::atomic< bool > launched
struct dx::stream::desc::name_id model
dx::stream::device::monitor monitor
bool persistence
 device has capability to store persistent settings (i.e. sample rate; clock source; etc.)
cf::preference preference
std::string puid
 persistent UID - system unique - could change with location
std::string puuid
 persistent universal UID - universally unique ID (i.e. serial number)
promoted::property<::Float64 > samplerate
std::map< decltype(dx::virtuel::stream::desc::stream::target.idx()), source_t > sources
direction::direction start_stop_order
struct dx::stream::desc::stream stream [max_streams]
uint32_t streams
 number of streams
promoted< structdesc_t::stream * >::template preference< decltype(super::preference), uint32_t > sync_reference
struct dx::stream::desc::name_id vendor
dx::stream::device::monitor version

Static Public Attributes

static constexpr bool hosted

Protected Member Functions

virtual void grouped (coreaudio::group< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > > &)
 operator[](): a group just came into existence, a host wires its per-group transports here
virtual void grouped (coreaudio::group &)
 operator[](): a group just came into existence, a host wires its per-group transports here
virtual void grouped (group_t &)
 operator[](): a group just came into existence, a host wires its per-group transports here
virtual void launch ()
 launch notification: object mounted and ready to use. Called only through try_launch() - never call this directly from outside the class hierarchy.
void process (const ::AudioTimeStamp *now, const ::AudioBufferList *input, const ::AudioTimeStamp *, ::AudioBufferList *output, const ::AudioTimeStamp *) override

Protected Attributes

std::vector< std::shared_ptr< typename super::dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > > > io_streams
 the streams process() iterates: fixed between AudioDeviceStart and AudioDeviceStop and held for it, so the IOProc never touches the mutable streams map nor a stream its client let go
decltype(super::iosize) ::chain iosize_server
 iosize_server The iosize is handled by CoreAudio - not the CoreAudio server plugin hence the coreaudio::stream::device is responsible to align and store
std::atomic< double > samplerate_cache {this->samplerate}
listener< dx::listen< std::function< void(const double &)> > > samplerate_listener

Detailed Description

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
class dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >

CoreAudio stream client device.

< the app's consumer group (dx::stream::engine::group) wraps this bus's own a genuine HAL client: it drives an installed plugin exactly as any audio application does - real AudioDeviceStart and I/O procs - and the iosize is the HAL's, not the plugin's

Member Typedef Documentation

◆ desc_t

◆ event

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
typedef dx::event<dx::kernel> dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::event

◆ event_t

◆ source_t

◆ stream_t

◆ value_t

typedef desc dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::value_t
inherited

Constructor & Destructor Documentation

◆ device()

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::device ( decltype(super::driver)& driver,
decltype(super::id)& id )
inline
Todo
coreaudio::device: validate configuration for clock settings
Here is the call graph for this function:

Member Function Documentation

◆ align() [1/2]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::align ( struct stream * sync_reference)
inlineinherited

the given stream where it may be the sync reference, else the first one that may - what a stored reference is aligned to when the desc changed under it

◆ align() [2/2]

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::align ( uint32_t sync_reference) const
inlineinherited

◆ attach()

void dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > >, group< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > >::attach ( channel_t ** io[dx::stream::direction::directions][2],
const std::vector< bool >(&) channel_map[2] )
inlineinherited

◆ conclude()

ends every group's session before the device's resources go; the start counts stay with their holders

◆ enumerate() [1/2]

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::enumerate ( const format & format = any) const
inlineinherited

enumerate typified pins

◆ enumerate() [2/2]

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::enumerate ( const format & format = any) const
inlineinherited

enumerate typified pins

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

◆ exception()

void dx::device< ::AudioObjectID, cf::preference >::exception ( const dx::exception & exception,
bool filtered = false ) const
inlineoverridenoexceptinherited

notification exception handler

◆ find() [1/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( const decltype(stream::target.idx())& target)
inlineinherited

◆ find() [2/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( const format & format = any,
enum direction::direction direction = direction::any )
inlineinherited
Parameters
formatsearch stream format filter
directionsearch stream direction filter

◆ find() [3/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( const target & target)
inlineinherited

◆ find() [4/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( uint32_t & pin,
const format & format = any,
enum direction::direction direction = direction::any )
inlineinherited

finds and returns the stream description and pin idx into this stream

Returns
stream description of indexed pin, pin idx will be altered on return!
Parameters
pinin: global pin index, out: pin index into returned stream description
formatsearch stream format filter
directionsearch stream direction filter

◆ find() [5/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( const format & format = any,
enum direction::direction direction = direction::any )
inlineinherited
Parameters
formatsearch stream format filter
directionsearch stream direction filter
Here is the call graph for this function:

◆ find() [6/6]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::find ( uint32_t & pin,
const format & format = any,
enum direction::direction direction = direction::any )
inlineinherited

finds and returns the stream description and pin idx into this stream

Returns
stream description of indexed pin, pin idx will be altered on return!
Parameters
pinin: global pin index, out: pin index into returned stream description
formatsearch stream format filter
directionsearch stream direction filter
Here is the caller graph for this function:

◆ frame()

◆ grouped() [1/3]

operator[](): a group just came into existence, a host wires its per-group transports here

◆ grouped() [2/3]

operator[](): a group just came into existence, a host wires its per-group transports here

◆ grouped() [3/3]

operator[](): a group just came into existence, a host wires its per-group transports here

◆ hw_clock() [1/2]

virtual bool dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, stream< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > >, coreaudio::group< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > > >::hw_clock ( ) const
inlinevirtualnoexceptinherited

◆ hw_clock() [2/2]

registers a consumer with the device's clock: it is signalled every iosize samples of the clock's own advance. A bus whose driver owns the clock hands the registration on instead

◆ info()

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
void dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::info ( std::ostream & os)
inlineoverridevirtualnoexcept

log object class information

Reimplemented from dx::coreaudio::_device< dx::virtuel::stream::desc, cf::preference, stream< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > >, coreaudio::group< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > > >.

Here is the call graph for this function:

◆ launch()

virtual void dx::object::launch ( )
inlineprotectedvirtualinherited

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

◆ open()

std::shared_ptr< stream > dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > >, group< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > >::open ( const typename dx::virtuel::stream::desc::stream::desc & desc)
inlineinherited

the desc's stream: the registered one, else created, registered and launched

◆ operator==() [1/2]

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::operator== ( const desc & desc) const
inlineinherited

◆ operator==() [2/2]

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::operator== ( const desc< target, 2, 2 > & desc) const
inlineinherited

◆ operator>>()

virtual device & dx::device< ::AudioObjectID, cf::preference >::operator>> ( std::ostream & ) const
inlinevirtualinherited

the device's own diagnostics, beyond dx::object::info

◆ operator[]()

coreaudio::group & dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > >, group< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > >::operator[] ( const typename dx::virtuel::stream::desc::stream::desc & stream)
inlineinherited

the stream's group, created on first use

◆ process()

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
void dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::process ( const ::AudioTimeStamp * now,
const ::AudioBufferList * input,
const ::AudioTimeStamp * ,
::AudioBufferList * output,
const ::AudioTimeStamp *  )
inlineoverrideprotectedvirtual

take timestamp on cycle boundary

Todo
evaluate this->circular->cycle.reference redudancy

Reimplemented from dx::coreaudio::_device< dx::virtuel::stream::desc, cf::preference, stream< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > >, coreaudio::group< device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false > > >.

Here is the call graph for this function:

◆ reset()

◆ sleep()

virtual void dx::device< ::AudioObjectID, cf::preference >::sleep ( )
inlinevirtualinherited

notify system will sleep stub

◆ source()

the stream's source selector, created on first use: the preference by stream target, the value an index into the stream's sources

◆ string()

◆ sync_reference() [1/2]

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::sync_reference ( struct stream * sync_reference)
inlineinherited

◆ sync_reference() [2/2]

struct stream * dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::sync_reference ( uint32_t sync_reference)
inlineinherited

the n-th stream qualifying as sync reference, and the twin below the index of a given one - the two directions of the preference's value

◆ try_conclude()

bool dx::object::try_conclude ( )
inlinenoexceptinherited

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

◆ try_launch()

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

◆ wake()

Member Data Documentation

◆ bus

dx::stream::bus::bus dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::bus
inherited

the bus this device hangs on

◆ clients

◆ clock

struct dx::stream::desc::clock dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::clock[1]
inherited

◆ clocks

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::clocks
inherited

number of independent clocks [currenlty only single clock support]

◆ clocksource

◆ dflt

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::dflt
inherited

can be selected as default (OS audio) device

◆ driver

dx::driver<decltype(id), cf::preference>& dx::device< ::AudioObjectID, cf::preference >::driver
inherited

◆ editable

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::editable
inherited

can be edited

◆ firmware

struct dx::stream::desc::firmware dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::firmware
inherited

◆ group

std::map<decltype(dx::virtuel::stream::desc::stream::group), coreaudio::group> dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > >, group< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > >::group
inherited

streaming groups by desc::stream::group id: every stream of this device is registered with its group - behind the settings its groups listen to, so they go first

◆ hidden

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::hidden
inherited

hide device

◆ hosted

bool dx::coreaudio::device< dx::virtuel::stream::desc, cf::preference, stream, coreaudio::group, false >::hosted
staticconstexprinherited

◆ hw

◆ icon

◆ id

◆ io_streams

the streams process() iterates: fixed between AudioDeviceStart and AudioDeviceStop and held for it, so the IOProc never touches the mutable streams map nor a stream its client let go

◆ iosize

◆ iosize_server

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
decltype(super::iosize) ::chain dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::iosize_server
protected
Initial value:
{
[this](decltype(super::iosize)::lock_t&& lock, uint32_t value, uint32_t current){
typename decltype(super::iosize)::lock_t tmp(std::move(lock));
if(this->iosize.transient){
coreaudio::property{this->id, {.mSelector= ::kAudioDevicePropertyBufferFrameSize}}=
this->iosize.align(value, this->iosize.initialized? current:
this->iosize.value(this->iosize.backing_store(this->iosize.preference_value(this->iosize.dflt()))));
}
value= coreaudio::property{this->id, {.mSelector= ::kAudioDevicePropertyBufferFrameSize}};
this->clock[0].defaults.safety_offset[dx::stream::role::client][dx::stream::direction::out]=
this->clock[0].defaults.safety_offset[dx::stream::role::client][dx::stream::direction::in]= std::max(value* 2, 32u);
iosize_server.server(std::move(tmp), value, current);
}}
coreaudio::property
Definition dx_coreaudio_property.h:100
promoted< uint32_t >::preference< decltype(super::preference)> iosize
Definition dx_stream_device.h:191
@ in
Definition dx_stream.h:323
@ out
Definition dx_stream.h:323
@ client
Definition dx_stream.h:319
unsigned int uint32_t
Definition wdk/dxd_platform.h:117

iosize_server The iosize is handled by CoreAudio - not the CoreAudio server plugin hence the coreaudio::stream::device is responsible to align and store

◆ launched

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

◆ model

struct dx::stream::desc::name_id dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::model
inherited

◆ monitor

◆ persistence

bool dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::persistence
inherited

device has capability to store persistent settings (i.e. sample rate; clock source; etc.)

◆ preference

cf::preference dx::device< ::AudioObjectID, cf::preference >::preference
inherited

◆ puid

std::string dx::device< ::AudioObjectID, cf::preference >::puid
inherited

persistent UID - system unique - could change with location

◆ puuid

std::string dx::device< ::AudioObjectID, cf::preference >::puuid
inherited

persistent universal UID - universally unique ID (i.e. serial number)

◆ samplerate

◆ samplerate_cache

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
std::atomic<double> dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::samplerate_cache {this->samplerate}
protected

process() (the real-time IOProc callback) must never block on super::samplerate's promoted<> mutex - a concurrent samplerate change can need this same thread to reach a safe point first. Read once off the real-time thread, kept current via a listener.

◆ samplerate_listener

template<typename desc_t = dx::virtuel::stream::desc, typename preference_t = cf::preference, template< typename ... > typename stream_t = stream, template< typename ... > typename group_t = coreaudio::group>
listener<dx::listen<std::function<void(const double&)> > > dx::coreaudio::stream::device< desc_t, preference_t, stream_t, group_t >::samplerate_listener
protected
Initial value:
{
this->samplerate.listen, {[this](const double& value){samplerate_cache= value;}}}
promoted::property<::Float64 > samplerate
Definition dx_coreaudio_device.h:127
std::atomic< double > samplerate_cache
Definition dx_coreaudio_stream_device.h:103

◆ sources

std::map<decltype(dx::virtuel::stream::desc::stream::target.idx()), source_t> dx::stream::device< dx::device<::AudioObjectID, cf::preference >, dx::virtuel::stream::desc, dx::stream::stream< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > >, group< device< dx::virtuel::stream::desc, cf::preference, dx::stream::stream, group, false > > >::sources
inherited

source selectors by stream target: a stream with sources gets its own on first use

◆ start_stop_order

direction::direction dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::start_stop_order
inherited

◆ stream

struct dx::stream::desc::stream dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::stream[max_streams]
inherited

◆ streams

uint32_t dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::streams
inherited

number of streams

◆ sync_reference

◆ vendor

struct dx::stream::desc::name_id dx::stream::desc< target, max_streams, max_pins, 1, 1, 1, 1 >::vendor
inherited

◆ version


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

(c) copyright 2009 dynamic acoustics e.U. generated on

a closed source license may be obtained by requesting a written permission from dynamic acoustics e.U.
however - governmental use generally and military use especially is strictly prohibited though.