You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.5KB

  1. #include "global_pre.hpp"
  2. #include "vstmidi.hpp"
  3. #include <map>
  4. #include "global.hpp"
  5. extern void vst2_lock_midi_device(void);
  6. extern void vst2_unlock_midi_device(void);
  7. namespace rack {
  8. // static void midiInputCallback(double timeStamp, std::vector<unsigned char> *message, void *userData) {
  9. // if (!message) return;
  10. // if (!userData) return;
  11. // RtMidiInputDevice *midiInputDevice = (RtMidiInputDevice*) userData;
  12. // if (!midiInputDevice) return;
  13. // MidiMessage msg;
  14. // if (message->size() >= 1)
  15. // msg.cmd = (*message)[0];
  16. // if (message->size() >= 2)
  17. // msg.data1 = (*message)[1];
  18. // if (message->size() >= 3)
  19. // msg.data2 = (*message)[2];
  20. // midiInputDevice->onMessage(msg);
  21. // }
  22. VSTMidiInputDevice::VSTMidiInputDevice(int driverId, int deviceId) {
  23. }
  24. VSTMidiInputDevice::~VSTMidiInputDevice() {
  25. }
  26. VSTMidiDriver::VSTMidiDriver(int driverId) {
  27. device = NULL;
  28. }
  29. VSTMidiDriver::~VSTMidiDriver() {
  30. if(NULL != device)
  31. delete device;
  32. }
  33. std::string VSTMidiDriver::getName() {
  34. return "VST";
  35. }
  36. std::vector<int> VSTMidiDriver::getInputDeviceIds() {
  37. std::vector<int> deviceIds;
  38. deviceIds.push_back(0);
  39. return deviceIds;
  40. }
  41. std::string VSTMidiDriver::getInputDeviceName(int deviceId) {
  42. if(0 == deviceId)
  43. return std::string("VST MIDI Input Device");
  44. return "";
  45. }
  46. MidiInputDevice *VSTMidiDriver::subscribeInputDevice(int deviceId, MidiInput *midiInput) {
  47. if(0 != deviceId)
  48. return NULL;
  49. if (!device) {
  50. device = new VSTMidiInputDevice(VST_DRIVER, deviceId);
  51. vst2_lock_midi_device();
  52. global->vst2.midi_device = device;
  53. vst2_unlock_midi_device();
  54. }
  55. device->subscribe(midiInput);
  56. return device;
  57. }
  58. void VSTMidiDriver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) {
  59. if(0 != deviceId)
  60. return;
  61. device->unsubscribe(midiInput);
  62. // Destroy device if nothing is subscribed anymore
  63. if (device->subscribed.empty()) {
  64. vst2_lock_midi_device();
  65. delete device;
  66. device = NULL;
  67. global->vst2.midi_device = NULL;
  68. vst2_unlock_midi_device();
  69. }
  70. }
  71. void vstmidiInit() {
  72. MidiDriver *driver = new VSTMidiDriver(VST_DRIVER);
  73. midiDriverAdd(VST_DRIVER, driver);
  74. }
  75. } // namespace rack
  76. void vst2_process_midi_input_event(sU8 _a, sU8 _b, sU8 _c) {
  77. // (note) vst midi device mutex is locked by caller
  78. if(NULL != rack::global->vst2.midi_device)
  79. {
  80. rack::MidiMessage msg;
  81. msg.cmd = _a;
  82. msg.data1 = _b;
  83. msg.data2 = _c;
  84. rack::global->vst2.midi_device->onMessage(msg);
  85. }
  86. }