mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-21 04:45:58 +01:00
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
This commit is contained in:
parent
2ec80665ea
commit
ad25b45537
2 changed files with 113 additions and 3 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue