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.

70 lines
1.5KB

  1. #include "rtmidi.hpp"
  2. namespace rack {
  3. static void midiInputCallback(double timeStamp, std::vector<unsigned char> *message, void *userData) {
  4. if (!message) return;
  5. if (!userData) return;
  6. RtMidiInputDevice *midiInputDevice = (RtMidiInputDevice*) userData;
  7. if (!midiInputDevice) return;
  8. MidiMessage msg;
  9. if (message->size() >= 1)
  10. msg.cmd = (*message)[0];
  11. if (message->size() >= 2)
  12. msg.data1 = (*message)[1];
  13. if (message->size() >= 3)
  14. msg.data2 = (*message)[2];
  15. midiInputDevice->onMessage(msg);
  16. }
  17. RtMidiInputDevice::RtMidiInputDevice(int driver, int device) {
  18. rtMidiIn = new RtMidiIn((RtMidi::Api) driver, "VCV Rack");
  19. rtMidiIn->ignoreTypes(false, false, false);
  20. rtMidiIn->setCallback(midiInputCallback, this);
  21. }
  22. RtMidiInputDevice::~RtMidiInputDevice() {
  23. rtMidiIn->closePort();
  24. delete rtMidiIn;
  25. }
  26. std::vector<int> rtmidiGetDrivers() {
  27. std::vector<RtMidi::Api> rtApis;
  28. RtMidi::getCompiledApi(rtApis);
  29. std::vector<int> drivers;
  30. for (RtMidi::Api api : rtApis) {
  31. drivers.push_back((int) api);
  32. }
  33. return drivers;
  34. }
  35. int rtmidiGetDeviceCount(int driver) {
  36. RtMidiIn *rtMidiIn = new RtMidiIn((RtMidi::Api) driver);
  37. int count = rtMidiIn->getPortCount();
  38. delete rtMidiIn;
  39. return count;
  40. }
  41. std::string rtmidiGetDeviceName(int driver, int device) {
  42. RtMidiIn *rtMidiIn = new RtMidiIn((RtMidi::Api) driver);
  43. std::string name = rtMidiIn->getPortName(device);
  44. delete rtMidiIn;
  45. return name;
  46. }
  47. RtMidiInputDevice *rtmidiGetDevice(int driver, int device) {
  48. // TODO Pull from cache
  49. return new RtMidiInputDevice(driver, device);
  50. }
  51. } // namespace rack