bus_outputs = (uint32_t*) calloc (output_elements, sizeof(uint32_t));
for (size_t i = 0; i < output_elements; ++i) {
- AudioUnitReset (unit->AU(), kAudioUnitScope_Output, i);
+ unit->Reset (kAudioUnitScope_Output, i);
AudioStreamBasicDescription fmt;
- UInt32 sz = sizeof(AudioStreamBasicDescription);
- err = AudioUnitGetProperty(unit->AU(), kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, i, &fmt, &sz);
+ err = unit->GetFormat (kAudioUnitScope_Output, i, fmt);
if (err == noErr) {
bus_outputs[i] = fmt.mChannelsPerFrame;
}
CFStringRef name;
- sz = sizeof (CFStringRef);
+ UInt32 sz = sizeof (CFStringRef);
if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Output,
i, &name, &sz) == noErr
&& sz > 0) {
}
for (size_t i = 0; i < input_elements; ++i) {
- AudioUnitReset (unit->AU(), kAudioUnitScope_Input, i);
+ unit->Reset (kAudioUnitScope_Input, i);
AudioStreamBasicDescription fmt;
- UInt32 sz = sizeof(AudioStreamBasicDescription);
- err = AudioUnitGetProperty(unit->AU(), kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, i, &fmt, &sz);
+ err = unit->GetFormat (kAudioUnitScope_Input, i, fmt);
if (err == noErr) {
bus_inputs[i] = fmt.mChannelsPerFrame;
}
CFStringRef name;
- sz = sizeof (CFStringRef);
+ UInt32 sz = sizeof (CFStringRef);
if (AudioUnitGetProperty (unit->AU(), kAudioUnitProperty_ElementName, kAudioUnitScope_Input,
i, &name, &sz) == noErr
&& sz > 0) {
configured_output_busses = 0;
/* reset busses */
for (size_t i = 0; i < output_elements; ++i) {
- AudioUnitReset (unit->AU(), kAudioUnitScope_Output, i);
+ unit->Reset (kAudioUnitScope_Output, i);
}
for (size_t i = 0; i < input_elements; ++i) {
- AudioUnitReset (unit->AU(), kAudioUnitScope_Input, i);
+ unit->Reset (kAudioUnitScope_Input, i);
}
/* now assign the channels to available busses */
uint32_t used_in = 0;
uint32_t used_out = 0;
- if (variable_inputs) {
+ if (variable_inputs || input_elements == 1) {
// we only ever use the first bus
if (input_elements > 1) {
warning << string_compose (_("AU %1 has multiple input busses and variable port count."), name()) << endmsg;
}
}
- if (variable_outputs) {
+ if (variable_outputs || output_elements == 1) {
if (output_elements > 1) {
warning << string_compose (_("AU %1 has multiple output busses and variable port count."), name()) << endmsg;
}
name(), io_configs.size(), in, out));
#if 0
- printf ("AU I/O Configs %s %d\n", name().c_str(), io_configs.size());
+ printf ("AU I/O Configs %s %d\n", name(), io_configs.size());
for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
printf ("- I/O %d / %d\n", i->first, i->second);
}
_output_configs.insert (0);
#define UPTO(nch) { \
- for (int n = 1; n < nch; ++n) { \
+ for (int n = 1; n <= nch; ++n) { \
_output_configs.insert (n); \
} \
}
uint32_t busoff = 0;
uint32_t remain = output_channels;
for (uint32_t bus = 0; remain > 0 && bus < configured_output_busses; ++bus) {
- uint32_t cnt = std::min (remain, bus_outputs[bus]);
+ uint32_t cnt = variable_outputs ? output_channels : std::min (remain, bus_outputs[bus]); // XXX
assert (cnt > 0);
buffers->mNumberBuffers = cnt;
if (pid < bus_inputs[bus]) {
id = pid;
ss << _bus_name_in[bus];
+ ss << " / Bus " << (1 + bus);
break;
}
pid -= bus_inputs[bus];
if (pid < bus_outputs[bus]) {
id = pid;
ss << _bus_name_out[bus];
+ ss << " / Bus " << (1 + bus);
break;
}
pid -= bus_outputs[bus];
if (!Glib::file_test (au_cache_path(), Glib::FILE_TEST_EXISTS)) {
ARDOUR::BootMessage (_("Discovering AudioUnit plugins (could take some time ...)"));
+ // flush RAM cache -- after clear_cache()
+ cached_info.clear();
}
// create crash log file
au_start_crashlog ();
}
if (ret > 0) {
-
- /* no explicit info available, so default to 1in/1out */
-
- /* XXX this is wrong. we should be indicating wildcard values */
-
+ /* AU is expected to deal with same channel valance in and out */
cinfo.io_configs.push_back (pair<int,int> (-1, -1));
-
} else {
- /* store each configuration */
- if (comp.Desc().IsGenerator() || comp.Desc().IsMusicDevice()) {
- // incrementally add busses
+ /* CAAudioUnit::GetChannelInfo silently merges bus formats
+ * check if this was the case and if so, add
+ * bus configs as incremental options.
+ */
+ Boolean* isWritable = 0;
+ UInt32 dataSize = 0;
+ OSStatus result = AudioUnitGetPropertyInfo (unit.AU(),
+ kAudioUnitProperty_SupportedNumChannels,
+ kAudioUnitScope_Global, 0,
+ &dataSize, isWritable);
+ if (result != noErr && (comp.Desc().IsGenerator() || comp.Desc().IsMusicDevice())) {
+ /* incrementally add busses */
int in = 0;
int out = 0;
for (uint32_t n = 0; n < cnt; ++n) {
cinfo.io_configs.push_back (pair<int,int> (in, out));
}
} 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));
return 0;
}
+void
+AUPluginInfo::clear_cache ()
+{
+ const string& fn = au_cache_path();
+ if (Glib::file_test (fn, Glib::FILE_TEST_EXISTS)) {
+ ::g_unlink(fn.c_str());
+ }
+ // keep cached_info in RAM until restart or re-scan
+ cached_info.clear();
+}
+
void
AUPluginInfo::add_cached_info (const std::string& id, AUPluginCachedInfo& cinfo)
{