Git Product home page Git Product logo

rust-obs-plugins's Introduction

Rust OBS Wrapper

Build Status Wrapper Docs

A safe wrapper around the OBS API, useful for creating OBS sources, filters and effects. The wrapper is quite incomplete and will most likely see dramatic API changes in the future.

This repo also includes plugins creating using the wrapper in the /plugins folder.

Plugins

Folder Description
/scroll-focus-filter an OBS filter that will zoom into the currently focused X window
/rnnoise-denoiser-filter an OBS filter for removing background noise from your Mic

Usage

In your Cargo.toml file add the following section, substituting <module-name> for the name of the module:

[dependencies]
obs-wrapper = "0.4"

[lib]
name = "<module-name>"
crate-type = ["cdylib"]

The process for creating a plugin is:

  1. Create a struct that implements Module
  2. Create a struct that will store the plugin state
  3. Implement the required traits for the module
  4. Enable the traits which have been enabled in the module load method
use obs_wrapper::{
    // Everything required for modules
    prelude::*,
    // Everything required for creating a source
    source::*,
    // Macro for registering modules
    obs_register_module,
    // Macro for creating strings
    obs_string,
};

// The module that will handle creating the source.
struct TestModule {
    context: ModuleRef
}

// The source that will be shown inside OBS.
struct TestSource;

// Implement the Sourceable trait for TestSource, this is required for each source.
// It allows you to specify the source ID and type.
impl Sourceable for TestSource {
    fn get_id() -> ObsString {
        obs_string!("test_source")
    }

    fn get_type() -> SourceType {
        SourceType::Filter
    }

    fn create(create: &mut CreatableSourceContext<Self>, source: SourceContext) -> Self {
        Self
    }
}

// Allow OBS to show a name for the source
impl GetNameSource for TestSource {
    fn get_name() -> ObsString {
        obs_string!("Test Source")
    }
}

// Implement the Module trait for TestModule. This will handle the creation of the source and
// has some methods for telling OBS a bit about itself.
impl Module for TestModule {
    fn new(context: ModuleRef) -> Self {
        Self { context }
    }

    fn get_ctx(&self) -> &ModuleRef {
        &self.context
    }

    // Load the module - create all sources, returning true if all went well.
    fn load(&mut self, load_context: &mut LoadContext) -> bool {
        // Create the source
        let source = load_context
            .create_source_builder::<TestSource>()
            // Since GetNameSource is implemented, this method needs to be called to
            // enable it.
            .enable_get_name()
            .build();

        // Tell OBS about the source so that it will show it.
        load_context.register_source(source);

        // Nothing could have gone wrong, so return true.
        true
    }

    fn description() -> ObsString {
        obs_string!("A great test module.")
    }

    fn name() -> ObsString {
        obs_string!("Test Module")
    }

    fn author() -> ObsString {
        obs_string!("Bennett")
    }
}

obs_register_module!(TestModule);

Installation

  1. Run cargo build --release
  2. Copy /target/release/<module-name>.so to your OBS plugins folder (/usr/lib/obs-plugins/)
  3. The plugin should be available for use from inside OBS

License

Like obs-studio, obs-wrapper is licensed under GNU General Public License v2.0.

See LICENSE for details.

rust-obs-plugins's People

Contributors

agrif avatar beaux44 avatar bennetthardwick avatar chengyuhui avatar clouds56 avatar eminence avatar fenhl avatar iwillspeak avatar obelisk avatar p1n3appl3 avatar widberg avatar yoshinorisano avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rust-obs-plugins's Issues

STATUS_DLL_NOT_FOUND

I'm trying to use obs-sys but I get STATUS_DLL_NOT_FOUND.
I tried #45 and adding the LIBOBS_PATH="C:\Program Files\obs-studio\bin\64bit" but it doesn't help.

EDIT: This is a runtime error, it compiles fine.
EDIT2: I'm not using obs-wrapper as I don't want a plugin, but to use the API to start/stop recording and open/close OBS from a program.
EDIT3: I got it to work putting the binary in the bin/64bit folder but I need it to work in the editor and without it being in that folder.

Can't seem to use multiple log levels in the same plugin

I've tried different configurations of log's feature flags and with_promote_debug & with_max_level from this crate and have found that when I set the max log level (through with_max_level) to a log level L, instead of enabling all log levels >=L it enables just L.

The feature flags from log seem to have no effect on this and I think I know why (maybe they cause the disabled log functions to be left out of the shared object entirely?).

Here's an example (can reproduce on my machine ™️ ) and the relevant lines from the OBS log:

00:44:04.130:   Loaded Modules:
00:44:04.130:     testing.so
[a bunch of lines omitted for brevity]
00:44:14.453: (INFO) [testing] Info
00:44:14.453: User added filter 'Testing' (my_plugin_source) to source 'Desktop Audio'

EDIT:

$ obs --version
OBS Studio - 27.0.1-3 (linux)

Question on the newly added set_default API

Hi, I have a question on the newly added set_default API.
I want to use that API for loading a string default value.
But, it is very complicated for me...

I wrote code like this:
yoshinorisano/obs-biquad-filter-plugin@7d658d9#diff-b1a35a68f14e696205874893c07fd24fdb88882b47c23cc0e0c80a30c7d53759R170

settings.set_default::<std::borrow::Cow<'_, str>>(obs_string!("filter_type"), std::borrow::Cow::Borrowed("low_pass"));

It works. But, it is not optimal.
I want to use the following const to remove the code duplication, but I cannot find how to do that.

const DEFAULT_FILTER_TYPE: ObsString = obs_string!("low_pass");

@bennetthardwick
If you have some good idea, could you please let me know...?

Plugin doesn't appear in list

I followed the instructions using the example plugin but couldn't achieve a working result.
Clicking on the filters list didn't yield the expected result. Indeed it simply wasn't there.

I'm on nixos, I've tested with /usr/lib/obs-plugins/ along with ~/.config/obs-studio/plugins/bin/
please advise.

Does not compile on 64-bit Windows

error: could not compile `obs-wrapper`

To learn more, run the command again with --verbose.
error[E0308]: mismatched types
  --> C:\Users\fenhl\.cargo\registry\src\github.com-1ecc6299db9ec823\obs-wrapper-0.1.6\src\module.rs:29:44
   |
29 |             obs_register_source_s(pointer, std::mem::size_of::<obs_source_info>() as u64);
   |                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `u32`, found `u64`
   |
help: you can convert a `u64` to a `u32` and panic if the converted value doesn't fit
   |
29 |             obs_register_source_s(pointer, (std::mem::size_of::<obs_source_info>() as u64).try_into().unwrap());
   |                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Let me know if you need additional info.

Adding a source to a scene

I'm trying to make a plugin where on the creation of my source, I would like to create a private browser source and add it to the current scene. From what I have gathered, it appears I require the OBS Frontend API in order to do this, which is not currently exposed in the FFI. Is there a way around this limitation, or could these mappings be added in some way?

[Discussion] Design of hotkey API?

I was about to implement obs_hotkey_register_source, which looks like this:

pub fn obs_hotkey_register_source(
        source: *mut obs_source_t,
        name: *const ::std::os::raw::c_char,
        description: *const ::std::os::raw::c_char,
        func: obs_hotkey_func,
        data: *mut ::std::os::raw::c_void,
    ) -> obs_hotkey_id;

This API seems to be undocumented, but used in almost every plugin. By convention, this is called in create, in which we don't really have our Box<DataWrapper<D>> ready. However, without data this thing is useless. Any idea on how I can approach this?

In C, we control the malloc process, so we can throw the pointer into this function, on Rust, this seems impossible.

Doesn't compile on Debian

Hi, I'm unable to compile example plugins on Debian 12.

image

Full compiler output ~/rust/rust-obs-plugins/plugins/scroll-focus-filter $ cargo build

Compiling libc v0.2.148
Compiling memchr v2.6.3
Compiling proc-macro2 v1.0.67
Compiling unicode-ident v1.0.12
Compiling glob v0.3.1
Compiling autocfg v1.1.0
Compiling prettyplease v0.2.15
Compiling rustix v0.38.14
Compiling lazy_static v1.4.0
Compiling linux-raw-sys v0.4.7
Compiling cfg-if v1.0.0
Compiling regex-syntax v0.7.5
Compiling log v0.4.20
Compiling bitflags v2.4.0
Compiling minimal-lexical v0.2.1
Compiling libloading v0.7.4
Compiling bindgen v0.65.1
Compiling either v1.9.0
Compiling home v0.5.5
Compiling lazycell v1.3.0
Compiling proc-macro-hack v0.5.20+deprecated
Compiling rustc-hash v1.1.0
Compiling peeking_take_while v0.1.2
Compiling shlex v1.2.0
Compiling clang-sys v1.6.1
Compiling bitflags v1.3.2
Compiling serde v1.0.188
Compiling num-traits v0.2.16
Compiling crossbeam-utils v0.7.2
Compiling serde_json v1.0.107
Compiling maybe-uninit v2.0.0
Compiling aho-corasick v1.1.1
Compiling nom v7.1.3
Compiling quote v1.0.33
Compiling cfg-if v0.1.10
Compiling syn v2.0.37
Compiling ryu v1.0.15
Compiling itoa v1.0.9
Compiling crossbeam-channel v0.4.4
Compiling paste-impl v0.1.18
Compiling xcb v0.9.0
Compiling regex-automata v0.3.8
Compiling paste v0.1.18
Compiling which v4.4.2
Compiling cexpr v0.6.0
Compiling regex v1.9.5
Compiling obs-sys v0.3.0 (/home/ioann/rust/rust-obs-plugins/obs-sys)
Compiling xcb-util v0.3.0
warning: Could not find obs headers - using pre-compiled.
warning: This could result in a library that doesn't work.
Compiling obs-wrapper v0.4.1 (/home/ioann/rust/rust-obs-plugins)
Compiling scroll-focus-filter v0.1.0 (/home/ioann/rust/rust-obs-plugins/plugins/scroll-focus-filter)
error: linking with cc failed: exit status: 1
|
= note: LC_ALL="C" PATH="/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/ioann/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" VSLANG="1033" "cc" "-Wl,--version-script=/tmp/rustcYnz5nJ/list" "-Wl,--no-undefined-version" "-m64" "/tmp/rustcYnz5nJ/symbols.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.120dlw301pgb49uf.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.15iwwukc14eicjce.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.16r20jvizd9h9lre.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1b33qx4axuhh6g16.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1cup3i7hxzl8l1ir.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1dh8tpdxmuh85t9i.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1f9u6zb42b995u0p.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1ipv3gvla9papubq.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1l7jg3ayiwuarb1q.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1nijg87i0vyrdy7x.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1ose2g40k1sl88r3.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1pjd6sxj6qmbpmfc.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1q0g9i5ncfk2vr07.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1qb1g2nj7rth94lw.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1vbcs4stdwt99ypm.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1yayul1o081po5il.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1ybxiyws5v0fnbir.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.212cekp0yvbc252v.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.21nh6xgs4x6xcwoy.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.220e8eai8cqemz95.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.22n7am67nxrihzl7.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.22p4l61mym6cnhc0.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.29goh8b4vknv1ax5.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2b77tlsk77ihj3il.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2bnlshp0ybu6x4k7.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2dch6okose12axhz.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2g9hcrci0bbr7cx5.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2gjxjy2lqajjhr5l.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2hmfg4b1sgwxojwx.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2m9ujbom6pz8fhb7.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2mm36c6vygdb98vp.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2py2w07vw1kj43ry.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2s2rao47bmcu20vy.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2t1vffmz15744fqd.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2u2nb00yzq0ah73k.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2ywjpnee0dsszaua.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.2zwi2ikwbtp1kt04.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.306mxgfz1oqr64mj.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3441xv357noy53dw.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3fx8xarwqm0mlc6c.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3ni3zkmn7au58wz1.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3o36ku0ycmouaf3.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3ojkb76gyqqvznfu.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3pe6z9fznv7zwou5.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3q14310fbynoyluk.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3qczjpatj07h4udu.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3tucysc65l6jb4yq.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3uutt8bwh1sjy89q.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3v867h60is2w93jd.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3ytt1ffibcocx10l.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3z49eu0dm3pxy6f8.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.3zam25l305hg60cf.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.43y3pt22pnf43h23.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.44ezsxsyzg2gumry.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.45wpdrcg3qow0b1v.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.461pwpl0x0eobqzw.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.46fn25g079dyy7h.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.490e9b3gy8uauv1l.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.49jr0s3qnozlstrs.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4eouhyu68mpbdooi.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4fuqmlrf23ub8ew0.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4fz102kywycrp29q.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4gc3qldxqwwyr15d.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4gfltwcyjou2xjp5.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4hbvua3xrb1f5mo9.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4i3x21wgk39noskm.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4lmfvfavpd8uuj5v.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4mmhce1jgcv1vr2w.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4qa6rive40yj9s6y.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4rukwgo9jxklpcik.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4thfr97somre3p2i.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4v5z27stov8vc5kf.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4yza5hosq4fiw2qv.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.4z6nad5vhpgz5f1w.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.51s0g7abc9pb1hsj.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.51vld3y7bgjknl26.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.533g83n613m9bhts.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.54b2z9m4ugv3vw56.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.54zl7m3o2tzjsp1f.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.5bmwm36fa6p24bwt.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.5cfd3mou4kl431qg.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.5crazg8pq98libic.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.6gp94jd80gmf39l.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.753wzgszvtk1vo4.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.91gk2lsywad7lsh.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.9rro2ffj2g2w5mr.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.asl9tk97duz0r5s.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.e4dk2fcl280t7ej.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.g8qmhke3nbohr0k.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.irq382awwlmfrcm.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.ktx5mmmw9t59mpm.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.kys2dhnqlve5nh7.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.ld7iacze3yjmcmq.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.m5plceaa5x7cb3n.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.n5za2h0ed5es9rk.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.oa07ejhqmfyet0n.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.obm8w6qdmkhzfhc.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.qe99jpvdp84x03j.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.r2bzavitg7phhr3.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.rfm5mevs7y7hp4v.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.y3n39dpsrichrvd.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.ysxb76sqkho8bav.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.zdgng2ha26owqxq.rcgu.o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/scrollfocus.1juk520oraorvd46.rcgu.o" "-Wl,--as-needed" "-L" "/home/ioann/rust/rust-obs-plugins/target/debug/deps" "-L" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libcrossbeam_channel-16895e261db507e3.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libmaybe_uninit-32ef4f3e28d77828.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libcrossbeam_utils-02284e1e82422f37.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/liblazy_static-ea967ec45ae077a3.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libcfg_if-747b03c4ddc718bc.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libobs_wrapper-59a2383c71852763.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libnum_traits-9b4795cefd04bea4.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libpaste-0874ca32b194aade.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libobs_sys-6a142e14287b35ea.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libxcb_util-e7f0ad1d62ef8961.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libxcb-75f040a999ee2580.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/liblog-bdcf9f693d28b597.rlib" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/liblibc-aacc4d374f09b581.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-b850d2b001350814.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-a3d926e3ce38f6cc.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-0a660adf51e0d01c.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-49252de8bfa771e2.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-6f52a21444f37c70.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-57e8575f0ca731a2.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-da4065b9a8ae7be4.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-1ad47776352198ff.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-7075f8a8dc932a7c.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-a494eb4ddbb000f0.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-672778ed8628861b.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-9bba1c59dcc21440.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-b9849fb628ce12eb.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-0ea4fcc08eb96f77.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-a8ba743c059cc198.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-e4195ee2443e1656.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-04991604e2730fd6.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-f02db372677d4667.rlib" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-448eba810c83029d.rlib" "-Wl,-Bdynamic" "-lobs" "-lobs-frontend-api" "-lxcb-ewmh" "-lxcb" "-lxcb-randr" "-lxcb-render" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-z,noexecstack" "-L" "/home/ioann/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/home/ioann/rust/rust-obs-plugins/target/debug/deps/libscrollfocus.so" "-Wl,--gc-sections" "-shared" "-Wl,-z,relro,-z,now" "-nodefaultlibs"
= note: /usr/bin/ld: cannot find -lobs: No such file or directory
/usr/bin/ld: cannot find -lobs-frontend-api: No such file or directory
/usr/bin/ld: cannot find -lxcb-ewmh: No such file or directory
/usr/bin/ld: cannot find -lxcb: No such file or directory
/usr/bin/ld: cannot find -lxcb-randr: No such file or directory
/usr/bin/ld: cannot find -lxcb-render: No such file or directory
collect2: error: ld returned 1 exit status

error: could not compile scroll-focus-filter (lib) due to previous error

The issue is that ld cannot link obs & xcb libraries. But ldconfig -p shows they are present:

sudo ldconfig -p | grep obs
    libobsglad.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libobsglad.so.1
libobs.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libobs.so.0
libobs-scripting.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libobs-scripting.so.1
libobs-opengl.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libobs-opengl.so.1
libobs-frontend-api.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libobs-frontend-api.so.0
sudo ldconfig -p | grep xcb
libxcb.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb.so.1
libxcb.so.1 (libc6) => /lib/i386-linux-gnu/libxcb.so.1
libxcb-xv.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-xv.so.0
libxcb-xkb.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-xkb.so.1
libxcb-xinput.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-xinput.so.0
libxcb-xinerama.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-xinerama.so.0
libxcb-xfixes.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-xfixes.so.0
libxcb-xfixes.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-xfixes.so.0
libxcb-util.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-util.so.1
libxcb-sync.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-sync.so.1
libxcb-sync.so.1 (libc6) => /lib/i386-linux-gnu/libxcb-sync.so.1
libxcb-shm.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-shm.so.0
libxcb-shm.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-shm.so.0
libxcb-shape.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-shape.so.0
libxcb-res.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-res.so.0
libxcb-render.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-render.so.0
libxcb-render-util.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-render-util.so.0
libxcb-randr.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-randr.so.0
libxcb-randr.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-randr.so.0
libxcb-present.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-present.so.0
libxcb-present.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-present.so.0
libxcb-keysyms.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-keysyms.so.1
libxcb-image.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-image.so.0
libxcb-icccm.so.4 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-icccm.so.4
libxcb-glx.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-glx.so.0
libxcb-glx.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-glx.so.0
libxcb-dri3.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-dri3.so.0
libxcb-dri3.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-dri3.so.0
libxcb-dri2.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-dri2.so.0
libxcb-dri2.so.0 (libc6) => /lib/i386-linux-gnu/libxcb-dri2.so.0
libxcb-damage.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-damage.so.0
libxcb-composite.so.0 (libc6,x86-64) => /lib/x86_64-linux-gnu/libxcb-composite.so.0
libX11-xcb.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libX11-xcb.so.1
libX11-xcb.so.1 (ELF) => /lib/i386-linux-gnu/libX11-xcb.so.1

OBS is installed via unofficial Debian package.

I've tried to play with obs-sys/build.rs:

  • Change println!("cargo:rustc-link-lib=dylib=obs"); to println!("cargo:rustc-link-lib=dylib=libobs.so.0"); and println!("cargo:rustc-link-lib=dylib=libobs.so.29"); (original file after going thru all references (found out by using file /usr/lib/x86_64-linux-gnu/libobs.so.29))
  • Add println!("cargo:rustc-link-search=native="/usr/lib/x86_64-linux-gnu");
  • Move neccesary .so files inside obs-sys and add println!("cargo:rustc-link-search=native=.")

Nothing worked. I feel like I'm missing something obvious so I wonder can i get any help with this issue.

Compile issues with example plugins on Win64

cargo build --release in each example plugin folder:

   Compiling rnnoise-denoiser-filter v0.1.0 (D:\Documents\GitHub\sectorxusa\rust-obs-plugins\plugins\rnnoise-denoiser-filter)
     Running `rustc --crate-name rnnoisedenoiser --edition=2018 'plugins\rnnoise-denoiser-filter\src\lib.rs' --error-format=json --json=diagnostic-rendered-ansi,artifacts,future-incompat --crate-type cdylib --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=339930d1b925705d --out-dir 'D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\deps' -C 'incremental=D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\incremental' -L 'dependency=D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\deps' --extern 'dasp=D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\deps\libdasp-1219642a476d077a.rlib' --extern 'nnnoiseless=D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\deps\libnnnoiseless-9d5ffb5565c55d5a.rlib' --extern 'obs_wrapper=D:\Documents\GitHub\sectorxusa\rust-obs-plugins\target\debug\deps\libobs_wrapper-8fa71ee893df0268.rlib'`
error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1
  |
  = note: "x86_64-w64-mingw32-gcc" "-Wl,C:\\Users\\VUWORL~1\\AppData\\Local\\Temp\\rustcUqSYgH\\list.def" "-fno-use-linker-plugin" "-Wl,--dynamicbase" "-Wl,--disable-auto-image-base" "-m64" "-Wl,--high-entropy-va" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\self-contained\\dllcrt2.o" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\rsbegin.o" "C:\\Users\\VUWORL~1\\AppData\\Local\\Temp\\rustcUqSYgH\\symbols.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.0.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.1.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.10.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.11.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.12.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.13.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.14.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.15.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.2.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.3.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.4.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.5.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.6.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.7.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.8.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.rnnoisedenoiser.1394d85a-cgu.9.rcgu.o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.4wj53ky7h0hllzme.rcgu.o" "-L" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps" "-L" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib" "-Wl,-Bstatic" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp-4b6884bc08ed1cca.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_window-8e25f8cb6a5c94c6.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_signal-fd8417b8836d637d.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_ring_buffer-260373cb6b7d8778.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_interpolate-f29e36991327acc3.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_frame-c612b03f544336cd.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libdasp_sample-9cbcfefdfb5e616d.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libobs_wrapper-55ba980bd846e54b.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\liblog-35f8351c88c3ea1b.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libcfg_if-da9ea6a6bf534ac4.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libpaste-6c9ef8dc830bbfd6.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libobs_sys-fd62f8d7ad4f9cac.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libnnnoiseless-31b1cc0e3bf97ce3.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\librustfft-6b4c742f5c4c4a22.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libtranspose-c5d9b3d7891f0757.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libstrength_reduce-0fb02c8ff4f4c885.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libnum_integer-5ddc38726289a198.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libnum_complex-8ea011545b5505bc.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libnum_traits-8dd47518789d9cb0.rlib" "D:\\Documents\\GitHub\\SectorXUSA\\rust-obs-plugins\\target\\release\\deps\\libonce_cell-6517ca6cadbc627a.rlib" "-Wl,--start-group" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libstd-fefff10efd686913.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libpanic_unwind-9c45725c63c0d5ed.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libobject-5e1c5cd9ff1eb7cc.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libmemchr-b6bf783b1c783d10.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libaddr2line-2241249e06c7cb40.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libgimli-03f5272f7c5d2bd2.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\librustc_demangle-8def22be308808fe.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libstd_detect-8931bc6a2b527206.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libhashbrown-6e27c0716ec027b4.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libminiz_oxide-c5bbe248c77f2f0b.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libadler-9148e9af213d2829.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\librustc_std_workspace_alloc-47941ef50057df8b.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libunwind-66b0ea2785827b9a.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libcfg_if-4b65aaa3f0b095f9.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\liblibc-04a1f133ddb50e5e.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\liballoc-f67804e146a91ffe.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\librustc_std_workspace_core-a5cbd3ad9e3068dd.rlib" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libcore-4bc25ea8e4535542.rlib" "-Wl,--end-group" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\libcompiler_builtins-ac0b598a973ccaf7.rlib" "-Wl,-Bdynamic" "-lobs" "-ladvapi32" "-luserenv" "-lkernel32" "-lws2_32" "-lbcrypt" "-lgcc_eh" "-l:libpthread.a" "-lmsvcrt" "-lmingwex" "-lmingw32" "-lgcc" "-lmsvcrt" "-luser32" "-lkernel32" "-Wl,--nxcompat" "-nostartfiles" "-L" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib" "-L" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\self-contained" "-o" "D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\rnnoisedenoiser.dll" "-Wl,--gc-sections" "-shared" "-Wl,--out-implib=D:\\Documents\\GitHub\\sectorxusa\\rust-obs-plugins\\target\\release\\deps\\librnnoisedenoiser.dll.a" "-Wl,-O1" "-nodefaultlibs" "C:\\ProgramData\\chocolatey\\lib\\rust\\tools\\lib\\rustlib\\x86_64-pc-windows-gnu\\lib\\rsend.o"
  = note: ld: cannot find -lobs


error: could not compile `rnnoise-denoiser-filter` due to previous error

Looks like I can't get it to link against lib-obs? Using rust 1.64.0 and llvm 15.0.3 via Chocolatey for reference.

Catch unwinds in native callbacks

According to this article, unwinding across FFI boundary is still a UB, which we'd better avoid.
Even though we can carefully examine our code to ensure that no unwrap is there, accidents can still happen, turning a programming mistake into a live accident.

How can I access current module from the source?

Hi.

I'm developing a module that has a filter and a source. They must be interconnected. I assume that the connection should be done through the structure of the module. But I can't find any way how I can get the current module from my filter and source.

OBS has a function obs_current_module(), but it is not suitable for my task, because it only returns a pointer, which I still can't somehow cast to the Rust's module data struct.

Could you please help me with this task? I'm still just learning Rust and don't understand a lot.

Fails to build Rust OBS Wrapper

The current master branch fails to build Rust OBS Wrapper.

$ git log | head -1
commit 08d66c684307bc804c9421ef2b0b4b963ceb4f4c

$ cargo build
(snip warnings)
   --> src\output\mod.rs:88:45
    |
88  |                       self.info.[<$f>] = Some(ffi::[<$f>]::<D>);
    |                                          ---- ^^^^^^^^^^^^^^^^ expected `u32`, found `u64`
    |                                          |
    |                                          arguments to this enum variant are incorrect
...
96  | / impl_output_builder! {
97  | |     get_name => GetNameOutput
98  | |     // this two is required
99  | |     // start => StartOutput
...   |
117 | |     get_connect_time_ms => GetConnectTimeMsOutput
118 | | }
    | |_- in this macro invocation
    |
    = note: expected fn pointer `unsafe extern "C" fn(_, u32, _)`
                  found fn item `unsafe extern "C" fn(_, u64, _) {raw_audio2::<D>}`
note: tuple variant defined here
    = note: this error originates in the macro `impl_output_builder` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0308`.
error: could not compile `obs-wrapper` due to previous error

My build environment is here:

$ cargo -V
cargo 1.63.0 (fd9c4297c 2022-07-01)
$ rustc -V
rustc 1.63.0 (4b91a6ea7 2022-08-08)
$ rustup show
Default host: x86_64-pc-windows-msvc
rustup home:  C:\Users\y\.rustup

installed toolchains
--------------------

stable-x86_64-pc-windows-msvc (default)
nightly-x86_64-pc-windows-msvc

active toolchain
----------------

stable-x86_64-pc-windows-msvc (default)
rustc 1.63.0 (4b91a6ea7 2022-08-08)

Input source example to render frames

I'm trying to write a plugin to render frames with nvfbc, but I can't figure out how to render frames with obs-wrapper.

I found VideoRenderSource and VideoTickSource, but I can't figure out how to actually render frames, GlobalContext and VideoRenderContext don't appear to have any fields or methods.

use obs_wrapper::{
    obs_register_module,
    obs_string,
    prelude::*,
    source::{
        GetNameSource,
        SourceContext,
        SourceType,
        Sourceable,
        VideoRenderSource,
        VideoTickSource,
    },
};

struct NvidiaFrameBufferCaptureSource {
    source: SourceContext,
}

struct NvidiaFrameBufferCaptureModule {
    context: ModuleContext,
}

impl Sourceable for NvidiaFrameBufferCaptureSource {
    fn get_id() -> ObsString {
        obs_string!("nvfbc")
    }

    fn get_type() -> SourceType {
        SourceType::INPUT
    }

    fn create(_create: &mut CreatableSourceContext<Self>, source: SourceContext) -> Self {
        Self { source }
    }
}

impl GetNameSource for NvidiaFrameBufferCaptureSource {
    fn get_name() -> ObsString {
        obs_string!("NvFBC")
    }
}

impl VideoRenderSource for NvidiaFrameBufferCaptureSource {
    fn video_render(&mut self, _context: &mut GlobalContext, _render: &mut VideoRenderContext) {
        todo!()
    }
}

impl VideoTickSource for NvidiaFrameBufferCaptureSource {
    fn video_tick(&mut self, _seconds: f32) {
        todo!()
    }
}

impl Module for NvidiaFrameBufferCaptureModule {
    fn new(context: ModuleContext) -> Self {
        Self { context }
    }

    fn get_ctx(&self) -> &ModuleContext {
        &self.context
    }

    fn load(&mut self, load_context: &mut LoadContext) -> bool {
        let source = load_context
            .create_source_builder::<NvidiaFrameBufferCaptureSource>()
            .enable_get_name()
            .enable_video_render()
            .enable_video_tick()
            .build();

        load_context.register_source(source);

        true
    }

    fn description() -> ObsString {
        obs_string!(env!("CARGO_PKG_DESCRIPTION"))
    }

    fn name() -> ObsString {
        obs_string!(env!("CARGO_PKG_NAME"))
    }

    fn author() -> ObsString {
        obs_string!(env!("CARGO_PKG_AUTHORS"))
    }
}

obs_register_module!(NvidiaFrameBufferCaptureModule);

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.