initial unfinished support for AU host callbacks (tempo, musical time, transport...
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 2 Nov 2009 17:31:09 +0000 (17:31 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 2 Nov 2009 17:31:09 +0000 (17:31 +0000)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6001 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/audio_unit.h
libs/ardour/audio_unit.cc

index ec9c82a6630bf6759c32412b028706c87b4f1f83..f3c21cce786dd1d9215332d29b4257fde0f67471 100644 (file)
@@ -115,6 +115,24 @@ class AUPlugin : public ARDOUR::Plugin
                                 UInt32       inBusNumber,
                                 UInt32       inNumberFrames,
                                 AudioBufferList*       ioData);
+
+       /* "host" callbacks */
+
+       OSStatus get_beat_and_tempo_callback (Float64* outCurrentBeat, 
+                                             Float64* outCurrentTempo);
+
+       OSStatus get_musical_time_location_callback (UInt32*  outDeltaSampleOffsetToNextBeat,
+                                                    Float32*  outTimeSig_Numerator,
+                                                    UInt32*   outTimeSig_Denominator,
+                                                    Float64*  outCurrentMeasureDownBeat);
+
+       OSStatus get_transport_state_callback (Boolean*  outIsPlaying,
+                                              Boolean*  outTransportStateChanged,
+                                              Float64*  outCurrentSampleInTimeLine,
+                                              Boolean*  outIsCycling,
+                                              Float64*  outCycleStartBeat,
+                                              Float64*  outCycleEndBeat);
+
   private:
         boost::shared_ptr<CAComponent> comp;
         boost::shared_ptr<CAAudioUnit> unit;
@@ -197,7 +215,7 @@ class AUPluginInfo : public PluginInfo {
        
        static bool cached_io_configuration (const std::string&, UInt32, CAComponent&, AUPluginCachedInfo&, const std::string& name);
        static void add_cached_info (const std::string&, AUPluginCachedInfo&);
-       static void save_cached_info ();
+       static void save_cached_info ();        
 };
 
 typedef boost::shared_ptr<AUPluginInfo> AUPluginInfoPtr;
index 510260406682329073b568f1d90e74b4eb74db97..33600f6acd6bb6fb3a1744eac8a85208c4d62e3f 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2006 Paul Davis 
+    Copyright (C) 2006-2009 Paul Davis 
        
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -71,9 +71,58 @@ _render_callback(void *userData,
                 UInt32       inNumberFrames,
                 AudioBufferList*       ioData)
 {
-       return ((AUPlugin*)userData)->render_callback (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
+       if (userData) {
+               return ((AUPlugin*)userData)->render_callback (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
+       }
+       return paramErr;
+}
+
+static OSStatus 
+_get_beat_and_tempo_callback (void*                userData,
+                             Float64*             outCurrentBeat, 
+                             Float64*             outCurrentTempo)
+{
+       if (userData) {
+               return ((AUPlugin*)userData)->get_beat_and_tempo_callback (outCurrentBeat, outCurrentTempo);
+       }
+    
+       return paramErr;
+}
+
+static OSStatus 
+_get_musical_time_location_callback (void *     userData,
+                                    UInt32 *   outDeltaSampleOffsetToNextBeat,
+                                    Float32 *  outTimeSig_Numerator,
+                                    UInt32 *   outTimeSig_Denominator,
+                                    Float64 *  outCurrentMeasureDownBeat)
+{
+       if (userData) {
+               return ((AUPlugin*)userData)->get_musical_time_location_callback (outDeltaSampleOffsetToNextBeat,
+                                                                                 outTimeSig_Numerator,
+                                                                                 outTimeSig_Denominator,
+                                                                                 outCurrentMeasureDownBeat);
+       }
+       return paramErr;
+}
+
+static OSStatus 
+_get_transport_state_callback (void*     userData,
+                              Boolean*  outIsPlaying,
+                              Boolean*  outTransportStateChanged,
+                              Float64*  outCurrentSampleInTimeLine,
+                              Boolean*  outIsCycling,
+                              Float64*  outCycleStartBeat,
+                              Float64*  outCycleEndBeat)
+{
+       if (userData) {
+               return ((AUPlugin*)userData)->get_transport_state_callback (outIsPlaying, outTransportStateChanged,
+                                                                           outCurrentSampleInTimeLine, outIsCycling,
+                                                                           outCycleStartBeat, outCycleEndBeat);
+       }
+       return paramErr;
 }
 
+
 static int 
 save_property_list (CFPropertyListRef propertyList, Glib::ustring path)
 
@@ -386,6 +435,22 @@ AUPlugin::init ()
                throw failed_constructor();
        }
 
+       /* tell the plugin about tempo/meter/transport callbacks in case it wants them */
+
+       HostCallbackInfo info;
+       memset (&info, 0, sizeof (HostCallbackInfo));
+       info.hostUserData = this;
+       info.beatAndTempoProc = _get_beat_and_tempo_callback;
+       info.musicalTimeLocationProc = _get_musical_time_location_callback;
+       info.transportStateProc = _get_transport_state_callback;
+       
+        //ignore result of this - don't care if the property isn't supported
+       unit->SetProperty (kAudioUnitProperty_HostCallbacks, 
+                          kAudioUnitScope_Global, 
+                          0, //elementID 
+                          &info,
+                          sizeof (HostCallbackInfo));
+
        unit->GetElementCount (kAudioUnitScope_Global, global_elements);
        unit->GetElementCount (kAudioUnitScope_Input, input_elements);
        unit->GetElementCount (kAudioUnitScope_Output, output_elements);
@@ -971,6 +1036,33 @@ AUPlugin::connect_and_run (vector<Sample*>& bufs, uint32_t maxbuf, int32_t& in,
        return -1;
 }
 
+OSStatus 
+AUPlugin::get_beat_and_tempo_callback (Float64* outCurrentBeat, 
+                                      Float64* outCurrentTempo)
+{
+       return kAudioUnitErr_CannotDoInCurrentContext;
+}
+
+OSStatus 
+AUPlugin::get_musical_time_location_callback (UInt32*  outDeltaSampleOffsetToNextBeat,
+                                            Float32*  outTimeSig_Numerator,
+                                            UInt32*   outTimeSig_Denominator,
+                                            Float64*  outCurrentMeasureDownBeat)
+{
+       return kAudioUnitErr_CannotDoInCurrentContext;
+}
+
+OSStatus 
+AUPlugin::get_transport_state_callback (Boolean*  outIsPlaying,
+                                       Boolean*  outTransportStateChanged,
+                                       Float64*  outCurrentSampleInTimeLine,
+                                       Boolean*  outIsCycling,
+                                       Float64*  outCycleStartBeat,
+                                       Float64*  outCycleEndBeat)
+{
+       return kAudioUnitErr_CannotDoInCurrentContext;
+}
+
 set<uint32_t>
 AUPlugin::automatable() const
 {