Skip to content

Commit 84ea68f

Browse files
committed
winmidi: add winrt::init_apartment in every example so that users do not encounter crashes
1 parent 99bd748 commit 84ea68f

22 files changed

Lines changed: 190 additions & 0 deletions

examples/c_api.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ int enumerate_ports(libremidi_midi_observer_handle* observer, struct enumerated_
104104

105105
int main(void)
106106
{
107+
#if defined(_WIN32)
108+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
109+
CoInitializeEx(NULL, COINIT_MULTITHREADED);
110+
#endif
111+
107112
int ret = 0;
108113

109114
/// Create an observer for MIDI ports

examples/cmidiin.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,20 @@
1111

1212
#include <libremidi/libremidi.hpp>
1313

14+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
15+
#include <winrt/base.h>
16+
#endif
17+
1418
#include <cstdlib>
1519
#include <iostream>
1620

1721
int main(int argc, const char** argv)
1822
{
23+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
24+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
25+
winrt::init_apartment();
26+
#endif
27+
1928
// Read command line arguments
2029
libremidi::examples::arguments args{argc, argv};
2130

examples/cmidiin2.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,20 @@
1111

1212
#include <libremidi/libremidi.hpp>
1313

14+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
15+
#include <winrt/base.h>
16+
#endif
17+
1418
#include <cstdlib>
1519
#include <iostream>
1620

1721
int main(int argc, const char** argv)
1822
{
23+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
24+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
25+
winrt::init_apartment();
26+
#endif
27+
1928
// Read command line arguments
2029
libremidi::examples::arguments args{argc, argv};
2130

examples/coroutines.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
#include <libremidi/libremidi.hpp>
44

5+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
6+
#include <winrt/base.h>
7+
#endif
8+
59
#include <boost/asio/detached.hpp>
610
#include <boost/cobalt.hpp>
711

@@ -25,6 +29,11 @@ struct channel
2529

2630
cobalt::main co_main(int argc, char** argv)
2731
{
32+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
33+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
34+
winrt::init_apartment();
35+
#endif
36+
2837
cobalt::channel<libremidi::message> channel_impl{64};
2938
libremidi::channel channel{channel_impl};
3039
libremidi::midi_in midiin{{.on_message = channel}};

examples/echo.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@
22

33
#include <libremidi/libremidi.hpp>
44

5+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
6+
#include <winrt/base.h>
7+
#endif
8+
59
#include <chrono>
610
#include <cstdlib>
711
#include <iostream>
812
#include <thread>
913

1014
int main()
1115
{
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+
1221
libremidi::observer obs;
1322
auto inputs = obs.get_input_ports();
1423
auto outputs = obs.get_output_ports();

examples/gui/main.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
#include <QSplitter>
99
#include <QWidget>
1010

11+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
12+
#include <winrt/base.h>
13+
#endif
14+
1115
Q_DECLARE_METATYPE(libremidi::port_information);
1216

1317
struct port_equal
@@ -27,6 +31,11 @@ struct port_name_sort
2731

2832
int main(int argc, char** argv)
2933
{
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
3039
using namespace libremidi;
3140
auto in_api = libremidi::midi1::in_default_configuration();
3241
auto out_api = libremidi::midi1::out_default_configuration();

examples/jack_share.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ struct my_app
8787

8888
int main()
8989
{
90+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
91+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
92+
winrt::init_apartment();
93+
#endif
94+
9095
my_app app{};
9196

9297
for (;;)

examples/midi1_to_midi2.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
#include <libremidi/backends.hpp>
44
#include <libremidi/libremidi.hpp>
55

6+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
7+
#include <winrt/base.h>
8+
#endif
9+
610
#include <iostream>
711

812
/**
@@ -12,6 +16,11 @@
1216
int main()
1317
try
1418
{
19+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
20+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
21+
winrt::init_apartment();
22+
#endif
23+
1524
// The observer object enumerates available inputs and outputs
1625
// jack is a MIDI 1 API (there's also jack_ump which leverages the newer
1726
// JACK / PipeWire MIDI 2 support).

examples/midi2_echo.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
#include <libremidi/backends.hpp>
22
#include <libremidi/libremidi.hpp>
33

4+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
5+
#include <winrt/base.h>
6+
#endif
7+
48
#include <iostream>
59
#include <mutex>
610

711
int main()
812
try
913
{
14+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
15+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
16+
winrt::init_apartment();
17+
#endif
18+
1019
using namespace libremidi;
1120
namespace lm2 = libremidi::midi2;
1221
// The observer object enumerates available inputs and outputs

examples/midi2_interop.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
#include <libremidi/libremidi.hpp>
44

5+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
6+
#include <winrt/base.h>
7+
#endif
8+
59
#include <midi/capability_inquiry.h>
610
#include <midi/midi1_byte_stream.h>
711
#include <midi/sysex_collector.h>
@@ -330,6 +334,11 @@ struct midi_ci_processor
330334
int main()
331335
try
332336
{
337+
#if defined(_WIN32) && __has_include(<winrt/base.h>)
338+
// Necessary for using WinUWP and WinMIDI, must be done as early as possible in your main()
339+
winrt::init_apartment();
340+
#endif
341+
333342
midi_ci_processor processor;
334343

335344
processor.open();

0 commit comments

Comments
 (0)