Fix AU preset handling
[ardour.git] / libs / ardour / audio_unit.cc
index 74b2591df92c7da071d8f13ae356093390b9303d..0b68c95dcedcc85089b2ff3b15ad44d86b983d4e 100644 (file)
 #include <glibmm/miscutils.h>
 
 #include "ardour/ardour.h"
+#include "ardour/audio_unit.h"
 #include "ardour/audioengine.h"
 #include "ardour/audio_buffer.h"
 #include "ardour/debug.h"
-#include "ardour/midi_buffer.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/io.h"
-#include "ardour/audio_unit.h"
+#include "ardour/midi_buffer.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
 #include "ardour/tempo.h"
@@ -487,6 +487,7 @@ AUPlugin::AUPlugin (const AUPlugin& other)
        , input_buffers (0)
        , input_map (0)
        , samples_processed (0)
+       , audio_input_cnt (0)
        , _parameter_listener (0)
        , _parameter_listener_arg (0)
        , transport_sample (0)
@@ -738,7 +739,7 @@ AUPlugin::discover_parameters ()
                          kAudioUnitParameterUnit_Boolean             = 2
                          kAudioUnitParameterUnit_Percent             = 3
                          kAudioUnitParameterUnit_Seconds             = 4
-                         kAudioUnitParameterUnit_SampleSamples        = 5
+                         kAudioUnitParameterUnit_SampleFrames        = 5
                          kAudioUnitParameterUnit_Phase               = 6
                          kAudioUnitParameterUnit_Rate                = 7
                          kAudioUnitParameterUnit_Hertz               = 8
@@ -787,7 +788,7 @@ AUPlugin::discover_parameters ()
                        d.integer_step = (info.unit == kAudioUnitParameterUnit_Indexed);
                        d.toggled = (info.unit == kAudioUnitParameterUnit_Boolean) ||
                                (d.integer_step && ((d.upper - d.lower) == 1.0));
-                       d.sr_dependent = (info.unit == kAudioUnitParameterUnit_SampleSamples);
+                       d.sr_dependent = (info.unit == kAudioUnitParameterUnit_SampleFrames);
                        d.automatable = /* !d.toggled && -- ardour can automate toggles, can AU ? */
                                !(info.flags & kAudioUnitParameterFlag_NonRealTime) &&
                                (info.flags & kAudioUnitParameterFlag_IsWritable);
@@ -1074,8 +1075,8 @@ AUPlugin::set_block_size (pframes_t nframes)
                deactivate ();
        }
 
-       DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set MaximumSamplesPerSlice in global scope to %1\n", numSamples));
-       if ((err = unit->SetProperty (kAudioUnitProperty_MaximumSamplesPerSlice, kAudioUnitScope_Global,
+       DEBUG_TRACE (DEBUG::AudioUnits, string_compose ("set MaximumFramesPerSlice in global scope to %1\n", numSamples));
+       if ((err = unit->SetProperty (kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global,
                                      0, &numSamples, sizeof (numSamples))) != noErr) {
                error << string_compose (_("AU: cannot set max samples (err = %1)"), err) << endmsg;
                return -1;
@@ -1121,7 +1122,7 @@ AUPlugin::configure_io (ChanCount in, ChanCount out)
 #endif
 
        streamFormat.mBitsPerChannel = 32;
-       streamFormat.mSamplesPerPacket = 1;
+       streamFormat.mFramesPerPacket = 1;
 
        /* apple says that for non-interleaved data, these
         * values always refer to a single channel.
@@ -1269,7 +1270,7 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
                for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
                        int32_t possible_in = i->first;
                        int32_t possible_out = i->second;
-                       if (possible_in < 1 || possible_out < 1) {
+                       if (possible_in < 0) {
                                continue;
                        }
                        for (uint32_t i = 1; i < input_elements; ++i) {
@@ -1278,6 +1279,11 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
                                // on the 2nd bus.
                                io_configs.push_back (pair<int,int> (possible_in + bus_inputs[i], possible_out));
                        }
+                       /* only add additional, optional busses to first available config.
+                        * AUPluginInfo::cached_io_configuration () already incrementally
+                        * adds busses (for instruments w/ multiple configurations)
+                        */
+                       break;
                }
        }
 
@@ -1286,7 +1292,7 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
                for (vector<pair<int,int> >::const_iterator i = ioc.begin(); i != ioc.end(); ++i) {
                        int32_t possible_in = i->first;
                        int32_t possible_out = i->second;
-                       if (possible_in < 1 || possible_out < 1) {
+                       if (possible_out < 0) {
                                continue;
                        }
                        for (uint32_t i = 1; i < output_elements; ++i) {
@@ -1296,6 +1302,11 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
                                }
                                io_configs.push_back (pair<int,int> (possible_in, possible_out + c));
                        }
+                       /* only add additional, optional busses to first available config.
+                        * AUPluginInfo::cached_io_configuration () already incrementally
+                        * adds busses (for instruments w/ multiple configurations)
+                        */
+                       break;
                }
        }
 
@@ -1628,7 +1639,7 @@ AUPlugin::render_callback(AudioUnitRenderActionFlags*,
 int
 AUPlugin::connect_and_run (BufferSet& bufs,
                samplepos_t start, samplepos_t end, double speed,
-               ChanMapping in_map, ChanMapping out_map,
+               ChanMapping const& in_map, ChanMapping const& out_map,
                pframes_t nframes, samplecnt_t offset)
 {
        Plugin::connect_and_run(bufs, start, end, speed, in_map, out_map, nframes, offset);
@@ -2268,7 +2279,7 @@ AUPlugin::do_save_preset (string preset_name)
 
        DEBUG_TRACE (DEBUG::AudioUnits, string_compose("AU Saving Preset to %1\n", user_preset_path));
 
-       return string ("file:///") + user_preset_path;
+       return user_preset_path;
 }
 
 //-----------------------------------------------------------------------------
@@ -2906,14 +2917,14 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
                        continue;
 
                case kAudioUnitType_Output:
-                       info->category = _("AudioUnit Output");
+                       info->category = _("Output");
                        break;
                case kAudioUnitType_MusicDevice:
                        info->category = _("Instrument");
                        has_midi_in = true;
                        break;
                case kAudioUnitType_MusicEffect:
-                       info->category = _("Music Effect");
+                       info->category = _("Effect");
                        has_midi_in = true;
                        break;
                case kAudioUnitType_Effect:
@@ -2926,7 +2937,7 @@ AUPluginInfo::discover_by_description (PluginInfoList& plugs, CAComponentDescrip
                        info->category = _("Generator");
                        break;
                default:
-                       info->category = _("AudioUnit (Unknown)");
+                       info->category = _("(Unknown)");
                        break;
                }
 
@@ -3300,6 +3311,13 @@ AUPluginInfo::is_instrument () const
        return descriptor->IsMusicDevice();
 }
 
+bool
+AUPluginInfo::is_utility () const
+{
+       return (descriptor->IsGenerator() || descriptor->componentType == 'aumi');
+       // kAudioUnitType_MidiProcessor  ..looks like we aren't even scanning for these yet?
+}
+
 void
 AUPlugin::set_info (PluginInfoPtr info)
 {