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];
121void IPlugAUv3::ProcessWithEvents(AudioTimeStamp
const* pTimestamp, uint32_t frameCount, AURenderEvent
const* pEvents,
ITimeInfo& timeInfo)
123 SetTimeInfo(timeInfo);
126 while (mMidiMsgsFromEditor.Pop(midiMsg))
131 mLastTimeStamp = *pTimestamp;
132 AUEventSampleTime now = AUEventSampleTime(pTimestamp->mSampleTime);
133 uint32_t framesRemaining = frameCount;
135 for (
const AURenderEvent* pEvent = pEvents; pEvent !=
nullptr; pEvent = pEvent->head.next)
137 switch (pEvent->head.eventType)
139 case AURenderEventMIDI:
141 const AUMIDIEvent& midiEvent = pEvent->MIDI;
143 midiMsg = {
static_cast<int>(midiEvent.eventSampleTime - now), midiEvent.data[0], midiEvent.data[1], midiEvent.data[2] };
145 mMidiMsgsFromProcessor.Push(midiMsg);
149 case AURenderEventParameter:
150 case AURenderEventParameterRamp:
152 const AUParameterEvent& paramEvent = pEvent->parameter;
154 if (paramEvent.parameterAddress < NParams())
156 const int paramIdx = GetParamIdx(paramEvent.parameterAddress);
158 const double value = (double) paramEvent.value;
159 const int sampleOffset = (
int) (paramEvent.eventSampleTime - now);
161 GetParam(paramIdx)->Set(value);
163 OnParamChange(paramIdx, EParamSource::kHost, sampleOffset);
176 ProcessBuffers(0.f, framesRemaining);
180 while (mSysExDataFromEditor.Pop(mSysexBuf))
182 ISysEx smsg {mSysexBuf.mOffset, mSysexBuf.mData, mSysexBuf.mSize};
220void IPlugAUv3::SetParameterFromValueObserver(uint64_t address,
float value)
222 if (address < NParams())
224 const int paramIdx = GetParamIdx(address);
227 IParam* pParam = GetParam(paramIdx);
229 pParam->Set((
double) value);
231 OnParamChange(paramIdx, kHost, -1);
235void IPlugAUv3::SendParameterValueFromObserver(uint64_t address,
float value)
237 if (address < NParams())
239 const int paramIdx = GetParamIdx(address);
245float IPlugAUv3::GetParameter(uint64_t address)
247 const int paramIdx = GetParamIdx(address);
250 const float val = (float) GetParam(paramIdx)->Value();
255const char* IPlugAUv3::GetParamDisplay(uint64_t address,
float value)
257 const int paramIdx = GetParamIdx(address);
260 GetParam(paramIdx)->GetDisplay(value,
false, mParamDisplayStr);
262 return (
const char*) mParamDisplayStr.Get();
265float IPlugAUv3::GetParamStringToValue(uint64_t address,
const char* str)
267 const int paramIdx = GetParamIdx(address);
270 float val = (float) GetParam(paramIdx)->StringToValue(str);
275void IPlugAUv3::AttachInputBuffers(AudioBufferList* pInBufList)
281 for (
int i = 0; i < pInBufList->mNumberBuffers; i++)
283 int nConnected = pInBufList->mBuffers[i].mNumberChannels;
284 SetChannelConnections(ERoute::kInput, chanIdx, nConnected,
true);
285 AttachBuffers(ERoute::kInput, chanIdx, nConnected, (
float**) &(pInBufList->mBuffers[i].mData),
GetBlockSize());
286 chanIdx += nConnected;
289 SetChannelConnections(ERoute::kInput, chanIdx,
MaxNChannels(kInput) - chanIdx,
false);
293void IPlugAUv3::AttachOutputBuffers(AudioBufferList* pOutBufList, uint32_t busNumber)
299 int numChannelsInBus = pOutBufList->mNumberBuffers;
301 for (
int i = 0; i < pOutBufList->mNumberBuffers; i++)
303 int nConnected = pOutBufList->mBuffers[i].mNumberChannels;
304 SetChannelConnections(ERoute::kOutput, (busNumber * numChannelsInBus) + chanIdx, nConnected,
true);
305 AttachBuffers(ERoute::kOutput, (busNumber * numChannelsInBus) + chanIdx, nConnected, (
float**) &(pOutBufList->mBuffers[i].mData),
GetBlockSize());
306 chanIdx += nConnected;
308 SetChannelConnections(ERoute::kInput, chanIdx,
MaxNChannels(kOutput) - chanIdx,
false);
312void IPlugAUv3::Prepare(
double sampleRate, uint32_t blockSize)
314 SetChannelConnections(ERoute::kInput, 0,
MaxNChannels(ERoute::kInput),
false);
315 SetChannelConnections(ERoute::kOutput, 0,
MaxNChannels(ERoute::kOutput),
false);
316 SetBlockSize(blockSize);
317 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!
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.