wHardware.h (1529B)
1 #pragma once 2 3 #include <cstdint> 4 #include <functional> 5 6 #include "dsp56kEmu/ringbuffer.h" 7 #include "dsp56kEmu/types.h" 8 9 #include "synthLib/midiTypes.h" 10 11 namespace hwLib 12 { 13 class SciMidi; 14 } 15 16 namespace mc68k 17 { 18 class Mc68k; 19 } 20 21 namespace dsp56k 22 { 23 class Audio; 24 } 25 26 namespace wLib 27 { 28 class Hardware 29 { 30 public: 31 Hardware(const double& _samplerate); 32 virtual ~Hardware() = default; 33 34 virtual hwLib::SciMidi& getMidi() = 0; 35 virtual mc68k::Mc68k& getUc() = 0; 36 37 void haltDSP(); 38 void resumeDSP(); 39 40 void ucYieldLoop(const std::function<bool()>& _continue); 41 42 void sendMidi(const synthLib::SMidiEvent& _ev); 43 void receiveMidi(std::vector<uint8_t>& _data); 44 45 protected: 46 void onEsaiCallback(dsp56k::Audio& _audio); 47 void syncUcToDSP(); 48 void processMidiInput(); 49 50 // timing 51 const double m_samplerateInv; 52 uint32_t m_esaiFrameIndex = 0; 53 uint32_t m_lastEsaiFrameIndex = 0; 54 int64_t m_remainingUcCycles = 0; 55 double m_remainingUcCyclesD = 0; 56 57 dsp56k::RingBuffer<synthLib::SMidiEvent, 16384, true> m_midiIn; 58 uint32_t m_midiOffsetCounter = 0; 59 60 std::vector<dsp56k::TWord> m_dummyInput; 61 std::vector<dsp56k::TWord> m_dummyOutput; 62 63 std::mutex m_esaiFrameAddedMutex; 64 dsp56k::ConditionVariable m_esaiFrameAddedCv; 65 66 std::mutex m_requestedFramesAvailableMutex; 67 dsp56k::ConditionVariable m_requestedFramesAvailableCv; 68 size_t m_requestedFrames = 0; 69 70 bool m_haltDSP = false; 71 dsp56k::ConditionVariable m_haltDSPcv; 72 std::mutex m_haltDSPmutex; 73 bool m_processAudio = false; 74 bool m_bootCompleted = false; 75 }; 76 }