From: <sag...@us...> - 2013-03-11 14:13:32
|
Revision: 1558 http://sourceforge.net/p/modplug/code/1558 Author: saga-games Date: 2013-03-11 14:13:23 +0000 (Mon, 11 Mar 2013) Log Message: ----------- [Ref] Made VST event queue handling a bit less clumsy. Modified Paths: -------------- trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2013-03-10 15:57:47 UTC (rev 1557) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2013-03-11 14:13:23 UTC (rev 1558) @@ -2051,31 +2051,17 @@ // Add all events to the plugin's queue. for(VstInt32 i = 0; i < events->numEvents; i++) { - // Let's do some dispatching, because the VST SDK doesn't do it for us. :-( - switch(events->events[i]->type) - { - case kVstMidiType: - vstPlugin->vstEvents.Enqueue(*reinterpret_cast<VstMidiEvent *>(events->events[i])); - break; - - case kVstSysExType: - vstPlugin->vstEvents.Enqueue(*reinterpret_cast<VstMidiSysexEvent *>(events->events[i])); - break; - - default: - vstPlugin->vstEvents.Enqueue(*events->events[i]); - break; - } + vstPlugin->vstEvents.Enqueue(events->events[i]); } } } +#ifdef MODPLUG_TRACKER if(m_bRecordMIDIOut) { // Spam MIDI data to all views for(VstInt32 i = 0; i < events->numEvents; i++) { - // Let's do some dispatching, because the VST SDK doesn't do it for us. :-( if(events->events[i]->type == kVstMidiType) { VstMidiEvent *event = reinterpret_cast<VstMidiEvent *>(events->events[i]); @@ -2083,6 +2069,7 @@ } } } +#endif // MODPLUG_TRACKER } @@ -2338,7 +2325,7 @@ Log("Sending Midi %02X.%02X.%02X\n", event.midiData[0]&0xff, event.midiData[1]&0xff, event.midiData[2]&0xff); #endif - return vstEvents.Enqueue(event, insertAtFront); + return vstEvents.Enqueue(reinterpret_cast<VstEvent *>(&event), insertAtFront); } @@ -2552,15 +2539,8 @@ // Some VSTis need a note off for each instance of a note on, e.g. fabfilter. while(channel.noteOnMap[i][trackChannel]) { - if(MidiSend(MIDIEvents::NoteOff(nMidiCh, i, volume))) - { - channel.noteOnMap[i][trackChannel]--; - } else - { - // VST event queue overflow, no point in submitting more note offs. - // Note: This shouldn't happen anymore, since PluginEventQueue uses a secondary queue. - break; - } + MidiSend(MIDIEvents::NoteOff(nMidiCh, i, volume)); + channel.noteOnMap[i][trackChannel]--; } } } Modified: trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h =================================================================== --- trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h 2013-03-10 15:57:47 UTC (rev 1557) +++ trunk/OpenMPT/soundlib/plugins/PluginEventQueue.h 2013-03-11 14:13:23 UTC (rev 1558) @@ -85,48 +85,21 @@ // Add a VST event to the queue. Returns true on success. // Set insertFront to true to prioritise this event (i.e. add it at the front of the queue instead of the back) - bool Enqueue(const VstEvent &event, bool insertFront = false) + bool Enqueue(const VstEvent *event, bool insertFront = false) { - ASSERT(event.byteSize == sizeof(event)); -#if 1 - // True on 32-Bit hosts: No copying is necessary - static_assert(sizeof(VstEvent) == sizeof(VstMidiSysexEvent), "This is no 32-Bit host!"); - return Enqueue(reinterpret_cast<const VstMidiSysexEvent &>(event), insertFront); -#else - // True on 64-Bit hosts: VstMidiSysexEvent is bigger, so copy smaller event into bigger event. - static_assert(sizeof(VstEvent) <= sizeof(VstMidiSysexEvent), "This is no 64-Bit host!"); - VstMidiSysexEvent copyEvent; - memcpy(©Event, &event, min(event.byteSize, sizeof(event))); - return Enqueue(copyEvent, insertFront); -#endif - } + ASSERT(event->type != kVstSysExType || event->byteSize == sizeof(VstMidiSysexEvent)); + ASSERT(event->type != kVstMidiType || event->byteSize == sizeof(VstMidiEvent)); - bool Enqueue(const VstMidiEvent &event, bool insertFront = false) - { - ASSERT(event.byteSize == sizeof(event)); -#if 1 - // True on 32-Bit hosts: No copying is necessary - static_assert(sizeof(VstMidiEvent) == sizeof(VstMidiSysexEvent), "This is no 32-Bit host!"); - return Enqueue(reinterpret_cast<const VstMidiSysexEvent &>(event), insertFront); -#else - // True on 64-Bit hosts: VstMidiSysexEvent is bigger, so copy smaller event into bigger event. - static_assert(sizeof(VstMidiEvent) <= sizeof(VstMidiSysexEvent), "This is no 64-Bit host!"); - VstMidiSysexEvent copyEvent; - memcpy(©Event, &event, min(event.byteSize, sizeof(event))); - return Enqueue(copyEvent, insertFront); -#endif - } + BiggestVstEvent copyEvent; + memcpy(©Event, event, Util::Min(size_t(event->byteSize), sizeof(copyEvent))); - bool Enqueue(const VstMidiSysexEvent &event, bool insertFront = false) - { - static_assert(sizeof(BiggestVstEvent) <= sizeof(VstMidiSysexEvent), "Also check implementation here."); EnterCriticalSection(&criticalSection); if(insertFront) { - eventQueue.push_front(event); + eventQueue.push_front(copyEvent); } else { - eventQueue.push_back(event); + eventQueue.push_back(copyEvent); } LeaveCriticalSection(&criticalSection); return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |