Browse Source

Handle sysex for AU, needs testing; Cleanup

Signed-off-by: falkTX <falktx@falktx.com>
pull/452/head
falkTX 1 year ago
parent
commit
4634b0c950
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
1 changed files with 42 additions and 19 deletions
  1. +42
    -19
      distrho/src/DistrhoPluginAU.cpp

+ 42
- 19
distrho/src/DistrhoPluginAU.cpp View File

@@ -1221,6 +1221,7 @@ public:
DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope);
DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement);
DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(uint8_t) * 3, inDataSize, kAudioUnitErr_InvalidPropertyValue); DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(uint8_t) * 3, inDataSize, kAudioUnitErr_InvalidPropertyValue);
#if DISTRHO_PLUGIN_HAS_UI
{ {
const uint8_t* const midiData = static_cast<const uint8_t*>(inData); const uint8_t* const midiData = static_cast<const uint8_t*>(inData);


@@ -1230,6 +1231,7 @@ public:
fNotesRingBuffer.writeCustomData(midiData, 3); fNotesRingBuffer.writeCustomData(midiData, 3);
fNotesRingBuffer.commitWrite(); fNotesRingBuffer.commitWrite();
} }
#endif
return noErr; return noErr;
#endif #endif


@@ -1417,8 +1419,8 @@ public:
return noErr; return noErr;
} }


OSStatus auRender(AudioUnitRenderActionFlags& ioActionFlags,
const AudioTimeStamp& inTimeStamp,
OSStatus auRender(AudioUnitRenderActionFlags* const ioActionFlags,
const AudioTimeStamp* const inTimeStamp,
const UInt32 inBusNumber, const UInt32 inBusNumber,
const UInt32 inFramesToProcess, const UInt32 inFramesToProcess,
AudioBufferList& ioData) AudioBufferList& ioData)
@@ -1428,7 +1430,6 @@ public:


if (inFramesToProcess > fPlugin.getBufferSize()) if (inFramesToProcess > fPlugin.getBufferSize())
{ {
d_stdout("auRender inFramesToProcess invalid");
setLastRenderError(kAudioUnitErr_TooManyFramesToProcess); setLastRenderError(kAudioUnitErr_TooManyFramesToProcess);
return kAudioUnitErr_TooManyFramesToProcess; return kAudioUnitErr_TooManyFramesToProcess;
} }
@@ -1440,7 +1441,6 @@ d_stdout("auRender inFramesToProcess invalid");
// TODO there must be something more to this... // TODO there must be something more to this...
if (buffer.mData == nullptr) if (buffer.mData == nullptr)
{ {
d_stdout("auRender null buffer");
return noErr; return noErr;
} }


@@ -1469,7 +1469,13 @@ d_stdout("auRender null buffer");
constexpr float** outputs = nullptr; constexpr float** outputs = nullptr;
#endif #endif


run(inputs, outputs, inFramesToProcess);
run(inputs, outputs, inFramesToProcess, inTimeStamp);

if (ioActionFlags != nullptr)
{
// TODO what now?
}

return noErr; return noErr;
} }


@@ -1509,7 +1515,7 @@ d_stdout("auRender null buffer");


#if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0
// if plugin has no audio, assume render function is not going to be called // if plugin has no audio, assume render function is not going to be called
run(nullptr, nullptr, std::max(1u, inOffsetSampleFrame));
run(nullptr, nullptr, std::max(1u, inOffsetSampleFrame), nullptr);
#endif #endif


return noErr; return noErr;
@@ -1517,8 +1523,30 @@ d_stdout("auRender null buffer");


OSStatus auSysEx(const UInt8* const inData, const UInt32 inLength) OSStatus auSysEx(const UInt8* const inData, const UInt32 inLength)
{ {
// TODO
return kAudioUnitErr_PropertyNotInUse;
if (fMidiEventCount >= kMaxMidiEvents)
return noErr;

MidiEvent& midiEvent(fMidiEvents[fMidiEventCount++]);
midiEvent.frame = fMidiEventCount != 1 ? fMidiEvents[fMidiEventCount - 1].frame : 0;
midiEvent.size = inLength;

// FIXME who owns inData ??
if (inLength > MidiEvent::kDataSize)
{
std::memset(midiEvent.data, 0, MidiEvent::kDataSize);
midiEvent.dataExt = inData;
}
else
{
std::memcpy(midiEvent.data, inData, inLength);
}

#if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0
// if plugin has no audio, assume render function is not going to be called
run(nullptr, nullptr, 1, nullptr);
#endif

return noErr;
} }
#endif #endif


@@ -1586,7 +1614,7 @@ private:
} }
} }


void run(const float** inputs, float** outputs, const uint32_t frames)
void run(const float** inputs, float** outputs, const uint32_t frames, const AudioTimeStamp* const inTimeStamp)
{ {
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT && DISTRHO_PLUGIN_HAS_UI #if DISTRHO_PLUGIN_WANT_MIDI_INPUT && DISTRHO_PLUGIN_HAS_UI
if (fMidiEventCount != kMaxMidiEvents && fNotesRingBuffer.isDataAvailableForReading()) if (fMidiEventCount != kMaxMidiEvents && fNotesRingBuffer.isDataAvailableForReading())
@@ -1695,10 +1723,13 @@ private:
if (fMidiOutputPackets.numPackets != 0 && fMidiOutput.midiOutputCallback != nullptr) if (fMidiOutputPackets.numPackets != 0 && fMidiOutput.midiOutputCallback != nullptr)
{ {
fMidiOutput.midiOutputCallback(fMidiOutput.userData, fMidiOutput.midiOutputCallback(fMidiOutput.userData,
&inTimeStamp,
inTimeStamp,
0, 0,
reinterpret_cast<const ::MIDIPacketList*>(&fMidiOutputPackets)); reinterpret_cast<const ::MIDIPacketList*>(&fMidiOutputPackets));
} }
#else
// unused
(void)inTimeStamp;
#endif #endif


float value; float value;
@@ -2418,15 +2449,7 @@ struct AudioComponentPlugInInstance {
DISTRHO_SAFE_ASSERT_RETURN(inTimeStamp != nullptr, kAudio_ParamError); DISTRHO_SAFE_ASSERT_RETURN(inTimeStamp != nullptr, kAudio_ParamError);
DISTRHO_SAFE_ASSERT_RETURN(ioData != nullptr, kAudio_ParamError); DISTRHO_SAFE_ASSERT_RETURN(ioData != nullptr, kAudio_ParamError);


AudioUnitRenderActionFlags tmpFlags;

if (ioActionFlags == nullptr)
{
tmpFlags = 0;
ioActionFlags = &tmpFlags;
}

return self->plugin->auRender(*ioActionFlags, *inTimeStamp, inOutputBusNumber, inNumberFrames, *ioData);
return self->plugin->auRender(ioActionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, *ioData);
} }


#if DISTRHO_PLUGIN_WANT_MIDI_INPUT #if DISTRHO_PLUGIN_WANT_MIDI_INPUT


Loading…
Cancel
Save