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 }