@@ -276,12 +276,18 @@ struct RenderListener {
276
276
typedef std::vector<PropertyListener> PropertyListeners;
277
277
typedef std::vector<RenderListener> RenderListeners;
278
278
279
- // --------------------------------------------------------------------------------------------------------------------
279
+ #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
280
+ // useful definitions
281
+ static constexpr const uint32_t kMIDIPacketNonDataSize = sizeof (MIDIPacket) - sizeof (MIDIPacket::data);
282
+ static constexpr const uint32_t kMIDIPacketListNonDataSize = sizeof (MIDIPacketList) - sizeof (MIDIPacketList::packet);
283
+
284
+ // size of data used for midi events
285
+ static constexpr const uint32_t kMIDIPacketListMaxDataSize = kMIDIPacketNonDataSize * kMaxMidiEvents
286
+ + sizeof (Byte ) * MidiEvent::kDataSize * kMaxMidiEvents ;
280
287
281
- typedef struct {
282
- UInt32 numPackets;
283
- MIDIPacket packets[kMaxMidiEvents ];
284
- } d_MIDIPacketList;
288
+ // size of midi list + data
289
+ static constexpr const uint32_t kMIDIPacketListSize = kMIDIPacketListNonDataSize + kMIDIPacketListMaxDataSize ;
290
+ #endif
285
291
286
292
// --------------------------------------------------------------------------------------------------------------------
287
293
@@ -335,6 +341,9 @@ class PluginAU
335
341
#if DISTRHO_PLUGIN_WANT_MIDI_INPUT
336
342
, fMidiEventCount (0 )
337
343
#endif
344
+ #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
345
+ , fMidiOutputDataOffset (0 )
346
+ #endif
338
347
#if DISTRHO_PLUGIN_WANT_PROGRAMS
339
348
, fCurrentProgram (-1 )
340
349
, fLastFactoryProgram (0 )
@@ -370,8 +379,10 @@ class PluginAU
370
379
#endif
371
380
372
381
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
382
+ if ((fMidiOutputPackets = static_cast <MIDIPacketList*>(std::malloc (kMIDIPacketListSize ))) != nullptr )
383
+ std::memset (fMidiOutputPackets , 0 , kMIDIPacketListSize );
384
+
373
385
std::memset (&fMidiOutput , 0 , sizeof (fMidiOutput ));
374
- std::memset (&fMidiOutputPackets , 0 , sizeof (fMidiOutputPackets ));
375
386
#endif
376
387
377
388
#if DISTRHO_PLUGIN_WANT_PROGRAMS
@@ -428,6 +439,10 @@ class PluginAU
428
439
reallocAudioBufferList (false );
429
440
#endif
430
441
442
+ #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
443
+ std::free (fMidiOutputPackets );
444
+ #endif
445
+
431
446
#if DISTRHO_PLUGIN_WANT_PROGRAMS
432
447
for (uint32_t i=0 ; i<fProgramCount ; ++i)
433
448
CFRelease (fFactoryPresetsData [i].presetName );
@@ -451,7 +466,8 @@ class PluginAU
451
466
fMidiEventCount = 0 ;
452
467
#endif
453
468
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
454
- fMidiOutputPackets .numPackets = 0 ;
469
+ fMidiOutputDataOffset = 0 ;
470
+ fMidiOutputPackets ->numPackets = 0 ;
455
471
#endif
456
472
#if DISTRHO_PLUGIN_WANT_TIMEPOS
457
473
fTimePosition .clear ();
@@ -1787,7 +1803,8 @@ class PluginAU
1787
1803
fMidiEventCount = 0 ;
1788
1804
#endif
1789
1805
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
1790
- fMidiOutputPackets .numPackets = 0 ;
1806
+ fMidiOutputDataOffset = 0 ;
1807
+ fMidiOutputPackets ->numPackets = 0 ;
1791
1808
#endif
1792
1809
#if DISTRHO_PLUGIN_WANT_TIMEPOS
1793
1810
fTimePosition .clear ();
@@ -2143,8 +2160,9 @@ class PluginAU
2143
2160
#endif
2144
2161
2145
2162
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
2163
+ uint32_t fMidiOutputDataOffset ;
2164
+ MIDIPacketList* fMidiOutputPackets ;
2146
2165
AUMIDIOutputCallbackStruct fMidiOutput ;
2147
- d_MIDIPacketList fMidiOutputPackets ;
2148
2166
#endif
2149
2167
2150
2168
#if DISTRHO_PLUGIN_WANT_PROGRAMS
@@ -2219,7 +2237,8 @@ class PluginAU
2219
2237
#endif
2220
2238
2221
2239
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
2222
- fMidiOutputPackets .numPackets = 0 ;
2240
+ fMidiOutputDataOffset = 0 ;
2241
+ fMidiOutputPackets ->numPackets = 0 ;
2223
2242
#endif
2224
2243
2225
2244
#if DISTRHO_PLUGIN_WANT_TIMEPOS
@@ -2296,12 +2315,11 @@ class PluginAU
2296
2315
#endif
2297
2316
2298
2317
#if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT
2299
- if (fMidiOutputPackets .numPackets != 0 && fMidiOutput .midiOutputCallback != nullptr )
2318
+ if (fMidiOutputPackets != nullptr &&
2319
+ fMidiOutputPackets ->numPackets != 0 &&
2320
+ fMidiOutput .midiOutputCallback != nullptr )
2300
2321
{
2301
- fMidiOutput .midiOutputCallback (fMidiOutput .userData ,
2302
- inTimeStamp,
2303
- 0 ,
2304
- reinterpret_cast <const ::MIDIPacketList*>(&fMidiOutputPackets ));
2322
+ fMidiOutput .midiOutputCallback (fMidiOutput .userData , inTimeStamp, 0 , fMidiOutputPackets );
2305
2323
}
2306
2324
#else
2307
2325
// unused
@@ -2718,17 +2736,21 @@ class PluginAU
2718
2736
bool writeMidi (const MidiEvent& midiEvent)
2719
2737
{
2720
2738
DISTRHO_CUSTOM_SAFE_ASSERT_ONCE_RETURN (" MIDI output unsupported" , fMidiOutput .midiOutputCallback != nullptr , false );
2739
+ DISTRHO_CUSTOM_SAFE_ASSERT_ONCE_RETURN (" Out of memory" , fMidiOutputPackets != nullptr , false );
2721
2740
2722
- if (midiEvent.size > sizeof (MIDIPacket::data))
2723
- return true ;
2724
- if (fMidiOutputPackets .numPackets == kMaxMidiEvents )
2741
+ if (fMidiOutputDataOffset + kMIDIPacketNonDataSize + midiEvent.size >= kMIDIPacketListMaxDataSize )
2725
2742
return false ;
2726
2743
2727
2744
const uint8_t * const midiData = midiEvent.size > MidiEvent::kDataSize ? midiEvent.dataExt : midiEvent.data ;
2728
- MIDIPacket& packet (fMidiOutputPackets .packets [fMidiOutputPackets .numPackets ++]);
2729
- packet.timeStamp = midiEvent.frame ;
2730
- packet.length = midiEvent.size ;
2731
- std::memcpy (packet.data , midiData, midiEvent.size );
2745
+ MIDIPacket* const packet = reinterpret_cast <MIDIPacket*>(
2746
+ reinterpret_cast <uint8_t *>(fMidiOutputPackets ->packet ) + fMidiOutputDataOffset );
2747
+
2748
+ packet->timeStamp = midiEvent.frame ;
2749
+ packet->length = midiEvent.size ;
2750
+ std::memcpy (packet->data , midiData, midiEvent.size );
2751
+
2752
+ ++fMidiOutputPackets ->numPackets ;
2753
+ fMidiOutputDataOffset += kMIDIPacketNonDataSize + midiEvent.size ;
2732
2754
return true ;
2733
2755
}
2734
2756
0 commit comments