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

hdi08Queue.h (1163B)


      1 #pragma once
      2 
      3 #include <vector>
      4 #include <deque>
      5 #include <mutex>
      6 
      7 #include "dsp56kEmu/types.h"
      8 
      9 namespace dsp56k
     10 {
     11 	class HDI08;
     12 }
     13 
     14 namespace virusLib
     15 {
     16 	class Hdi08Queue
     17 	{
     18 	public:
     19 		Hdi08Queue(dsp56k::HDI08& _hdi08);
     20 		Hdi08Queue(Hdi08Queue&& _s) noexcept
     21 		: m_hdi08(_s.m_hdi08)
     22 		, m_dataRX(std::move(_s.m_dataRX))
     23 		, m_lastHostFlag0(_s.m_lastHostFlag0)
     24 		, m_lastHostFlag1(_s.m_lastHostFlag1)
     25 		, m_nextHostFlags(_s.m_nextHostFlags)
     26 		{
     27 		}
     28 		Hdi08Queue(const Hdi08Queue&) = delete;
     29 
     30 		void writeRX(const std::vector<dsp56k::TWord>& _data);
     31 		void writeRX(const dsp56k::TWord* _data, size_t _count);
     32 
     33 		void writeHostFlags(uint8_t _flag0, uint8_t _flag1);
     34 
     35 		void exec();
     36 
     37 		bool rxEmpty() const;
     38 
     39 		dsp56k::HDI08& get() const { return m_hdi08; }
     40 
     41 	private:
     42 		bool rxFull() const;
     43 		bool needsToWaitforHostFlags(uint8_t _flag0, uint8_t _flag1) const;
     44 		void sendPendingData();
     45 
     46 		static constexpr uint8_t HostFlagInvalid = 0xff;
     47 
     48 		dsp56k::HDI08& m_hdi08;
     49 		std::deque<dsp56k::TWord> m_dataRX;
     50 
     51 		uint8_t m_lastHostFlag0 = HostFlagInvalid;
     52 		uint8_t m_lastHostFlag1 = HostFlagInvalid;
     53 
     54 		uint32_t m_nextHostFlags = 0;
     55 
     56 		mutable std::mutex m_mutex;
     57 	};
     58 }