demoplayback.h (1437B)
1 #pragma once 2 3 #include <cstdint> 4 #include <string> 5 #include <vector> 6 7 namespace virusLib 8 { 9 class Microcontroller; 10 11 class DemoPlayback 12 { 13 public: 14 DemoPlayback(Microcontroller& _mc) : m_mc(_mc) {} 15 virtual ~DemoPlayback() = default; 16 17 virtual bool loadFile(const std::string& _filename); 18 virtual bool loadBinData(const std::vector<uint8_t>& _data); 19 20 virtual void process(uint32_t _samples); 21 22 protected: 23 void writeRawData(const std::vector<uint8_t>& _data) const; 24 void setTimeScale(const float _timeScale) { m_timeScale = _timeScale; } 25 void stop(); 26 27 private: 28 enum class EventType 29 { 30 MidiSysex, 31 Midi, 32 RawSerial 33 }; 34 35 struct Event 36 { 37 EventType type = EventType::MidiSysex; 38 std::vector<uint8_t> data; 39 uint8_t delay = 0; 40 }; 41 42 Event parseSysex(const uint8_t* _data, uint32_t _count) const; 43 Event parseMidi(const uint8_t* _data); 44 45 bool parseData(const std::vector<uint8_t>& _data); 46 47 bool processEvent(const Event& _event) const; 48 49 virtual size_t getEventCount() const { return m_events.size(); } 50 virtual uint32_t getEventDelay(const size_t _index) const { return m_events[_index].delay; } 51 virtual bool processEvent(const size_t _index) { return processEvent(m_events[_index]); } 52 53 protected: 54 Microcontroller& m_mc; 55 56 private: 57 std::vector<Event> m_events; 58 int32_t m_remainingDelay = 0; 59 uint32_t m_currentEvent = 0; 60 61 float m_timeScale = 54.0f; 62 bool m_stop = false; 63 }; 64 }