Skip to content

Commit 99bd748

Browse files
committed
winmidi: fixes, fix double notification in constructor
1 parent d5be00d commit 99bd748

3 files changed

Lines changed: 28 additions & 16 deletions

File tree

include/libremidi/backends/winmidi/midi_in.hpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,16 @@ class midi_in_impl final
186186

187187
stdx::error close_port() override
188188
{
189+
if(!m_endpoint)
190+
return std::errc::not_connected;
191+
189192
#if !LIBREMIDI_WINMIDI_HAS_COM_EXTENSIONS
190193
m_endpoint.MessageReceived(m_revoke_token);
191194
#else
192-
m_raw_endpoint->RemoveMessagesReceivedCallback();
195+
if(m_raw_endpoint) {
196+
m_raw_endpoint->RemoveMessagesReceivedCallback();
197+
m_raw_endpoint = nullptr;
198+
}
193199
#endif
194200
m_session.DisconnectEndpointConnection(m_endpoint.ConnectionId());
195201
return stdx::error{};

include/libremidi/backends/winmidi/midi_out.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ class midi_out_impl final
5757

5858
stdx::error close_port() override
5959
{
60+
if(!m_endpoint)
61+
return std::errc::not_connected;
62+
6063
m_session.DisconnectEndpointConnection(m_endpoint.ConnectionId());
6164
return stdx::error{};
6265
}

include/libremidi/backends/winmidi/observer.hpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,19 @@ class observer_impl final
2929
std::map<hstring, std::vector<input_port>> m_known_input_devices;
3030
std::map<hstring, std::vector<output_port>> m_known_output_devices;
3131
std::mutex m_devices_mtx;
32+
std::atomic_bool m_in_constructor{true};
3233

3334
explicit observer_impl(
3435
libremidi::observer_configuration&& conf, winmidi::observer_configuration&& apiconf)
3536
: configuration{std::move(conf), std::move(apiconf)}
3637
{
38+
struct on_delete { observer_impl& self; ~on_delete() { self.m_in_constructor = false; } } on_delete{*this};
39+
3740
if (!configuration.has_callbacks())
3841
return;
3942

40-
if (configuration.notify_in_constructor)
41-
{
42-
if (configuration.input_added)
43-
for (const auto& p : get_input_ports())
44-
configuration.input_added(p);
45-
46-
if (configuration.output_added)
47-
for (const auto& p : get_output_ports())
48-
configuration.output_added(p);
49-
}
50-
43+
// Note: winmidi also notifies for existing devices, so the "notify in constructor"
44+
// is handled in the callbacks
5145
if ((watcher = MidiEndpointDeviceWatcher::Create()))
5246
{
5347
namespace enumeration = winrt::Windows::Devices::Enumeration;
@@ -204,7 +198,9 @@ class observer_impl final
204198
std::lock_guard _{m_devices_mtx};
205199
m_known_input_devices[ep.EndpointDeviceId()].push_back(ip);
206200
}
207-
configuration.input_added(std::move(ip));
201+
202+
if(!m_in_constructor || configuration.notify_in_constructor)
203+
configuration.input_added(std::move(ip));
208204
}
209205
if (configuration.output_added)
210206
{
@@ -213,7 +209,9 @@ class observer_impl final
213209
std::lock_guard _{m_devices_mtx};
214210
m_known_output_devices[ep.EndpointDeviceId()].push_back(op);
215211
}
216-
configuration.output_added(std::move(op));
212+
213+
if(!m_in_constructor || configuration.notify_in_constructor)
214+
configuration.output_added(std::move(op));
217215
}
218216
break;
219217
}
@@ -225,7 +223,9 @@ class observer_impl final
225223
std::lock_guard _{m_devices_mtx};
226224
m_known_input_devices[ep.EndpointDeviceId()].push_back(ip);
227225
}
228-
configuration.input_added(std::move(ip));
226+
227+
if(!m_in_constructor || configuration.notify_in_constructor)
228+
configuration.input_added(std::move(ip));
229229
}
230230
break;
231231
case MidiGroupTerminalBlockDirection::BlockOutput:
@@ -236,12 +236,15 @@ class observer_impl final
236236
std::lock_guard _{m_devices_mtx};
237237
m_known_output_devices[ep.EndpointDeviceId()].push_back(op);
238238
}
239-
configuration.output_added(std::move(op));
239+
240+
if(!m_in_constructor || configuration.notify_in_constructor)
241+
configuration.output_added(std::move(op));
240242
}
241243
break;
242244
}
243245
}
244246
}
247+
245248
void remove_device(hstring eid)
246249
{
247250
std::vector<input_port> to_remove_in;

0 commit comments

Comments
 (0)