| 30 | }; |
| 31 | |
| 32 | int main(int argc, char** argv) |
| 33 | { |
| 34 | #if defined(_WIN32) && __has_include(<winrt/base.h>) |
| 35 | // Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main() |
| 36 | // In addition, we are using Qt in this example which requires COM to be in single-thread mode. |
| 37 | winrt::init_apartment(winrt::apartment_type::single_threaded); |
| 38 | #endif |
| 39 | using namespace libremidi; |
| 40 | auto in_api = libremidi::midi1::in_default_configuration(); |
| 41 | auto out_api = libremidi::midi1::out_default_configuration(); |
| 42 | auto observer_api = libremidi::midi1::observer_default_configuration(); |
| 43 | |
| 44 | // Create the GUI |
| 45 | QApplication app{argc, argv}; |
| 46 | QSplitter main; |
| 47 | QListWidget inputs, outputs, messages; |
| 48 | main.addWidget(&inputs); |
| 49 | main.addWidget(&messages); |
| 50 | main.addWidget(&outputs); |
| 51 | |
| 52 | main.show(); |
| 53 | |
| 54 | std::map<libremidi::input_port, QListWidgetItem*, port_name_sort> input_items; |
| 55 | std::map<libremidi::output_port, QListWidgetItem*, port_name_sort> output_items; |
| 56 | |
| 57 | // Define the observer callbacks which will fill the list widgets with the input & output devices |
| 58 | observer_configuration conf{.input_added = [&](const input_port& p) { |
| 59 | auto item = new QListWidgetItem{QString::fromStdString(p.display_name)}; |
| 60 | item->setData(Qt::UserRole, QVariant::fromValue(p)); |
| 61 | input_items[p] = item; |
| 62 | |
| 63 | inputs.addItem(item); |
| 64 | }, .input_removed = [&](const input_port& p) { |
| 65 | if (auto it = input_items.find(p); it != input_items.end()) |
| 66 | { |
| 67 | for(int i = 0; i < inputs.count(); i++) { |
| 68 | if(auto item = inputs.item(i); item == it->second) { |
| 69 | delete inputs.takeItem(i); |
| 70 | break; |
| 71 | } |
| 72 | } |
| 73 | input_items.erase(it); |
| 74 | } |
| 75 | }, .output_added = [&](const output_port& p) { |
| 76 | auto item = new QListWidgetItem{QString::fromStdString(p.display_name)}; |
| 77 | item->setData(Qt::UserRole, QVariant::fromValue(p)); |
| 78 | output_items[p] = item; |
| 79 | |
| 80 | outputs.addItem(item); |
| 81 | }, .output_removed = [&](const output_port& p) { |
| 82 | if (auto it = output_items.find(p); it != output_items.end()) |
| 83 | { |
| 84 | for(int i = 0; i < outputs.count(); i++) { |
| 85 | if(auto item = outputs.item(i); item == it->second) { |
| 86 | delete outputs.takeItem(i); |
| 87 | break; |
| 88 | } |
| 89 | } |
nothing calls this directly
no test coverage detected