1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-08 22:23:59 +01:00

Migrating the remaining effects

This brings the builtin, LV2, and VAMP effects inline with the
Audio Units, LADSPA, and VST effects.  All effects now share
a common UI.

This gives all effects (though not implemented for all):

User and factory preset capability
Preset import/export capability
Shared or private configuration options

Builtin effects can now be migrated to RTP, depending on algorithm.
LV2 effects now support graphical interfaces if the plugin supplies one.
Nyquist prompt enhanced to provide some features of the Nyquist Workbench.

It may not look like it, but this was a LOT of work, so trust me, there
WILL be problems and everything effect related should be suspect.  Keep
a sharp eye (or two) open.
This commit is contained in:
Leland Lucius
2015-04-16 22:53:42 -05:00
parent 40e6bcc56a
commit 8fbfa460c4
140 changed files with 17288 additions and 20367 deletions

View File

@@ -160,7 +160,7 @@ bool AudioUnitEffectsModule::RegisterPlugin(PluginManagerInterface & pm, const w
return false;
}
pm.RegisterEffectPlugin(this, &effect);
pm.RegisterPlugin(this, &effect);
return true;
}
@@ -720,63 +720,6 @@ void AudioUnitEffectImportDialog::OnOk(wxCommandEvent & WXUNUSED(evt))
EndModal(wxID_OK);
}
///////////////////////////////////////////////////////////////////////////////
//
// AudioUnitEffectEventHelper
//
///////////////////////////////////////////////////////////////////////////////
class AudioUnitEffectEventHelper : public wxEvtHandler
{
public:
AudioUnitEffectEventHelper(AudioUnitEffect *effect);
virtual ~AudioUnitEffectEventHelper();
// AudioUnitEffectEventHelper implementatino
void OnSize(wxSizeEvent & evt);
private:
AudioUnitEffect *mEffect;
DECLARE_EVENT_TABLE();
};
///////////////////////////////////////////////////////////////////////////////
//
// AudioUnitEffectEventHelper
//
///////////////////////////////////////////////////////////////////////////////
BEGIN_EVENT_TABLE(AudioUnitEffectEventHelper, wxEvtHandler)
EVT_SIZE(AudioUnitEffectEventHelper::OnSize)
END_EVENT_TABLE()
AudioUnitEffectEventHelper::AudioUnitEffectEventHelper(AudioUnitEffect *effect)
{
mEffect = effect;
}
AudioUnitEffectEventHelper::~AudioUnitEffectEventHelper()
{
}
// ============================================================================
// AudioUnitEffectEventHelper implementation
// ============================================================================
void AudioUnitEffectEventHelper::OnSize(wxSizeEvent & evt)
{
HIViewRef viewRef = mEffect->mAUView;
wxWindow *parent = mEffect->mParent;
// The parent panel has been resized, so make the AU the
// same size.
HIRect rect;
HIViewGetFrame((HIViewRef) parent->GetHandle(), &rect);
HIViewSetFrame(viewRef, &rect);
}
///////////////////////////////////////////////////////////////////////////////
//
// AudioUnitEffect
@@ -910,6 +853,10 @@ OSStatus AudioUnitEffect::WindowEventHandler(EventRef eventRef)
return result;
}
BEGIN_EVENT_TABLE(AudioUnitEffect, wxEvtHandler)
EVT_SIZE(AudioUnitEffect::OnSize)
END_EVENT_TABLE()
AudioUnitEffect::AudioUnitEffect(const wxString & path,
const wxString & name,
Component component,
@@ -937,7 +884,6 @@ AudioUnitEffect::AudioUnitEffect(const wxString & path,
mAUTrackingHandlerRef = NULL;
mTrackingHandlerUPP = NULL;
mEventHelper = NULL;
mEventListenerRef = NULL;
}
@@ -1263,7 +1209,7 @@ void AudioUnitEffect::SetSampleRate(sampleCount rate)
mSampleRate = rate;
}
sampleCount AudioUnitEffect::GetBlockSize(sampleCount maxBlockSize)
sampleCount AudioUnitEffect::SetBlockSize(sampleCount maxBlockSize)
{
return mBlockSize;
}
@@ -1310,7 +1256,7 @@ bool AudioUnitEffect::IsReady()
return mReady;
}
bool AudioUnitEffect::ProcessInitialize()
bool AudioUnitEffect::ProcessInitialize(sampleCount WXUNUSED(totalLen), ChannelNames WXUNUSED(chanMap))
{
ComponentResult auResult;
@@ -1389,20 +1335,20 @@ bool AudioUnitEffect::ProcessFinalize()
return true;
}
sampleCount AudioUnitEffect::ProcessBlock(float **inbuf, float **outbuf, sampleCount size)
sampleCount AudioUnitEffect::ProcessBlock(float **inBlock, float **outBlock, sampleCount blockLen)
{
for (int i = 0; i < mAudioIns; i++)
{
mInputList->mBuffers[i].mNumberChannels = 1;
mInputList->mBuffers[i].mData = inbuf[i];
mInputList->mBuffers[i].mDataByteSize = sizeof(float) * size;
mInputList->mBuffers[i].mData = inBlock[i];
mInputList->mBuffers[i].mDataByteSize = sizeof(float) * blockLen;
}
for (int i = 0; i < mAudioOuts; i++)
{
mOutputList->mBuffers[i].mNumberChannels = 1;
mOutputList->mBuffers[i].mData = outbuf[i];
mOutputList->mBuffers[i].mDataByteSize = sizeof(float) * size;
mOutputList->mBuffers[i].mData = outBlock[i];
mOutputList->mBuffers[i].mDataByteSize = sizeof(float) * blockLen;
}
AudioUnitRenderActionFlags flags = 0;
@@ -1412,7 +1358,7 @@ sampleCount AudioUnitEffect::ProcessBlock(float **inbuf, float **outbuf, sampleC
&flags,
&mTimeStamp,
0,
size,
blockLen,
mOutputList);
if (auResult != 0)
{
@@ -1420,9 +1366,9 @@ sampleCount AudioUnitEffect::ProcessBlock(float **inbuf, float **outbuf, sampleC
return 0;
}
mTimeStamp.mSampleTime += size;
mTimeStamp.mSampleTime += blockLen;
return size;
return blockLen;
}
bool AudioUnitEffect::RealtimeInitialize()
@@ -1441,7 +1387,7 @@ bool AudioUnitEffect::RealtimeInitialize()
mMasterOut[i] = new float[mBlockSize];
}
return ProcessInitialize();
return ProcessInitialize(0);
}
bool AudioUnitEffect::RealtimeAddProcessor(int numChannels, float sampleRate)
@@ -1453,7 +1399,7 @@ bool AudioUnitEffect::RealtimeAddProcessor(int numChannels, float sampleRate)
return false;
}
slave->GetBlockSize(mBlockSize);
slave->SetBlockSize(mBlockSize);
slave->SetChannelCount(numChannels);
slave->SetSampleRate(sampleRate);
@@ -1465,7 +1411,7 @@ bool AudioUnitEffect::RealtimeAddProcessor(int numChannels, float sampleRate)
mSlaves.Add(slave);
return slave->ProcessInitialize();
return slave->ProcessInitialize(0);
}
bool AudioUnitEffect::RealtimeFinalize()
@@ -1749,11 +1695,100 @@ bool AudioUnitEffect::SetAutomationParameters(EffectAutomationParameters & parms
return true;
}
bool AudioUnitEffect::LoadUserPreset(const wxString & name)
{
return LoadParameters(name);
}
bool AudioUnitEffect::SaveUserPreset(const wxString & name)
{
return SaveParameters(name);
}
bool AudioUnitEffect::LoadFactoryPreset(int id)
{
OSStatus result;
// Retrieve the list of factory presets
CFArrayRef array;
UInt32 dataSize = sizeof(CFArrayRef);
result = AudioUnitGetProperty(mUnit,
kAudioUnitProperty_FactoryPresets,
kAudioUnitScope_Global,
0,
&array,
&dataSize);
if (result != noErr)
{
return false;
}
if (id < 0 || id >= CFArrayGetCount(array))
{
return false;
}
AUPreset *preset = (AUPreset *) CFArrayGetValueAtIndex(array, id);
result = AudioUnitSetProperty(mUnit,
kAudioUnitProperty_PresentPreset,
kAudioUnitScope_Global,
0,
preset,
sizeof(AUPreset));
if (result == noErr)
{
AudioUnitParameter aup;
aup.mAudioUnit = mUnit;
aup.mParameterID = kAUParameterListener_AnyParameter;
aup.mScope = kAudioUnitScope_Global;
aup.mElement = 0;
AUParameterListenerNotify(NULL, NULL, &aup);
}
CFRelease(array);
return result == noErr;
}
bool AudioUnitEffect::LoadFactoryDefaults()
{
return LoadParameters(mHost->GetFactoryDefaultsGroup());
}
wxArrayString AudioUnitEffect::GetFactoryPresets()
{
OSStatus result;
wxArrayString presets;
// Retrieve the list of factory presets
CFArrayRef array;
UInt32 dataSize = sizeof(CFArrayRef);
result = AudioUnitGetProperty(mUnit,
kAudioUnitProperty_FactoryPresets,
kAudioUnitScope_Global,
0,
&array,
&dataSize);
if (result == noErr)
{
for (CFIndex i = 0, cnt = CFArrayGetCount(array); i < cnt; i++)
{
AUPreset *preset = (AUPreset *) CFArrayGetValueAtIndex(array, i);
wxMacCFStringHolder holder(preset->presetName, false);
presets.Add(holder.AsString());
}
CFRelease(array);
}
return presets;
}
// ============================================================================
// EffectUIClientInterface Implementation
// ============================================================================
void AudioUnitEffect::SetUIHost(EffectUIHostInterface *host)
void AudioUnitEffect::SetHostUI(EffectUIHostInterface *host)
{
mUIHost = host;
@@ -1873,8 +1908,7 @@ bool AudioUnitEffect::PopulateUI(wxWindow *parent)
HIViewSetFrame(auView, &rect);
}
mEventHelper = new AudioUnitEffectEventHelper(this);
mParent->PushEventHandler(mEventHelper);
mParent->PushEventHandler(this);
mEventRef = GetControlEventTarget(auView);
@@ -1964,11 +1998,7 @@ bool AudioUnitEffect::CloseUI()
{
RemoveHandler();
if (mEventHelper)
{
mParent->RemoveEventHandler(mEventHelper);
delete mEventHelper;
}
mParent->RemoveEventHandler(this);
if (mCarbonView)
{
@@ -1988,92 +2018,7 @@ bool AudioUnitEffect::CloseUI()
return true;
}
void AudioUnitEffect::LoadUserPreset(const wxString & name)
{
LoadParameters(name);
}
void AudioUnitEffect::SaveUserPreset(const wxString & name)
{
SaveParameters(name);
}
void AudioUnitEffect::LoadFactoryPreset(int id)
{
OSStatus result;
// Retrieve the list of factory presets
CFArrayRef array;
UInt32 dataSize = sizeof(CFArrayRef);
result = AudioUnitGetProperty(mUnit,
kAudioUnitProperty_FactoryPresets,
kAudioUnitScope_Global,
0,
&array,
&dataSize);
if (result == noErr)
{
if (id < CFArrayGetCount(array))
{
AUPreset *preset = (AUPreset *) CFArrayGetValueAtIndex(array, id);
result = AudioUnitSetProperty(mUnit,
kAudioUnitProperty_PresentPreset,
kAudioUnitScope_Global,
0,
preset,
sizeof(AUPreset));
if (result == noErr)
{
AudioUnitParameter aup;
aup.mAudioUnit = mUnit;
aup.mParameterID = kAUParameterListener_AnyParameter;
aup.mScope = kAudioUnitScope_Global;
aup.mElement = 0;
AUParameterListenerNotify(NULL, NULL, &aup);
}
}
CFRelease(array);
}
return;
}
void AudioUnitEffect::LoadFactoryDefaults()
{
LoadParameters(mHost->GetFactoryDefaultsGroup());
}
wxArrayString AudioUnitEffect::GetFactoryPresets()
{
OSStatus result;
wxArrayString presets;
// Retrieve the list of factory presets
CFArrayRef array;
UInt32 dataSize = sizeof(CFArrayRef);
result = AudioUnitGetProperty(mUnit,
kAudioUnitProperty_FactoryPresets,
kAudioUnitScope_Global,
0,
&array,
&dataSize);
if (result == noErr)
{
for (CFIndex i = 0, cnt = CFArrayGetCount(array); i < cnt; i++)
{
AUPreset *preset = (AUPreset *) CFArrayGetValueAtIndex(array, i);
wxMacCFStringHolder holder(preset->presetName, false);
presets.Add(holder.AsString());
}
CFRelease(array);
}
return presets;
}
bool AudioUnitEffect::CanExport()
bool AudioUnitEffect::CanExportPresets()
{
return true;
}
@@ -2110,6 +2055,15 @@ void AudioUnitEffect::ShowOptions()
// AudioUnitEffect Implementation
// ============================================================================
void AudioUnitEffect::OnSize(wxSizeEvent & evt)
{
// The parent panel has been resized, so make the AU the
// same size.
HIRect rect;
HIViewGetFrame((HIViewRef) mParent->GetHandle(), &rect);
HIViewSetFrame(mAUView, &rect);
}
void AudioUnitEffect::RemoveHandler()
{
if (mAUTrackingHandlerRef)
@@ -2161,7 +2115,7 @@ void AudioUnitEffect::RemoveHandler()
}
}
void AudioUnitEffect::LoadParameters(const wxString & group)
bool AudioUnitEffect::LoadParameters(const wxString & group)
{
OSStatus result;
UInt32 dataSize;
@@ -2170,7 +2124,7 @@ void AudioUnitEffect::LoadParameters(const wxString & group)
wxString value;
if (!mHost->GetPrivateConfig(group, wxT("Value"), value, wxEmptyString))
{
return;
return false;
}
wxStringTokenizer tokens(value, wxT(','));
@@ -2182,14 +2136,14 @@ void AudioUnitEffect::LoadParameters(const wxString & group)
&isWritable);
if (result != noErr)
{
return;
return false;
}
UInt32 cnt = dataSize / sizeof(AudioUnitParameterID);
if (cnt != tokens.CountTokens())
{
return;
return false;
}
AudioUnitParameterID *array = new AudioUnitParameterID[cnt];
@@ -2203,7 +2157,7 @@ void AudioUnitEffect::LoadParameters(const wxString & group)
if (result != noErr)
{
delete [] array;
return;
return false;
}
for (int i = 0; i < cnt; i++)
@@ -2221,7 +2175,7 @@ void AudioUnitEffect::LoadParameters(const wxString & group)
if (result != noErr)
{
delete [] array;
return;
return false;
}
}
@@ -2233,9 +2187,11 @@ void AudioUnitEffect::LoadParameters(const wxString & group)
AUParameterListenerNotify(NULL, NULL, &aup);
delete [] array;
return true;
}
void AudioUnitEffect::SaveParameters(const wxString & group)
bool AudioUnitEffect::SaveParameters(const wxString & group)
{
OSStatus result;
UInt32 dataSize;
@@ -2250,7 +2206,7 @@ void AudioUnitEffect::SaveParameters(const wxString & group)
&isWritable);
if (result != noErr)
{
return;
return false;
}
UInt32 cnt = dataSize / sizeof(AudioUnitParameterID);
@@ -2265,7 +2221,7 @@ void AudioUnitEffect::SaveParameters(const wxString & group)
if (result != noErr)
{
delete [] array;
return;
return false;
}
for (int i = 0; i < cnt; i++)
@@ -2279,7 +2235,7 @@ void AudioUnitEffect::SaveParameters(const wxString & group)
if (result != noErr)
{
delete [] array;
return;
return false;
}
parms += wxString::Format(wxT(",%f"), value);
@@ -2288,6 +2244,8 @@ void AudioUnitEffect::SaveParameters(const wxString & group)
mHost->SetPrivateConfig(group, wxT("Value"), parms.Mid(1));
delete [] array;
return true;
}
bool AudioUnitEffect::SetRateAndChannels()

View File

@@ -32,11 +32,11 @@ class AudioUnitEffect;
WX_DEFINE_ARRAY_PTR(AudioUnitEffect *, AudioUnitEffectArray);
class AudioUnitEffectEventHelper;
class AudioUnitEffectExportDialog;
class AudioUnitEffectImportDialog;
class AudioUnitEffect : public EffectClientInterface,
class AudioUnitEffect : public wxEvtHandler,
public EffectClientInterface,
public EffectUIClientInterface
{
public:
@@ -76,15 +76,15 @@ public:
virtual int GetMidiOutCount();
virtual void SetSampleRate(sampleCount rate);
virtual sampleCount GetBlockSize(sampleCount maxBlockSize);
virtual sampleCount SetBlockSize(sampleCount maxBlockSize);
virtual sampleCount GetLatency();
virtual sampleCount GetTailSize();
virtual bool IsReady();
virtual bool ProcessInitialize();
virtual bool ProcessInitialize(sampleCount totalLen, ChannelNames chanMap = NULL);
virtual bool ProcessFinalize();
virtual sampleCount ProcessBlock(float **inbuf, float **outbuf, sampleCount size);
virtual sampleCount ProcessBlock(float **inBlock, float **outBlock, sampleCount blockLen);
virtual bool RealtimeInitialize();
virtual bool RealtimeAddProcessor(int numChannels, float sampleRate);
@@ -103,24 +103,23 @@ public:
virtual bool GetAutomationParameters(EffectAutomationParameters & parms);
virtual bool SetAutomationParameters(EffectAutomationParameters & parms);
virtual bool LoadUserPreset(const wxString & name);
virtual bool SaveUserPreset(const wxString & name);
virtual bool LoadFactoryPreset(int id);
virtual bool LoadFactoryDefaults();
virtual wxArrayString GetFactoryPresets();
// EffectUIClientInterface implementation
virtual void SetUIHost(EffectUIHostInterface *host);
virtual void SetHostUI(EffectUIHostInterface *host);
virtual bool PopulateUI(wxWindow *parent);
virtual bool IsGraphicalUI();
virtual bool ValidateUI();
virtual bool HideUI();
virtual bool CloseUI();
virtual void LoadUserPreset(const wxString & name);
virtual void SaveUserPreset(const wxString & name);
virtual void LoadFactoryPreset(int id);
virtual void LoadFactoryDefaults();
virtual wxArrayString GetFactoryPresets();
virtual bool CanExport();
virtual bool CanExportPresets();
virtual void ExportPresets();
virtual void ImportPresets();
@@ -177,8 +176,12 @@ private:
void GetChannelCounts();
void LoadParameters(const wxString & group);
void SaveParameters(const wxString & group);
bool LoadParameters(const wxString & group);
bool SaveParameters(const wxString & group);
void OnSize(wxSizeEvent & evt);
private:
wxString mPath;
wxString mName;
@@ -236,9 +239,8 @@ private:
EventHandlerRef mContentTrackingHandlerRef;
EventHandlerRef mAUTrackingHandlerRef;
AudioUnitEffectEventHelper *mEventHelper;
DECLARE_EVENT_TABLE();
friend class AudioUnitEffectEventHelper;
friend class AudioUnitEffectExportDialog;
friend class AudioUnitEffectImportDialog;
};