123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- #pragma once
- #include "openmpt/all/BuildSettings.hpp"
- #include <deque>
- #include "mpt/mutex/mutex.hpp"
- #include "VstDefinitions.h"
- OPENMPT_NAMESPACE_BEGIN
- class VstEventQueue : public Vst::VstEvents
- {
- protected:
-
-
- union Event
- {
- Vst::VstEvent event;
- Vst::VstMidiEvent midi;
- Vst::VstMidiSysexEvent sysex;
- };
-
- std::deque<Event> eventQueue;
-
-
- mpt::mutex criticalSection;
- public:
- VstEventQueue()
- {
- numEvents = 0;
- reserved = 0;
- std::fill(std::begin(events), std::end(events), nullptr);
- }
-
- size_t GetNumQueuedEvents()
- {
- return eventQueue.size() - numEvents;
- }
-
-
- bool Enqueue(const Vst::VstEvent *event, bool insertFront = false)
- {
- MPT_ASSERT(event->type != Vst::kVstSysExType || event->byteSize == sizeof(Vst::VstMidiSysexEvent));
- MPT_ASSERT(event->type != Vst::kVstMidiType || event->byteSize == sizeof(Vst::VstMidiEvent));
- Event copyEvent;
- size_t copySize;
-
-
- if(event->type == Vst::kVstSysExType)
- copySize = sizeof(Vst::VstMidiSysexEvent);
- else if(event->type == Vst::kVstMidiType)
- copySize = sizeof(Vst::VstMidiEvent);
- else
- copySize = std::min(size_t(event->byteSize), sizeof(copyEvent));
- memcpy(©Event, event, copySize);
- if(event->type == Vst::kVstSysExType)
- {
-
- auto &e = copyEvent.sysex;
- auto sysexDump = new (std::nothrow) std::byte[e.dumpBytes];
- if(sysexDump == nullptr)
- return false;
- memcpy(sysexDump, e.sysexDump, e.dumpBytes);
- e.sysexDump = sysexDump;
- }
- mpt::lock_guard<mpt::mutex> lock(criticalSection);
- if(insertFront)
- eventQueue.push_front(copyEvent);
- else
- eventQueue.push_back(copyEvent);
- return true;
- }
-
- int32 Finalise()
- {
- mpt::lock_guard<mpt::mutex> lock(criticalSection);
- numEvents = static_cast<int32>(std::min(eventQueue.size(), MAX_EVENTS));
- for(int32 i = 0; i < numEvents; i++)
- {
- events[i] = &eventQueue[i].event;
- }
- return numEvents;
- }
-
- void Clear()
- {
- mpt::lock_guard<mpt::mutex> lock(criticalSection);
- if(numEvents)
- {
-
- for(auto e = eventQueue.begin(); e != eventQueue.begin() + numEvents; ++e)
- {
- if(e->event.type == Vst::kVstSysExType)
- {
- delete[] e->sysex.sysexDump;
- }
- }
- eventQueue.erase(eventQueue.begin(), eventQueue.begin() + numEvents);
- numEvents = 0;
- }
- }
- };
- OPENMPT_NAMESPACE_END
|