11#import <AudioToolbox/AudioToolbox.h>
12#include <CoreMIDI/CoreMIDI.h>
15#import "IPlugAUAudioUnit.h"
17#if !__has_feature(objc_arc)
18#error This file must be compiled with Arc. Use -fobjc-arc flag
23IPlugAUv3::IPlugAUv3(
const InstanceInfo& instanceInfo,
const Config& config)
27 Trace(TRACELOC,
"%s", config.pluginName);
30void IPlugAUv3::SetAUAudioUnit(
void* pAUAudioUnit)
32 mAUAudioUnit = pAUAudioUnit;
37 const AUParameterAddress address = GetParamAddress(paramIdx);
38 [(__bridge IPLUG_AUAUDIOUNIT*) mAUAudioUnit beginInformHostOfParamChange:address];
43 const AUParameterAddress address = GetParamAddress(paramIdx);
45 [(__bridge IPLUG_AUAUDIOUNIT*) mAUAudioUnit informHostOfParamChange:address :(
float) GetParam(paramIdx)->FromNormalized(normalizedValue)];
50 const AUParameterAddress address = GetParamAddress(paramIdx);
51 [(__bridge IPLUG_AUAUDIOUNIT*) mAUAudioUnit endInformHostOfParamChange:address];
56 uint8_t data[3] = { msg.mStatus, msg.mData1, msg.mData2 };
58 int64_t sampleTime = mLastTimeStamp.mSampleTime + msg.mOffset;
60 return [(__bridge IPLUG_AUAUDIOUNIT*) mAUAudioUnit sendMidiData: sampleTime :
sizeof(data) : data];
70 int64_t sampleTime = mLastTimeStamp.mSampleTime + msg.mOffset;
72 return [(__bridge IPLUG_AUAUDIOUNIT*) mAUAudioUnit sendMidiData: sampleTime : msg.mSize : msg.mData];
129void IPlugAUv3::ProcessWithEvents(AudioTimeStamp
const* pTimestamp, uint32_t frameCount, AURenderEvent
const* pEvents,
ITimeInfo& timeInfo)
131 SetTimeInfo(timeInfo);
134 while (mMidiMsgsFromEditor.Pop(midiMsg))
139 mLastTimeStamp = *pTimestamp;
140 AUEventSampleTime now = AUEventSampleTime(pTimestamp->mSampleTime);
141 uint32_t framesRemaining = frameCount;
143 for (
const AURenderEvent* pEvent = pEvents; pEvent !=
nullptr; pEvent = pEvent->head.next)
145 switch (pEvent->head.eventType)
147 case AURenderEventMIDI:
149 const AUMIDIEvent& midiEvent = pEvent->MIDI;
151 midiMsg = {
static_cast<int>(midiEvent.eventSampleTime - now), midiEvent.data[0], midiEvent.data[1], midiEvent.data[2] };
153 mMidiMsgsFromProcessor.Push(midiMsg);
157 case AURenderEventParameter:
158 case AURenderEventParameterRamp:
160 const AUParameterEvent& paramEvent = pEvent->parameter;
162 if (paramEvent.parameterAddress < NParams())
164 const int paramIdx = GetParamIdx(paramEvent.parameterAddress);
166 const double value = (double) paramEvent.value;
167 const int sampleOffset = (
int) (paramEvent.eventSampleTime - now);
169 GetParam(paramIdx)->Set(value);
171 OnParamChange(paramIdx, EParamSource::kHost, sampleOffset);
184 ProcessBuffers(0.f, framesRemaining);
188 while (mSysExDataFromEditor.Pop(mSysexBuf))
190 ISysEx smsg {mSysexBuf.mOffset, mSysexBuf.mData, mSysexBuf.mSize};
228void IPlugAUv3::SetParameterFromValueObserver(uint64_t address,
float value)
230 if (address < NParams())
232 const int paramIdx = GetParamIdx(address);
235 IParam* pParam = GetParam(paramIdx);
237 pParam->Set((
double) value);
239 OnParamChange(paramIdx, kHost, -1);
243void IPlugAUv3::SendParameterValueFromObserver(uint64_t address,
float value)
245 if (address < NParams())
247 const int paramIdx = GetParamIdx(address);
253float IPlugAUv3::GetParameter(uint64_t address)
255 const int paramIdx = GetParamIdx(address);
258 const float val = (float) GetParam(paramIdx)->Value();
263const char* IPlugAUv3::GetParamDisplay(uint64_t address,
float value)
265 const int paramIdx = GetParamIdx(address);
268 GetParam(paramIdx)->GetDisplay(value,
false, mParamDisplayStr);
270 return (
const char*) mParamDisplayStr.Get();
273float IPlugAUv3::GetParamStringToValue(uint64_t address,
const char* str)
275 const int paramIdx = GetParamIdx(address);
278 float val = (float) GetParam(paramIdx)->StringToValue(str);
283void IPlugAUv3::AttachInputBuffers(AudioBufferList* pInBufList)
289 for (
int i = 0; i < pInBufList->mNumberBuffers; i++)
291 int nConnected = pInBufList->mBuffers[i].mNumberChannels;
292 SetChannelConnections(ERoute::kInput, chanIdx, nConnected,
true);
293 AttachBuffers(ERoute::kInput, chanIdx, nConnected, (
float**) &(pInBufList->mBuffers[i].mData),
GetBlockSize());
294 chanIdx += nConnected;
297 SetChannelConnections(ERoute::kInput, chanIdx,
MaxNChannels(kInput) - chanIdx,
false);
301void IPlugAUv3::AttachOutputBuffers(AudioBufferList* pOutBufList, uint32_t busNumber)
307 int numChannelsInBus = pOutBufList->mNumberBuffers;
309 for (
int i = 0; i < pOutBufList->mNumberBuffers; i++)
311 int nConnected = pOutBufList->mBuffers[i].mNumberChannels;
312 SetChannelConnections(ERoute::kOutput, (busNumber * numChannelsInBus) + chanIdx, nConnected,
true);
313 AttachBuffers(ERoute::kOutput, (busNumber * numChannelsInBus) + chanIdx, nConnected, (
float**) &(pOutBufList->mBuffers[i].mData),
GetBlockSize());
314 chanIdx += nConnected;
316 SetChannelConnections(ERoute::kInput, chanIdx,
MaxNChannels(kOutput) - chanIdx,
false);
320void IPlugAUv3::Prepare(
double sampleRate, uint32_t blockSize)
322 SetChannelConnections(ERoute::kInput, 0,
MaxNChannels(ERoute::kInput),
false);
323 SetChannelConnections(ERoute::kOutput, 0,
MaxNChannels(ERoute::kOutput),
false);
324 SetBlockSize(blockSize);
325 SetSampleRate(sampleRate);
The base class of an IPlug plug-in, which interacts with the different plug-in APIs.
virtual void SendParameterValueFromAPI(int paramIdx, double value, bool normalized)
This is called from the plug-in API class in order to update UI controls linked to plug-in parameters...
void InformHostOfParamChange(int idx, double normalizedValue) override
Implemented by the API class, called by the UI via SetParameterValue() with the value of a parameter ...
bool SendSysEx(const ISysEx &msg) override
Send a single MIDI System Exclusive (SysEx) message // TODO: info about what thread should this be ca...
bool SendMidiMsg(const IMidiMsg &msg) override
Send a single MIDI message // TODO: info about what thread should this be called on or not called on!
bool EditorResize(int viewWidth, int viewHeight) override
Implementations call into the APIs resize hooks returns a bool to indicate whether the DAW or plugin ...
void BeginInformHostOfParamChange(int idx) override
Implemented by the API class, called by the UI (or by a delegate) at the beginning of a parameter cha...
void EndInformHostOfParamChange(int idx) override
Implemented by the API class, called by the UI (or by a delegate) at the end of a parameter change ge...
The base class for IPlug Audio Processing.
virtual void ProcessMidiMsg(const IMidiMsg &msg)
Override this method to handle incoming MIDI messages.
int MaxNChannels(ERoute direction) const
Encapsulates information about the host transport state.
Encapsulates a MIDI message and provides helper functions.
A struct for dealing with SysEx messages.