13NativeDeviceImpl::NativeDeviceImpl (
const String &aseid, AudioProcessor::StaticInfo static_info, AudioProcessorP aproc) :
 
   14  proc_ (aproc), combo_ (
std::
dynamic_pointer_cast<AudioCombo> (aproc)), info_ (extract_info (aseid, static_info))
 
   22  DeviceImpl::serialize (xs);
 
   25    for (DeviceP subdevicep : list_devices())
 
   29        String uri = subdevicep->device_info().uri;
 
   30        xc.front (
"Device.URI") & uri;
 
   34    for (
auto &xc : xs[
"devices"].
to_nodes())
 
   36        String uri = xc[
"Device.URI"].as_string();
 
   39        auto load_subdevice = [&xc] (DeviceP subdevicep) {
 
   42        DeviceP subdevicep = insert_device (uri, 
nullptr, load_subdevice);
 
 
   47NativeDeviceImpl::access_properties ()
 
   49  return proc_->access_properties();
 
 
   53NativeDeviceImpl::_set_event_source (AudioProcessorP esource)
 
   57  AudioComboP combo = combo_;
 
   59  auto j = [combo, esource] () {
 
   60    combo->set_event_source (esource);
 
   62  proc_->engine().async_jobs += j;
 
   66NativeDeviceImpl::remove_all_devices()
 
   68  while (children_.size())
 
   69    remove_device (*children_.back());
 
   76  DeviceImpl::_set_parent (parent);
 
 
   80NativeDeviceImpl::_activate ()
 
   83  DeviceImpl::_activate();
 
   84  for (
auto &child : children_)
 
 
   89NativeDeviceImpl::_deactivate ()
 
   92  for (
auto childit = children_.rbegin(); childit != children_.rend(); ++childit)
 
   93    (*childit)->_deactivate();
 
   94  DeviceImpl::_deactivate();
 
 
  100  for (
size_t i = 0; i < v.size(); i++)
 
  107NativeDeviceImpl::remove_device (
Device &sub)
 
  109  NativeDeviceP selfp = shared_ptr_cast<NativeDevice> (
this);
 
  112  auto [subp, nth] = find_shared_by_ref (children_, sub);
 
  113  DeviceP childp = subp;
 
  115  children_.erase (children_.begin() + nth);
 
  116  AudioProcessorP sproc = childp->_audio_processor();
 
  119      auto deferred_unparent = [selfp, childp] (
void*) {
 
  120        childp->_set_parent (
nullptr); 
 
  123      AudioComboP combop = combo_;
 
  124      auto j = [combop, sproc, atjobdtor] () {
 
  125        combop->remove (*sproc);
 
  127      proc_->engine().async_jobs += j;
 
 
  134NativeDeviceImpl::insert_device (
const String &uri, 
Device *sibling, 
const DeviceFunc &loader)
 
  140      devicep = create_processor_device (proc_->engine(), uri, 
false);
 
  142      const ssize_t cpos = Aux::index_of (children_, [sibling] (
const DeviceP &d) { 
return sibling == d.get(); });
 
  143      children_.insert (cpos < 0 ? children_.end() : children_.begin() + cpos, devicep);
 
  144      devicep->_set_parent (
this);
 
  147      AudioProcessorP sproc = devicep->_audio_processor();
 
  150        devicep->_activate();
 
  151      AudioComboP combo = combo_;
 
  152      auto j = [combo, sproc, siblingp, cpos] () {
 
  153        const size_t pos = siblingp ? combo->find_pos (*siblingp) : ~size_t (0);
 
  154        combo->insert (sproc, pos);
 
  157      proc_->engine().async_jobs += j;
 
  164NativeDeviceImpl::append_device (
const String &uri)
 
  166  return insert_device (uri, 
nullptr, 
nullptr);
 
 
  172  return insert_device (uri, &sibling, 
nullptr);
 
 
  176NativeDeviceImpl::_disconnect_remove ()
 
  178  AudioProcessorP proc = proc_;
 
  181    proc->enable_engine_output (
false);
 
  182    proc->disconnect_ibuses();
 
  183    proc->disconnect_obuses();
 
  184    proc->disconnect_event_input();
 
  188  remove_all_devices();
 
 
  194  auto make_device = [] (
const String &aseid, AudioProcessor::StaticInfo static_info, AudioProcessorP aproc) -> NativeDeviceP {
 
  195    return NativeDeviceImpl::make_shared (aseid, static_info, aproc);
 
  197  DeviceP devicep = AudioProcessor::registry_create (aseid, engine, make_device);
 
  198  return_unless (devicep && devicep->_audio_processor(), 
nullptr);
 
  204NativeDevice::list_device_types ()
 
  207  AudioProcessor::registry_foreach ([&iseq] (
const String &aseid, AudioProcessor::StaticInfo static_info) {
 
  219      iseq.push_back (info);
 
  221  for (
const DeviceInfo &info : ClapDeviceImpl::list_clap_plugins())
 
  222    iseq.push_back (info);
 
 
  227create_processor_device (
AudioEngine &engine, 
const String &uri, 
bool engineproducer)
 
  230  if (string_startswith (uri, 
"CLAP:"))
 
  231    devicep = ClapDeviceImpl::create_clap_device (engine, uri);
 
  235        using NativeDeviceImpl::create_native_device;
 
  237      devicep = NativeDeviceImpl2::create_native_device (engine, uri);
 
  240  AudioProcessorP procp = devicep->_audio_processor();
 
  242    auto j = [procp,engineproducer] () {
 
  243      procp->enable_engine_output (engineproducer);
 
JobQueue async_jobs
Executed asynchronously, may modify AudioProcessor objects.
 
Interface to access Device instances.
 
virtual AudioProcessorP _audio_processor() const =0
Retrieve the corresponding AudioProcessor.
 
Base type for classes that have a Property.
 
virtual GadgetImpl * _parent() const =0
Retrieve parent container.
 
Interface for serializable objects with Reflink support.
 
One entry in a Writ serialization document.
 
WritNode push()
Append new WritNode for serializing arrays during in_save().
 
bool in_load() const
Return true during deserialization.
 
bool in_save() const
Return true during serialization.
 
WritNodeS to_nodes()
Create std::vector<WritNode> for serialized arrays during in_load().
 
#define assert_return(expr,...)
Return from the current function if expr is unmet and issue an assertion warning.
 
#define return_unless(cond,...)
Return silently if cond does not evaluate to true with return value ...
 
#define assert_warn(expr)
Issue an assertion warning if expr evaluates to false.
 
The Anklang C++ API namespace.
 
CString website_url
Website of/about this AudioProcessor.
 
String creator_name
Name of the creator.
 
String name
Preferred user interface name.
 
String creator_url
Internet contact of the creator.
 
String uri
Unique identifier for de-/serialization.
 
CString description
Elaborate description for help dialogs.
 
CString creator_url
Internet contact of the creator.
 
String description
Elaborate description for help dialogs.
 
CString creator_name
Name of the creator.
 
CString label
Preferred user interface name.
 
std::string String
Convenience alias for std::string.
 
String category
Category to allow grouping for processors of similar function.
 
CString category
Category to allow grouping for processors of similar function.
 
String website_url
Website of/about this Processor.
 
Detailed information and common properties of AudioProcessor subclasses.
 
T dynamic_pointer_cast(T... args)