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)