static void my_flush_events(struct SoundIoPrivate *si, bool wait) { SoundIo *soundio = &si->pub; SoundIoJack *sij = &si->backend_data.jack; int err; bool cb_shutdown = false; soundio_os_mutex_lock(sij->mutex); if (wait) soundio_os_cond_wait(sij->cond, sij->mutex); if (sij->is_shutdown && !sij->emitted_shutdown_cb) { sij->emitted_shutdown_cb = true; cb_shutdown = true; } soundio_os_mutex_unlock(sij->mutex); if (cb_shutdown) { soundio->on_backend_disconnect(soundio, SoundIoErrorBackendDisconnected); } else { if (!sij->refresh_devices_flag.test_and_set()) { if ((err = refresh_devices(si))) { sij->refresh_devices_flag.clear(); } else { soundio->on_devices_change(soundio); } } } }
static void my_flush_events(SoundIoPrivate *si, bool wait) { SoundIo *soundio = &si->pub; SoundIoPulseAudio *sipa = &si->backend_data.pulseaudio; bool change = false; bool cb_shutdown = false; SoundIoDevicesInfo *old_devices_info = nullptr; pa_threaded_mainloop_lock(sipa->main_loop); if (wait) pa_threaded_mainloop_wait(sipa->main_loop); if (sipa->device_scan_queued && !sipa->connection_err) { sipa->device_scan_queued = false; sipa->connection_err = refresh_devices(si); cleanup_refresh_devices(si); } if (sipa->connection_err && !sipa->emitted_shutdown_cb) { sipa->emitted_shutdown_cb = true; cb_shutdown = true; } else if (sipa->ready_devices_info) { old_devices_info = si->safe_devices_info; si->safe_devices_info = sipa->ready_devices_info; sipa->ready_devices_info = nullptr; change = true; } pa_threaded_mainloop_unlock(sipa->main_loop); if (cb_shutdown) soundio->on_backend_disconnect(soundio, sipa->connection_err); else if (change) soundio->on_devices_change(soundio); soundio_destroy_devices_info(old_devices_info); }