summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-11-02 17:31:09 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-11-02 17:31:09 +0000
commitad25b455372bb58df9caad6903b462b0905ae4ab (patch)
treea1566d3b69607506d4b460a63ef3a8269e204a59
parent2ec80665eab5f861dc494d3df6f30a5ad6603309 (diff)
initial unfinished support for AU host callbacks (tempo, musical time, transport state)
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@6001 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--libs/ardour/ardour/audio_unit.h20
-rw-r--r--libs/ardour/audio_unit.cc96
2 files changed, 113 insertions, 3 deletions
diff --git a/libs/ardour/ardour/audio_unit.h b/libs/ardour/ardour/audio_unit.h
index ec9c82a663..f3c21cce78 100644
--- a/libs/ardour/ardour/audio_unit.h
+++ b/libs/ardour/ardour/audio_unit.h
@@ -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;
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 5102604066..33600f6acd 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -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
{