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

device.h (3103B)


      1 #pragma once
      2 
      3 #include <cstdint>
      4 #include <cstddef>
      5 #include <string>
      6 
      7 #include "audioTypes.h"
      8 #include "deviceTypes.h"
      9 
     10 #include "midiTypes.h"
     11 #include "buildconfig.h"
     12 #include "midiTranslator.h"
     13 
     14 #include "asmjit/core/api-config.h"
     15 
     16 #include "baseLib/md5.h"
     17 
     18 namespace synthLib
     19 {
     20 	struct DeviceCreateParams
     21 	{
     22 		float preferredSamplerate = 0.0f;
     23 		float hostSamplerate = 0.0f;
     24 		std::string romName;
     25 		std::vector<uint8_t> romData;
     26 		baseLib::MD5 romHash;
     27 		uint32_t customData = 0;
     28 	};
     29 
     30 	class Device
     31 	{
     32 	public:
     33 		Device(const DeviceCreateParams& _params);
     34 		Device(const Device&) = delete;
     35 		Device(Device&&) = delete;
     36 
     37 		virtual ~Device();
     38 
     39 		Device& operator = (const Device&) = delete;
     40 		Device& operator = (Device&&) = delete;
     41 
     42 		virtual void process(const TAudioInputs& _inputs, const TAudioOutputs& _outputs, size_t _size, const std::vector<SMidiEvent>& _midiIn, std::vector<SMidiEvent>& _midiOut);
     43 
     44 		void setExtraLatencySamples(uint32_t _size);
     45 		uint32_t getExtraLatencySamples() const { return m_extraLatency; }
     46 
     47 		virtual uint32_t getInternalLatencyMidiToOutput() const { return 0; }
     48 		virtual uint32_t getInternalLatencyInputToOutput() const { return 0; }
     49 
     50 		virtual void getSupportedSamplerates(std::vector<float>& _dst) const
     51 		{
     52 			_dst.push_back(getSamplerate());
     53 		}
     54 		virtual float getSamplerate() const = 0;
     55 		virtual void getPreferredSamplerates(std::vector<float>& _dst) const
     56 		{
     57 			return getSupportedSamplerates(_dst);
     58 		}
     59 
     60 		bool isSamplerateSupported(const float& _samplerate) const;
     61 
     62 		virtual bool setSamplerate(float _samplerate);
     63 
     64 		float getDeviceSamplerate(float _preferredDeviceSamplerate, float _hostSamplerate) const;
     65 		float getDeviceSamplerateForHostSamplerate(float _hostSamplerate) const;
     66 
     67 		auto& getDeviceCreateParams() { return m_createParams; }
     68 		const auto& getDeviceCreateParams() const { return m_createParams; }
     69 
     70 		virtual bool isValid() const = 0;
     71 
     72 #if SYNTHLIB_DEMO_MODE == 0
     73 		virtual bool getState(std::vector<uint8_t>& _state, StateType _type) = 0;
     74 		virtual bool setState(const std::vector<uint8_t>& _state, StateType _type) = 0;
     75 		virtual bool setStateFromUnknownCustomData(const std::vector<uint8_t> &_state) { return false; }
     76 #endif
     77 
     78 		virtual uint32_t getChannelCountIn() = 0;
     79 		virtual uint32_t getChannelCountOut() = 0;
     80 
     81 		virtual bool setDspClockPercent(uint32_t _percent = 100) = 0;
     82 		virtual uint32_t getDspClockPercent() const = 0;
     83 		virtual uint64_t getDspClockHz() const = 0;
     84 
     85 
     86 		ASMJIT_NOINLINE virtual void release(std::vector<SMidiEvent>& _events);
     87 
     88 		auto& getMidiTranslator() { return m_midiTranslator; }
     89 
     90 	protected:
     91 		virtual void readMidiOut(std::vector<SMidiEvent>& _midiOut) = 0;
     92 		virtual void processAudio(const TAudioInputs& _inputs, const TAudioOutputs& _outputs, size_t _samples) = 0;
     93 		virtual bool sendMidi(const SMidiEvent& _ev, std::vector<SMidiEvent>& _response) = 0;
     94 
     95 		void dummyProcess(uint32_t _numSamples);
     96 
     97 	private:
     98 		DeviceCreateParams m_createParams;
     99 		std::vector<SMidiEvent> m_midiIn;
    100 
    101 		uint32_t m_extraLatency = 0;
    102 
    103 		MidiTranslator m_midiTranslator;
    104 		std::vector<SMidiEvent> m_translatorOut;
    105 	};
    106 }