diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-02 17:31:09 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2009-11-02 17:31:09 +0000 |
commit | ad25b455372bb58df9caad6903b462b0905ae4ab (patch) | |
tree | a1566d3b69607506d4b460a63ef3a8269e204a59 | |
parent | 2ec80665eab5f861dc494d3df6f30a5ad6603309 (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.h | 20 | ||||
-rw-r--r-- | libs/ardour/audio_unit.cc | 96 |
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 { |