gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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 }