diff foosdk/sdk/foobar2000/SDK/main_thread_callback.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/SDK/main_thread_callback.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,74 @@
+#include "foobar2000-sdk-pch.h"
+#include "main_thread_callback.h"
+#include "abort_callback.h"
+#include <memory>
+#include <pfc/synchro.h>
+
+
+void main_thread_callback::callback_enqueue() {
+	main_thread_callback_manager::get()->add_callback(this);
+}
+
+void main_thread_callback_add(main_thread_callback::ptr ptr) {
+	main_thread_callback_manager::get()->add_callback(ptr);
+}
+
+namespace {
+    typedef std::function<void ()> func_t;
+	class mtcallback_func : public main_thread_callback {
+	public:
+		mtcallback_func(func_t const& f) : m_f(f) {}
+
+		void callback_run() noexcept override {
+			m_f();
+		}
+    private:
+        func_t m_f;
+    };
+}
+
+void fb2k::inMainThread( std::function<void () > f ) {
+    main_thread_callback_add( new service_impl_t<mtcallback_func>(f));
+}
+
+void fb2k::inMainThread(std::function<void() > f, abort_callback& a) {
+	auto abort = std::make_shared< abort_callback_clone >(a);
+	inMainThread([f, abort] {
+		if (!abort->is_set()) f();
+	});
+}
+
+void fb2k::inMainThread2( std::function<void () > f ) {
+	if ( core_api::is_main_thread() ) {
+		f();
+	} else {
+		inMainThread(f);
+	}
+}
+
+void fb2k::inMainThreadSynchronous(std::function<void() > f, abort_callback & abort) {
+	abort.check();
+
+	if (core_api::is_main_thread()) {
+		f(); return;
+	}
+
+	auto evt = std::make_shared<pfc::event>();
+	auto f2 = [f, evt] {
+		f();
+		evt->set_state(true);
+	};
+	inMainThread(f2);
+	abort.waitForEvent(*evt);
+}
+
+void fb2k::inMainThreadSynchronous2(std::function<void() > f) {
+	// Have new API?
+	auto api = main_thread_callback_manager_v2::tryGet();
+	if (api.is_valid()) {
+		api->run_synchronously( fb2k::service_new<mtcallback_func>(f) );
+		return;
+	}
+
+	inMainThreadSynchronous(f, fb2k::noAbort);
+}
\ No newline at end of file