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

midiports.cpp (2506B)


      1 #include "midiports.h"
      2 
      3 #include "processor.h"
      4 
      5 #include "juce_audio_devices/juce_audio_devices.h"
      6 
      7 namespace pluginLib
      8 {
      9 	MidiPorts::MidiPorts(Processor& _processor) : m_processor(_processor)
     10 	{
     11 	}
     12 
     13 	MidiPorts::~MidiPorts()
     14 	{
     15 		setMidiInput({});
     16 		setMidiOutput({});
     17 
     18 		m_deviceManager.reset();
     19 	}
     20 
     21 	juce::MidiOutput *MidiPorts::getMidiOutput() const
     22 	{
     23 		return m_midiOutput.get();
     24 	}
     25 
     26 	juce::MidiInput *MidiPorts::getMidiInput() const
     27 	{
     28 		return m_midiInput.get();
     29 	}
     30 
     31 	juce::String MidiPorts::getInputId() const
     32 	{
     33 		return getMidiInput() != nullptr ? getMidiInput()->getIdentifier() : juce::String();
     34 	}
     35 
     36 	juce::String MidiPorts::getOutputId() const
     37 	{
     38 		return getMidiOutput() != nullptr ? getMidiOutput()->getIdentifier() : juce::String();
     39 	}
     40 
     41 	void MidiPorts::saveChunkData(baseLib::BinaryStream& _binaryStream) const
     42 	{
     43 		baseLib::ChunkWriter cw(_binaryStream, "mpIO", 1);
     44 
     45 		if(m_midiInput)
     46 			_binaryStream.write(m_midiInput->getIdentifier().toStdString());
     47 		else
     48 			_binaryStream.write(std::string());
     49 		if(m_midiOutput)
     50 			_binaryStream.write(m_midiOutput->getIdentifier().toStdString());
     51 		else
     52 			_binaryStream.write(std::string());
     53 	}
     54 
     55 	void MidiPorts::loadChunkData(baseLib::ChunkReader& _cr)
     56 	{
     57 		_cr.add("mpIO", 1, [&](baseLib::BinaryStream& _data, uint32_t)
     58 		{
     59 			const auto input = _data.readString();
     60 			const auto output = _data.readString();
     61 
     62 			setMidiInput(input);
     63 			setMidiOutput(output);
     64 		});
     65 	}
     66 
     67 	bool MidiPorts::setMidiOutput(const juce::String& _out)
     68 	{
     69 		if (m_midiOutput != nullptr && m_midiOutput->isBackgroundThreadRunning())
     70 		{
     71 			m_midiOutput->stopBackgroundThread();
     72 		}
     73 		if(_out.isEmpty())
     74 			return false;
     75 		m_midiOutput = juce::MidiOutput::openDevice(_out);
     76 		if (m_midiOutput != nullptr)
     77 		{
     78 			m_midiOutput->startBackgroundThread();
     79 			return true;
     80 		}
     81 		return false;
     82 	}
     83 
     84 	bool MidiPorts::setMidiInput(const juce::String& _in)
     85 	{
     86 		if (m_midiInput != nullptr)
     87 		{
     88 			m_midiInput->stop();
     89 		}
     90 
     91 		if(_in.isEmpty())
     92 			return false;
     93 
     94 		if(!m_deviceManager)
     95 			m_deviceManager.reset(new juce::AudioDeviceManager());
     96 
     97 		if (!m_deviceManager->isMidiInputDeviceEnabled(_in))
     98 			m_deviceManager->setMidiInputDeviceEnabled(_in, true);
     99 
    100 		m_midiInput = juce::MidiInput::openDevice(_in, this);
    101 		if (m_midiInput != nullptr)
    102 		{
    103 			m_midiInput->start();
    104 			return true;
    105 		}
    106 		return false;
    107 	}
    108 
    109 	void MidiPorts::handleIncomingMidiMessage(juce::MidiInput* _source, const juce::MidiMessage& _message)
    110 	{
    111 		m_processor.handleIncomingMidiMessage(_source, _message);
    112 	}
    113 }