@@ -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