| 12 | #include <thread> |
| 13 | |
| 14 | int main() |
| 15 | { |
| 16 | #if defined(_WIN32) && __has_include(<winrt/base.h>) |
| 17 | // Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main() |
| 18 | winrt::init_apartment(); |
| 19 | #endif |
| 20 | |
| 21 | libremidi::observer obs; |
| 22 | auto inputs = obs.get_input_ports(); |
| 23 | auto outputs = obs.get_output_ports(); |
| 24 | |
| 25 | if (inputs.size() == 0) |
| 26 | { |
| 27 | std::cerr << "No available input port.\n"; |
| 28 | return -1; |
| 29 | } |
| 30 | if (outputs.size() == 0) |
| 31 | { |
| 32 | std::cerr << "No available output port.\n"; |
| 33 | return -1; |
| 34 | } |
| 35 | |
| 36 | libremidi::midi_out midiout{ |
| 37 | libremidi::output_configuration{}, libremidi::midi_out_configuration_for(obs)}; |
| 38 | |
| 39 | libremidi::midi_in midiin{ |
| 40 | { |
| 41 | // Set our callback function. |
| 42 | .on_message = |
| 43 | [&](const libremidi::message& message) { |
| 44 | std::cout << message << std::endl; |
| 45 | auto _ = midiout.send_message(message); |
| 46 | }, |
| 47 | }, |
| 48 | libremidi::midi_in_configuration_for(obs)}; |
| 49 | |
| 50 | if (stdx::error err = midiout.open_port(outputs[0]); err.is_set()) |
| 51 | { |
| 52 | } |
| 53 | if (!midiout.is_port_connected()) |
| 54 | { |
| 55 | std::cerr << "Could not connect to midi out\n"; |
| 56 | return -1; |
| 57 | } |
| 58 | midiin.open_port(inputs[0]); |
| 59 | if (!midiin.is_port_connected()) |
| 60 | { |
| 61 | std::cerr << "Could not connect to midi in\n"; |
| 62 | return -1; |
| 63 | } |
| 64 | |
| 65 | std::cout << "Creating an echo bridge: " << inputs[0].display_name << " => " |
| 66 | << outputs[0].display_name << "\n"; |
| 67 | while (1) |
| 68 | std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
| 69 | char input; |
| 70 | std::cin.get(input); |
| 71 | } |
nothing calls this directly
no test coverage detected