#define SOL_ALL_SAFETIES_ON 1 #include #include #include "sol.hpp" static guint default_node_sig = 0, get_volume_sig = 0, set_volume_sig = 0; static guint default_node(gpointer api) { if (default_node_sig == 0) default_node_sig = g_signal_lookup("get-default-node", G_TYPE_FROM_INSTANCE(api)); guint retval; g_signal_emit(api, default_node_sig, 0, "Audio/Sink", &retval); return retval; } static std::tuple get_volume(gpointer api, guint32 id) { if (get_volume_sig == 0) get_volume_sig = g_signal_lookup("get-volume", G_TYPE_FROM_INSTANCE(api)); GVariant *variant = nullptr; g_signal_emit(api, get_volume_sig, 0, id, &variant); gdouble volumed; gboolean mute; g_variant_lookup(variant, "volume", "d", &volumed); g_variant_lookup(variant, "mute", "b", &mute); if (variant) g_variant_unref(variant); return std::tuple(std::round(volumed * 100.0), mute == 1); } static void set_volume(gpointer api, guint32 id, guint voli, bool mute) { if (set_volume_sig == 0) set_volume_sig = g_signal_lookup("set-volume", G_TYPE_FROM_INSTANCE(api)); g_auto(GVariantBuilder) b = G_VARIANT_BUILDER_INIT(G_VARIANT_TYPE_VARDICT); g_variant_builder_add(&b, "{sv}", "volume", g_variant_new_double(((gdouble)voli)/100)); g_variant_builder_add(&b, "{sv}", "mute", g_variant_new_boolean(mute ? TRUE : FALSE)); GVariant *variant = g_variant_builder_end(&b); gboolean res; g_signal_emit(api, set_volume_sig, 0, id, variant, &res); } extern "C" int luaopen_libpwcall(lua_State *L) { sol::state_view lua(L); auto tbl = lua.create_table(); tbl.set_function("default_node", default_node); tbl.set_function("get_volume", get_volume); tbl.set_function("set_volume", set_volume); sol::stack::push(L, tbl); return 1; }