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.

104 lines
2.2KB

  1. #include <context.hpp>
  2. #include <midiloopback.hpp>
  3. namespace rack {
  4. namespace midiloopback {
  5. static const int DRIVER_ID = -12;
  6. struct Device : midi::InputDevice, midi::OutputDevice {
  7. std::string getName() override {
  8. return "Loopback";
  9. }
  10. void sendMessage(const midi::Message& message) override {
  11. onMessage(message);
  12. }
  13. };
  14. struct Driver : midi::Driver {
  15. std::string getName() override {
  16. return "Loopback";
  17. }
  18. // Input methods
  19. std::vector<int> getInputDeviceIds() override {
  20. return {0};
  21. }
  22. int getDefaultInputDeviceId() override {
  23. return 0;
  24. }
  25. std::string getInputDeviceName(int deviceId) override {
  26. return getDevice(deviceId)->getName();
  27. }
  28. midi::InputDevice* subscribeInput(int deviceId, midi::Input* input) override {
  29. midi::InputDevice* inputDevice = getDevice(deviceId);
  30. if (!inputDevice)
  31. return NULL;
  32. inputDevice->subscribe(input);
  33. return inputDevice;
  34. }
  35. void unsubscribeInput(int deviceId, midi::Input* input) override {
  36. midi::InputDevice* inputDevice = getDevice(deviceId);
  37. if (!inputDevice)
  38. return;
  39. inputDevice->unsubscribe(input);
  40. }
  41. // Output methods
  42. std::vector<int> getOutputDeviceIds() override {
  43. return {0};
  44. }
  45. int getDefaultOutputDeviceId() override {
  46. return 0;
  47. }
  48. std::string getOutputDeviceName(int deviceId) override {
  49. return getDevice(deviceId)->getName();
  50. }
  51. midi::OutputDevice* subscribeOutput(int deviceId, midi::Output* output) override {
  52. midi::OutputDevice* outputDevice = getDevice(deviceId);
  53. if (!outputDevice)
  54. return NULL;
  55. outputDevice->subscribe(output);
  56. return outputDevice;
  57. }
  58. void unsubscribeOutput(int deviceId, midi::Output* output) override {
  59. midi::OutputDevice* outputDevice = getDevice(deviceId);
  60. if (!outputDevice)
  61. return;
  62. outputDevice->unsubscribe(output);
  63. }
  64. // Custom methods
  65. Device* getDevice(int deviceId) {
  66. if (!APP->midiLoopbackContext)
  67. return NULL;
  68. if (deviceId != 0)
  69. return NULL;
  70. return APP->midiLoopbackContext->devices[deviceId];
  71. }
  72. };
  73. Context::Context() {
  74. devices[0] = new Device;
  75. }
  76. Context::~Context() {
  77. delete devices[0];
  78. }
  79. void init() {
  80. Driver* driver = new Driver;
  81. midi::addDriver(DRIVER_ID, driver);
  82. }
  83. } // namespace midiloopback
  84. } // namespace rack