diff options
Diffstat (limited to 'libs/ardour/audio_unit.cc')
-rw-r--r-- | libs/ardour/audio_unit.cc | 104 |
1 files changed, 100 insertions, 4 deletions
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc index 74c9c23505..2e38f86be1 100644 --- a/libs/ardour/audio_unit.cc +++ b/libs/ardour/audio_unit.cc @@ -395,6 +395,23 @@ AUPlugin::_set_block_size (nframes_t nframes) int32_t AUPlugin::can_support_input_configuration (int32_t in) { +#ifdef NEWSTUFF + CAChannelHelper ch_in; + CAChannelHelper ch_out; + + ch_in.nNumEls = input_elements; + + for (uint32_t n = 0; n < input_elements; ++n) { + ch_in.mChans[n] = in; + } + + /* don't check output */ + + ch_out.nNumEls = 0; + + return unit->CanDo (ch_in, ch_out); + +#endif streamFormat.mChannelsPerFrame = in; /* apple says that for non-interleaved data, these values always refer to a single channel. @@ -834,11 +851,21 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip info->type = ARDOUR::AudioUnit; info->unique_id = stringify_descriptor (*info->descriptor); - - /* mark the plugin as having flexible i/o */ - info->n_inputs = -1; - info->n_outputs = -1; + AUPluginCachedInfo cinfo; + + if (cached_io_configuration (info->unique_id(), *info->descriptor, cinfo)) { + + info->n_inputs = cinfo->in; + info->n_outputs = cinfo->out; + + } else { + + /* mark the plugin as having flexible i/o */ + + info->n_inputs = -1; + info->n_outputs = -1; + } plugs.push_back (info); @@ -846,6 +873,75 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip } } +bool +AUPluginInfo::cached_io_configuration (std::string unique_id, CAComponentDescriptor& descriptor, AUPluginCachedInfo& cinfo) +{ + CachedInfoMap::iterator cim = cached_info.find (unique_id); + + if (cim != cached_info.end()) { + cinfo = *cim; + return true; + } + + CAComponent comp (descriptor); + CAAudioUnit unit (comp); + AUChannelInfo* channel_info; + uint32_t cnt; + int ret; + + + if ((ret = unit.GetChannelInfo (&channel_info, cnt)) < 0) { + return false; + } + + if (ret > 0) { + /* no explicit info available */ + + cinfo.io_configs.push_back (pair<int,int> (-1, -1)); + + } else { + + /* store each configuration */ + + for (uint32_t n = 0; n < cnt; ++n) { + cinfo.io_configs.push_back (pair<int,int> (channel_info[n].inChannels, + channel_info[n].outChannels)); + } + + free (channel_info); + } + + + add_cached_info (unique_id, cinfo); + save_cached_info (); + + return true; +} + +void +AUPluginInfo::add_cached_info (std::string id, AUPluginCachedInfo& cinfo) +{ + cached_info[id] = cinfo; +} + +void +AUPluginInfo::save_cached_info () +{ + for (map<string,AUPluginCachedInfo>::iterator i = cached_info.begin(); i != cached_info.end(); ++i) { + cerr << i->first << ' '; + for (vector<pair<int, int> >::iterator j = i->second.io_configs.begin(); j != i->second.io_configs.end(); ++j) { + cerr << j->first << ' ' << j->second; + } + cerr << endl; + } +} + +void +AUPluginInfo::load_cached_info () +{ + +} + void AUPluginInfo::get_names (CAComponentDescription& comp_desc, std::string& name, Glib::ustring& maker) { |