| @@ -6,12 +6,14 @@ | |||
| namespace rack { | |||
| struct MidiIO; | |||
| namespace midi { | |||
| struct IO; | |||
| } | |||
| struct MidiWidget : LedDisplay { | |||
| /** Not owned */ | |||
| MidiIO *midiIO = NULL; | |||
| midi::IO *midiIO = NULL; | |||
| LedDisplayChoice *driverChoice; | |||
| LedDisplaySeparator *driverSeparator; | |||
| LedDisplayChoice *deviceChoice; | |||
| @@ -7,18 +7,18 @@ | |||
| namespace rack { | |||
| struct BridgeMidiInputDevice : MidiInputDevice { | |||
| struct BridgeMidiInputDevice : midi::InputDevice { | |||
| }; | |||
| struct BridgeMidiDriver : MidiDriver { | |||
| struct BridgeMidiDriver : midi::Driver { | |||
| BridgeMidiInputDevice devices[16]; | |||
| std::string getName() override {return "Bridge";} | |||
| std::vector<int> getInputDeviceIds() override; | |||
| std::string getInputDeviceName(int deviceId) override; | |||
| MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| midi::InputDevice *subscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| void unsubscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| }; | |||
| @@ -7,7 +7,7 @@ namespace rack { | |||
| namespace gamepad { | |||
| struct InputDevice : MidiInputDevice { | |||
| struct InputDevice : midi::InputDevice { | |||
| int deviceId; | |||
| std::vector<uint8_t> ccs; | |||
| std::vector<bool> states; | |||
| @@ -15,15 +15,15 @@ struct InputDevice : MidiInputDevice { | |||
| }; | |||
| struct Driver : MidiDriver { | |||
| struct Driver : midi::Driver { | |||
| InputDevice devices[16]; | |||
| Driver(); | |||
| std::string getName() override {return "Gamepad";} | |||
| std::vector<int> getInputDeviceIds() override; | |||
| std::string getInputDeviceName(int deviceId) override; | |||
| MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| midi::InputDevice *subscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| void unsubscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| }; | |||
| @@ -8,7 +8,7 @@ namespace rack { | |||
| namespace keyboard { | |||
| struct InputDevice : MidiInputDevice { | |||
| struct InputDevice : midi::InputDevice { | |||
| int octave = 5; | |||
| std::map<int, int> pressedNotes; | |||
| void onKeyPress(int key); | |||
| @@ -16,14 +16,14 @@ struct InputDevice : MidiInputDevice { | |||
| }; | |||
| struct Driver : MidiDriver { | |||
| struct Driver : midi::Driver { | |||
| InputDevice device; | |||
| std::string getName() override {return "Computer keyboard";} | |||
| std::vector<int> getInputDeviceIds() override; | |||
| std::string getInputDeviceName(int deviceId) override; | |||
| MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| midi::InputDevice *subscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| void unsubscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| }; | |||
| @@ -7,9 +7,10 @@ | |||
| namespace rack { | |||
| namespace midi { | |||
| struct MidiMessage { | |||
| struct Message { | |||
| uint8_t cmd = 0x00; | |||
| uint8_t data1 = 0x00; | |||
| uint8_t data2 = 0x00; | |||
| @@ -29,50 +30,50 @@ struct MidiMessage { | |||
| }; | |||
| //////////////////// | |||
| // MidiDevice | |||
| // Device | |||
| //////////////////// | |||
| struct MidiDevice { | |||
| virtual ~MidiDevice() {} | |||
| struct Device { | |||
| virtual ~Device() {} | |||
| }; | |||
| struct MidiInput; | |||
| struct Input; | |||
| struct MidiInputDevice : MidiDevice { | |||
| std::set<MidiInput*> subscribed; | |||
| void subscribe(MidiInput *midiInput); | |||
| void unsubscribe(MidiInput *midiInput); | |||
| void onMessage(MidiMessage message); | |||
| struct InputDevice : Device { | |||
| std::set<Input*> subscribed; | |||
| void subscribe(Input *input); | |||
| void unsubscribe(Input *input); | |||
| void onMessage(Message message); | |||
| }; | |||
| struct MidiOutputDevice : MidiDevice { | |||
| struct OutputDevice : Device { | |||
| // TODO | |||
| }; | |||
| //////////////////// | |||
| // MidiDriver | |||
| // Driver | |||
| //////////////////// | |||
| struct MidiDriver { | |||
| virtual ~MidiDriver() {} | |||
| struct Driver { | |||
| virtual ~Driver() {} | |||
| virtual std::string getName() {return "";} | |||
| virtual std::vector<int> getInputDeviceIds() {return {};} | |||
| virtual std::string getInputDeviceName(int deviceId) {return "";} | |||
| virtual MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) {return NULL;} | |||
| virtual void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) {} | |||
| virtual InputDevice *subscribeInputDevice(int deviceId, Input *input) {return NULL;} | |||
| virtual void unsubscribeInputDevice(int deviceId, Input *input) {} | |||
| // virtual std::vector<int> getOutputDeviceIds() = 0; | |||
| // virtual std::string getOutputDeviceName(int deviceId) = 0; | |||
| // virtual MidiOutputDevice *subscribeOutputDevice(int deviceId, MidiOutput *midiOutput) = 0; | |||
| // virtual void unsubscribeOutputDevice(int deviceId, MidiOutput *midiOutput) = 0; | |||
| // virtual OutputDevice *subscribeOutputDevice(int deviceId, Output *midiOutput) = 0; | |||
| // virtual void unsubscribeOutputDevice(int deviceId, Output *midiOutput) = 0; | |||
| }; | |||
| //////////////////// | |||
| // MidiIO | |||
| // IO | |||
| //////////////////// | |||
| struct MidiIO { | |||
| struct IO { | |||
| int driverId = -1; | |||
| int deviceId = -1; | |||
| /* For MIDI output, the channel to output messages. | |||
| @@ -82,9 +83,9 @@ struct MidiIO { | |||
| */ | |||
| int channel = -1; | |||
| /** Not owned */ | |||
| MidiDriver *driver = NULL; | |||
| Driver *driver = NULL; | |||
| virtual ~MidiIO(); | |||
| virtual ~IO(); | |||
| std::vector<int> getDriverIds(); | |||
| std::string getDriverName(int driverId); | |||
| @@ -100,36 +101,38 @@ struct MidiIO { | |||
| }; | |||
| struct MidiInput : MidiIO { | |||
| MidiInput(); | |||
| ~MidiInput(); | |||
| struct Input : IO { | |||
| Input(); | |||
| ~Input(); | |||
| std::vector<int> getDeviceIds() override; | |||
| std::string getDeviceName(int deviceId) override; | |||
| void setDeviceId(int deviceId) override; | |||
| virtual void onMessage(MidiMessage message) {} | |||
| virtual void onMessage(Message message) {} | |||
| }; | |||
| struct MidiInputQueue : MidiInput { | |||
| struct InputQueue : Input { | |||
| int queueMaxSize = 8192; | |||
| std::queue<MidiMessage> queue; | |||
| void onMessage(MidiMessage message) override; | |||
| /** If a MidiMessage is available, writes `message` and return true */ | |||
| bool shift(MidiMessage *message); | |||
| std::queue<Message> queue; | |||
| void onMessage(Message message) override; | |||
| /** If a Message is available, writes `message` and return true */ | |||
| bool shift(Message *message); | |||
| }; | |||
| struct MidiOutput : MidiIO { | |||
| MidiOutput(); | |||
| ~MidiOutput(); | |||
| struct Output : IO { | |||
| Output(); | |||
| ~Output(); | |||
| void setDeviceId(int deviceId) override; | |||
| }; | |||
| void midiDestroy(); | |||
| void init(); | |||
| void destroy(); | |||
| /** Registers a new MIDI driver. Takes pointer ownership. */ | |||
| void midiDriverAdd(int driverId, MidiDriver *driver); | |||
| void addDriver(int driverId, Driver *driver); | |||
| } // namespace midi | |||
| } // namespace rack | |||
| @@ -14,7 +14,7 @@ | |||
| namespace rack { | |||
| struct RtMidiInputDevice : MidiInputDevice { | |||
| struct RtMidiInputDevice : midi::InputDevice { | |||
| RtMidiIn *rtMidiIn; | |||
| RtMidiInputDevice(int driverId, int deviceId); | |||
| @@ -22,7 +22,7 @@ struct RtMidiInputDevice : MidiInputDevice { | |||
| }; | |||
| struct RtMidiDriver : MidiDriver { | |||
| struct RtMidiDriver : midi::Driver { | |||
| int driverId; | |||
| /** Just for querying MIDI driver information */ | |||
| RtMidiIn *rtMidiIn; | |||
| @@ -34,8 +34,8 @@ struct RtMidiDriver : MidiDriver { | |||
| std::string getName() override; | |||
| std::vector<int> getInputDeviceIds() override; | |||
| std::string getInputDeviceName(int deviceId) override; | |||
| MidiInputDevice *subscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| void unsubscribeInputDevice(int deviceId, MidiInput *midiInput) override; | |||
| midi::InputDevice *subscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| void unsubscribeInputDevice(int deviceId, midi::Input *input) override; | |||
| }; | |||
| @@ -18,7 +18,7 @@ struct MIDICCToCVInterface : Module { | |||
| NUM_LIGHTS | |||
| }; | |||
| MidiInputQueue midiInput; | |||
| midi::InputQueue midiInput; | |||
| int8_t ccs[128]; | |||
| ExponentialFilter ccFilters[16]; | |||
| @@ -41,7 +41,7 @@ struct MIDICCToCVInterface : Module { | |||
| } | |||
| void step() override { | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| @@ -55,7 +55,7 @@ struct MIDICCToCVInterface : Module { | |||
| } | |||
| } | |||
| void processMessage(MidiMessage msg) { | |||
| void processMessage(midi::Message msg) { | |||
| switch (msg.status()) { | |||
| // cc | |||
| case 0xb: { | |||
| @@ -32,7 +32,7 @@ struct MIDIToCVInterface : Module { | |||
| NUM_LIGHTS | |||
| }; | |||
| MidiInputQueue midiInput; | |||
| midi::InputQueue midiInput; | |||
| uint8_t mod = 0; | |||
| ExponentialFilter modFilter; | |||
| @@ -142,7 +142,7 @@ struct MIDIToCVInterface : Module { | |||
| } | |||
| void step() override { | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| @@ -167,7 +167,7 @@ struct MIDIToCVInterface : Module { | |||
| outputs[CONTINUE_OUTPUT].value = continuePulse.process(deltaTime) ? 10.f : 0.f; | |||
| } | |||
| void processMessage(MidiMessage msg) { | |||
| void processMessage(midi::Message msg) { | |||
| // DEBUG("MIDI: %01x %01x %02x %02x", msg.status(), msg.channel(), msg.note(), msg.value()); | |||
| switch (msg.status()) { | |||
| @@ -206,7 +206,7 @@ struct MIDIToCVInterface : Module { | |||
| } | |||
| } | |||
| void processCC(MidiMessage msg) { | |||
| void processCC(midi::Message msg) { | |||
| switch (msg.note()) { | |||
| // mod | |||
| case 0x01: { | |||
| @@ -223,7 +223,7 @@ struct MIDIToCVInterface : Module { | |||
| } | |||
| } | |||
| void processSystem(MidiMessage msg) { | |||
| void processSystem(midi::Message msg) { | |||
| switch (msg.channel()) { | |||
| // Timing | |||
| case 0x8: { | |||
| @@ -18,7 +18,7 @@ struct MIDITriggerToCVInterface : Module { | |||
| NUM_LIGHTS | |||
| }; | |||
| MidiInputQueue midiInput; | |||
| midi::InputQueue midiInput; | |||
| bool gates[16]; | |||
| float gateTimes[16]; | |||
| @@ -67,7 +67,7 @@ struct MIDITriggerToCVInterface : Module { | |||
| } | |||
| void step() override { | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| @@ -88,7 +88,7 @@ struct MIDITriggerToCVInterface : Module { | |||
| } | |||
| } | |||
| void processMessage(MidiMessage msg) { | |||
| void processMessage(midi::Message msg) { | |||
| switch (msg.status()) { | |||
| // note off | |||
| case 0x8: { | |||
| @@ -23,7 +23,7 @@ struct QuadMIDIToCVInterface : Module { | |||
| NUM_LIGHTS | |||
| }; | |||
| MidiInputQueue midiInput; | |||
| midi::InputQueue midiInput; | |||
| enum PolyMode { | |||
| ROTATE_MODE, | |||
| @@ -243,7 +243,7 @@ struct QuadMIDIToCVInterface : Module { | |||
| } | |||
| void step() override { | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| while (midiInput.shift(&msg)) { | |||
| processMessage(msg); | |||
| } | |||
| @@ -258,7 +258,7 @@ struct QuadMIDIToCVInterface : Module { | |||
| } | |||
| } | |||
| void processMessage(MidiMessage msg) { | |||
| void processMessage(midi::Message msg) { | |||
| switch (msg.status()) { | |||
| // note off | |||
| case 0x8: { | |||
| @@ -286,7 +286,7 @@ struct QuadMIDIToCVInterface : Module { | |||
| } | |||
| } | |||
| void processCC(MidiMessage msg) { | |||
| void processCC(midi::Message msg) { | |||
| switch (msg.note()) { | |||
| // sustain | |||
| case 0x40: { | |||
| @@ -7,7 +7,7 @@ namespace rack { | |||
| struct MidiDriverItem : MenuItem { | |||
| MidiIO *midiIO; | |||
| midi::IO *midiIO; | |||
| int driverId; | |||
| void onAction(event::Action &e) override { | |||
| midiIO->setDriverId(driverId); | |||
| @@ -41,7 +41,7 @@ struct MidiDriverChoice : LedDisplayChoice { | |||
| }; | |||
| struct MidiDeviceItem : MenuItem { | |||
| MidiIO *midiIO; | |||
| midi::IO *midiIO; | |||
| int deviceId; | |||
| void onAction(event::Action &e) override { | |||
| midiIO->setDeviceId(deviceId); | |||
| @@ -83,7 +83,7 @@ struct MidiDeviceChoice : LedDisplayChoice { | |||
| }; | |||
| struct MidiChannelItem : MenuItem { | |||
| MidiIO *midiIO; | |||
| midi::IO *midiIO; | |||
| int channel; | |||
| void onAction(event::Action &e) override { | |||
| midiIO->channel = channel; | |||
| @@ -147,7 +147,7 @@ struct BridgeClientConnection { | |||
| } break; | |||
| case MIDI_MESSAGE_COMMAND: { | |||
| MidiMessage message; | |||
| midi::Message message; | |||
| if (!recv(&message, 3)) { | |||
| return; | |||
| } | |||
| @@ -203,7 +203,7 @@ struct BridgeClientConnection { | |||
| } | |||
| } | |||
| void processMidi(MidiMessage message) { | |||
| void processMidi(midi::Message message) { | |||
| if (!(0 <= port && port < BRIDGE_NUM_PORTS)) | |||
| return; | |||
| if (!driver) | |||
| @@ -387,19 +387,19 @@ std::string BridgeMidiDriver::getInputDeviceName(int deviceId) { | |||
| return string::f("Port %d", deviceId + 1); | |||
| } | |||
| MidiInputDevice *BridgeMidiDriver::subscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| midi::InputDevice *BridgeMidiDriver::subscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (!(0 <= deviceId && deviceId < 16)) | |||
| return NULL; | |||
| devices[deviceId].subscribe(midiInput); | |||
| devices[deviceId].subscribe(input); | |||
| return &devices[deviceId]; | |||
| } | |||
| void BridgeMidiDriver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| void BridgeMidiDriver::unsubscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (!(0 <= deviceId && deviceId < 16)) | |||
| return; | |||
| devices[deviceId].unsubscribe(midiInput); | |||
| devices[deviceId].unsubscribe(input); | |||
| } | |||
| @@ -408,7 +408,7 @@ void bridgeInit() { | |||
| serverThread = std::thread(serverRun); | |||
| driver = new BridgeMidiDriver; | |||
| midiDriverAdd(BRIDGE_DRIVER, driver); | |||
| midi::addDriver(BRIDGE_DRIVER, driver); | |||
| } | |||
| void bridgeDestroy() { | |||
| @@ -29,7 +29,7 @@ void InputDevice::step() { | |||
| ccs[i] = cc; | |||
| // Send MIDI message | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| // MIDI channel 1 | |||
| msg.cmd = (0xb << 4) | 0; | |||
| msg.data1 = i; | |||
| @@ -45,7 +45,7 @@ void InputDevice::step() { | |||
| if (state != states[i]) { | |||
| states[i] = state; | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| msg.cmd = ((state ? 0x9 : 0x8) << 4); | |||
| msg.data1 = i; | |||
| msg.data2 = 127; | |||
| @@ -82,25 +82,25 @@ std::string Driver::getInputDeviceName(int deviceId) { | |||
| return string::f(" %d (unavailable)", deviceId + 1); | |||
| } | |||
| MidiInputDevice *Driver::subscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| midi::InputDevice *Driver::subscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (!(0 <= deviceId && deviceId < 16)) | |||
| return NULL; | |||
| devices[deviceId].subscribe(midiInput); | |||
| devices[deviceId].subscribe(input); | |||
| return &devices[deviceId]; | |||
| } | |||
| void Driver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| void Driver::unsubscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (!(0 <= deviceId && deviceId < 16)) | |||
| return; | |||
| devices[deviceId].unsubscribe(midiInput); | |||
| devices[deviceId].unsubscribe(input); | |||
| } | |||
| void init() { | |||
| driver = new Driver; | |||
| midiDriverAdd(DRIVER, driver); | |||
| midi::addDriver(DRIVER, driver); | |||
| } | |||
| void step() { | |||
| @@ -69,7 +69,7 @@ void InputDevice::onKeyPress(int key) { | |||
| if (note > 127) | |||
| return; | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| msg.cmd = 0x9 << 4; | |||
| msg.data1 = note; | |||
| msg.data2 = 127; | |||
| @@ -82,7 +82,7 @@ void InputDevice::onKeyRelease(int key) { | |||
| auto it = pressedNotes.find(key); | |||
| if (it != pressedNotes.end()) { | |||
| int note = it->second; | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| msg.cmd = 0x8 << 4; | |||
| msg.data1 = note; | |||
| msg.data2 = 127; | |||
| @@ -103,25 +103,25 @@ std::string Driver::getInputDeviceName(int deviceId) { | |||
| return ""; | |||
| } | |||
| MidiInputDevice *Driver::subscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| midi::InputDevice *Driver::subscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (deviceId != 0) | |||
| return NULL; | |||
| device.subscribe(midiInput); | |||
| device.subscribe(input); | |||
| return &device; | |||
| } | |||
| void Driver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| void Driver::unsubscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (deviceId != 0) | |||
| return; | |||
| device.unsubscribe(midiInput); | |||
| device.unsubscribe(input); | |||
| } | |||
| void init() { | |||
| driver = new Driver; | |||
| midiDriverAdd(DRIVER, driver); | |||
| midi::addDriver(DRIVER, driver); | |||
| } | |||
| void press(int key) { | |||
| @@ -65,6 +65,7 @@ int main(int argc, char *argv[]) { | |||
| asset::init(devMode); | |||
| logger::init(devMode); | |||
| tagsInit(); | |||
| midi::init(); | |||
| rtmidiInit(); | |||
| bridgeInit(); | |||
| keyboard::init(); | |||
| @@ -130,7 +131,7 @@ int main(int argc, char *argv[]) { | |||
| plugin::destroy(); | |||
| ui::destroy(); | |||
| bridgeDestroy(); | |||
| midiDestroy(); | |||
| midi::destroy(); | |||
| logger::destroy(); | |||
| return 0; | |||
| @@ -4,52 +4,53 @@ | |||
| namespace rack { | |||
| namespace midi { | |||
| static std::vector<int> driverIds; | |||
| static std::map<int, MidiDriver*> drivers; | |||
| static std::map<int, Driver*> drivers; | |||
| //////////////////// | |||
| // MidiDevice | |||
| // Device | |||
| //////////////////// | |||
| void MidiInputDevice::subscribe(MidiInput *midiInput) { | |||
| subscribed.insert(midiInput); | |||
| void InputDevice::subscribe(Input *input) { | |||
| subscribed.insert(input); | |||
| } | |||
| void MidiInputDevice::unsubscribe(MidiInput *midiInput) { | |||
| // Remove MidiInput from subscriptions | |||
| auto it = subscribed.find(midiInput); | |||
| void InputDevice::unsubscribe(Input *input) { | |||
| // Remove Input from subscriptions | |||
| auto it = subscribed.find(input); | |||
| if (it != subscribed.end()) | |||
| subscribed.erase(it); | |||
| } | |||
| void MidiInputDevice::onMessage(MidiMessage message) { | |||
| for (MidiInput *midiInput : subscribed) { | |||
| midiInput->onMessage(message); | |||
| void InputDevice::onMessage(Message message) { | |||
| for (Input *input : subscribed) { | |||
| input->onMessage(message); | |||
| } | |||
| } | |||
| //////////////////// | |||
| // MidiDriver | |||
| // Driver | |||
| //////////////////// | |||
| //////////////////// | |||
| // MidiIO | |||
| // IO | |||
| //////////////////// | |||
| MidiIO::~MidiIO() { | |||
| IO::~IO() { | |||
| // Because of polymorphic destruction, descendants must call this in their own destructor | |||
| // setDriverId(-1); | |||
| } | |||
| std::vector<int> MidiIO::getDriverIds() { | |||
| std::vector<int> IO::getDriverIds() { | |||
| return driverIds; | |||
| } | |||
| std::string MidiIO::getDriverName(int driverId) { | |||
| std::string IO::getDriverName(int driverId) { | |||
| auto it = drivers.find(driverId); | |||
| if (it == drivers.end()) | |||
| return ""; | |||
| @@ -57,7 +58,7 @@ std::string MidiIO::getDriverName(int driverId) { | |||
| return it->second->getName(); | |||
| } | |||
| void MidiIO::setDriverId(int driverId) { | |||
| void IO::setDriverId(int driverId) { | |||
| // Destroy driver | |||
| setDeviceId(-1); | |||
| if (driver) { | |||
| @@ -73,14 +74,14 @@ void MidiIO::setDriverId(int driverId) { | |||
| } | |||
| } | |||
| std::string MidiIO::getChannelName(int channel) { | |||
| std::string IO::getChannelName(int channel) { | |||
| if (channel == -1) | |||
| return "All channels"; | |||
| else | |||
| return string::f("Channel %d", channel + 1); | |||
| } | |||
| json_t *MidiIO::toJson() { | |||
| json_t *IO::toJson() { | |||
| json_t *rootJ = json_object(); | |||
| json_object_set_new(rootJ, "driver", json_integer(driverId)); | |||
| std::string deviceName = getDeviceName(deviceId); | |||
| @@ -90,7 +91,7 @@ json_t *MidiIO::toJson() { | |||
| return rootJ; | |||
| } | |||
| void MidiIO::fromJson(json_t *rootJ) { | |||
| void IO::fromJson(json_t *rootJ) { | |||
| json_t *driverJ = json_object_get(rootJ, "driver"); | |||
| if (driverJ) | |||
| setDriverId(json_integer_value(driverJ)); | |||
| @@ -113,34 +114,34 @@ void MidiIO::fromJson(json_t *rootJ) { | |||
| } | |||
| //////////////////// | |||
| // MidiInput | |||
| // Input | |||
| //////////////////// | |||
| MidiInput::MidiInput() { | |||
| Input::Input() { | |||
| if (driverIds.size() >= 1) { | |||
| setDriverId(driverIds[0]); | |||
| } | |||
| } | |||
| MidiInput::~MidiInput() { | |||
| Input::~Input() { | |||
| setDriverId(-1); | |||
| } | |||
| std::vector<int> MidiInput::getDeviceIds() { | |||
| std::vector<int> Input::getDeviceIds() { | |||
| if (driver) { | |||
| return driver->getInputDeviceIds(); | |||
| } | |||
| return {}; | |||
| } | |||
| std::string MidiInput::getDeviceName(int deviceId) { | |||
| std::string Input::getDeviceName(int deviceId) { | |||
| if (driver) { | |||
| return driver->getInputDeviceName(deviceId); | |||
| } | |||
| return ""; | |||
| } | |||
| void MidiInput::setDeviceId(int deviceId) { | |||
| void Input::setDeviceId(int deviceId) { | |||
| // Destroy device | |||
| if (driver && this->deviceId >= 0) { | |||
| driver->unsubscribeInputDevice(this->deviceId, this); | |||
| @@ -154,7 +155,7 @@ void MidiInput::setDeviceId(int deviceId) { | |||
| } | |||
| } | |||
| void MidiInputQueue::onMessage(MidiMessage message) { | |||
| void InputQueue::onMessage(Message message) { | |||
| // Filter channel | |||
| if (channel >= 0) { | |||
| if (message.status() != 0xf && message.channel() != channel) | |||
| @@ -166,7 +167,7 @@ void MidiInputQueue::onMessage(MidiMessage message) { | |||
| queue.push(message); | |||
| } | |||
| bool MidiInputQueue::shift(MidiMessage *message) { | |||
| bool InputQueue::shift(Message *message) { | |||
| if (!message) | |||
| return false; | |||
| if (!queue.empty()) { | |||
| @@ -178,17 +179,17 @@ bool MidiInputQueue::shift(MidiMessage *message) { | |||
| } | |||
| //////////////////// | |||
| // MidiOutput | |||
| // Output | |||
| //////////////////// | |||
| MidiOutput::MidiOutput() { | |||
| Output::Output() { | |||
| } | |||
| MidiOutput::~MidiOutput() { | |||
| Output::~Output() { | |||
| setDriverId(-1); | |||
| } | |||
| void MidiOutput::setDeviceId(int deviceId) { | |||
| void Output::setDeviceId(int deviceId) { | |||
| // TODO | |||
| } | |||
| @@ -196,7 +197,10 @@ void MidiOutput::setDeviceId(int deviceId) { | |||
| // midi | |||
| //////////////////// | |||
| void midiDestroy() { | |||
| void init() { | |||
| } | |||
| void destroy() { | |||
| driverIds.clear(); | |||
| for (auto &pair : drivers) { | |||
| delete pair.second; | |||
| @@ -204,11 +208,12 @@ void midiDestroy() { | |||
| drivers.clear(); | |||
| } | |||
| void midiDriverAdd(int driverId, MidiDriver *driver) { | |||
| void addDriver(int driverId, Driver *driver) { | |||
| assert(driver); | |||
| driverIds.push_back(driverId); | |||
| drivers[driverId] = driver; | |||
| } | |||
| } // namespace midi | |||
| } // namespace rack | |||
| @@ -11,7 +11,7 @@ static void midiInputCallback(double timeStamp, std::vector<unsigned char> *mess | |||
| RtMidiInputDevice *midiInputDevice = (RtMidiInputDevice*) userData; | |||
| if (!midiInputDevice) return; | |||
| MidiMessage msg; | |||
| midi::Message msg; | |||
| if (message->size() >= 1) | |||
| msg.cmd = (*message)[0]; | |||
| if (message->size() >= 2) | |||
| @@ -77,7 +77,7 @@ std::string RtMidiDriver::getInputDeviceName(int deviceId) { | |||
| return ""; | |||
| } | |||
| MidiInputDevice *RtMidiDriver::subscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| midi::InputDevice *RtMidiDriver::subscribeInputDevice(int deviceId, midi::Input *input) { | |||
| if (!(0 <= deviceId && deviceId < (int) rtMidiIn->getPortCount())) | |||
| return NULL; | |||
| RtMidiInputDevice *device = devices[deviceId]; | |||
| @@ -85,16 +85,16 @@ MidiInputDevice *RtMidiDriver::subscribeInputDevice(int deviceId, MidiInput *mid | |||
| devices[deviceId] = device = new RtMidiInputDevice(driverId, deviceId); | |||
| } | |||
| device->subscribe(midiInput); | |||
| device->subscribe(input); | |||
| return device; | |||
| } | |||
| void RtMidiDriver::unsubscribeInputDevice(int deviceId, MidiInput *midiInput) { | |||
| void RtMidiDriver::unsubscribeInputDevice(int deviceId, midi::Input *input) { | |||
| auto it = devices.find(deviceId); | |||
| if (it == devices.end()) | |||
| return; | |||
| RtMidiInputDevice *device = it->second; | |||
| device->unsubscribe(midiInput); | |||
| device->unsubscribe(input); | |||
| // Destroy device if nothing is subscribed anymore | |||
| if (device->subscribed.empty()) { | |||
| @@ -109,8 +109,8 @@ void rtmidiInit() { | |||
| RtMidi::getCompiledApi(rtApis); | |||
| for (RtMidi::Api api : rtApis) { | |||
| int driverId = (int) api; | |||
| MidiDriver *driver = new RtMidiDriver(driverId); | |||
| midiDriverAdd(driverId, driver); | |||
| midi::Driver *driver = new RtMidiDriver(driverId); | |||
| midi::addDriver(driverId, driver); | |||
| } | |||
| } | |||