Commit read-only stack security fix for 64bit processors.
[ardour.git] / libs / ardour / audio_unit.cc
index 0756f55a5912c5639839fcdfb3863788afc641ea..6879123ff1a24398d14a89293b49bdd36361af20 100644 (file)
@@ -64,6 +64,14 @@ AUPlugin::~AUPlugin ()
        if (comp) {
                delete comp;
        }
+       
+       if (in_list) {
+               delete in_list;
+       }
+       
+       if (out_list) {
+               delete out_list;
+       }
 }
 
 AUPluginInfo::~AUPluginInfo ()
@@ -82,13 +90,13 @@ AUPlugin::unique_id () const
 const char *
 AUPlugin::label () const
 {
-       return "";
+       return "AUPlugin label";
 }
 
 const char *
 AUPlugin::maker () const
 {
-       return "";
+       return "AUplugin maker";
 }
 
 uint32_t
@@ -100,31 +108,36 @@ AUPlugin::parameter_count () const
 float
 AUPlugin::default_value (uint32_t port)
 {
-       return 0.0;
+       // AudioUnits don't have default values.  Maybe presets though?
+       return 0;
 }
 
-jack_nframes_t
+nframes_t
 AUPlugin::latency () const
 {
-       return 0;
+       return unit->Latency ();
 }
 
 void
 AUPlugin::set_parameter (uint32_t which, float val)
 {
-       
+       unit->SetParameter (parameter_map[which].first, parameter_map[which].second, 0, val);
 }
 
 float
 AUPlugin::get_parameter (uint32_t which) const
 {
-       return 0.0;
+       float outValue = 0.0;
+       
+       unit->GetParameter(parameter_map[which].first, parameter_map[which].second, 0, outValue);
+       
+       return outValue;
 }
 
 int
 AUPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor&) const
 {
-       return -1;
+       return 0;
 }
 
 uint32_t
@@ -136,25 +149,37 @@ AUPlugin::nth_parameter (uint32_t which, bool& ok) const
 void
 AUPlugin::activate ()
 {
-       
+       unit->GlobalReset ();
 }
 
 void
 AUPlugin::deactivate ()
 {
-       
+       // not needed.  GlobalReset () takes care of it.
 }
 
 void
-AUPlugin::set_block_size (jack_nframes_t nframes)
+AUPlugin::set_block_size (nframes_t nframes)
 {
        
 }
 
 int
-AUPlugin::connect_and_run (vector<Sample*>& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, jack_nframes_t nframes, jack_nframes_t offset)
+AUPlugin::connect_and_run (vector<Sample*>& bufs, uint32_t maxbuf, int32_t& in, int32_t& out, nframes_t nframes, nframes_t offset)
 {
-       return -1;
+       AudioUnitRenderActionFlags flags = 0;
+       AudioTimeStamp ts;
+       
+       AudioBufferList abl;
+       abl.mNumberBuffers = 1;
+       abl.mBuffers[0].mNumberChannels = 1;
+       abl.mBuffers[0].mDataByteSize = nframes * sizeof(Sample);
+       abl.mBuffers[0].mData = &bufs[0];
+       
+       
+       unit->Render (&flags, &ts, 0, 0, &abl);
+       
+       return 0;
 }
 
 set<uint32_t>
@@ -165,18 +190,6 @@ AUPlugin::automatable() const
        return automates;
 }
 
-void
-AUPlugin::store_state (ARDOUR::PluginState&)
-{
-       
-}
-
-void
-AUPlugin::restore_state (ARDOUR::PluginState&)
-{
-       
-}
-
 string
 AUPlugin::describe_parameter (uint32_t)
 {
@@ -281,40 +294,32 @@ AUPluginInfo::discover ()
 {
        PluginInfoList plugs;
 
-       int numTypes = 2;    // this magic number was retrieved from the apple AUHost example.
-
        CAComponentDescription desc;
        desc.componentFlags = 0;
        desc.componentFlagsMask = 0;
        desc.componentSubType = 0;
        desc.componentManufacturer = 0;
+       desc.componentType = kAudioUnitType_Effect;
 
-       for (int i = 0; i < numTypes; ++i) {
-               if (i == 1) {
-                       desc.componentType = kAudioUnitType_MusicEffect;
-               } else {
-                       desc.componentType = kAudioUnitType_Effect;
-               }
+       Component comp = 0;
 
-               Component comp = 0;
-
-               comp = FindNextComponent (NULL, &desc);
-               while (comp != NULL) {
-                       CAComponentDescription temp;
-                       GetComponentInfo (comp, &temp, NULL, NULL, NULL);
-                       
-                       AUPluginInfoPtr plug(new AUPluginInfo);
-                       plug->name = AUPluginInfo::get_name (temp);
-                       plug->type = PluginInfo::AudioUnit;
-                       plug->n_inputs = 0;
-                       plug->n_outputs = 0;
-                       plug->category = "AudioUnit";
-                       plug->desc = new CAComponentDescription(temp);
-
-                       plugs.push_back(plug);
-                       
-                       comp = FindNextComponent (comp, &desc);
-               }
+       comp = FindNextComponent (NULL, &desc);
+       while (comp != NULL) {
+               CAComponentDescription temp;
+               GetComponentInfo (comp, &temp, NULL, NULL, NULL);
+               
+               AUPluginInfoPtr plug(new AUPluginInfo);
+               plug->name = AUPluginInfo::get_name (temp);
+               plug->type = ARDOUR::AudioUnit;
+               plug->n_inputs = 0;
+               plug->n_outputs = 0;
+               // plug->setup_nchannels (temp);
+               plug->category = "AudioUnit";
+               plug->desc = new CAComponentDescription(temp);
+
+               plugs.push_back(plug);
+               
+               comp = FindNextComponent (comp, &desc);
        }
 
        return plugs;
@@ -360,3 +365,21 @@ AUPluginInfo::get_name (CAComponentDescription& comp_desc)
        
        return CFStringRefToStdString(itemName);
 }
+
+void
+AUPluginInfo::setup_nchannels (CAComponentDescription& comp_desc)
+{
+       CAAudioUnit unit;
+       
+       CAAudioUnit::Open (comp_desc, unit);
+       
+       if (unit.SupportsNumChannels()) {
+               n_inputs = n_outputs = 0;
+       } else {
+               AUChannelInfo cinfo;
+               size_t info_size = sizeof(cinfo);
+               OSStatus err = AudioUnitGetProperty (unit.AU(), kAudioUnitProperty_SupportedNumChannels, kAudioUnitScope_Global,
+                                             0, &cinfo, &info_size);
+       }
+}
+