Rikorose / DeepFilterNet

Noise supression using deep filtering
https://huggingface.co/spaces/hshr/DeepFilterNet2
Other
2.58k stars 239 forks source link

libDF does not support the Send trait #615

Open vaisest opened 1 month ago

vaisest commented 1 month ago

I have had some troubles with trying to use libDF and following the LADSPA plugin implementation to create a VST version. These mostly seem to stem from the fact that the DfTract model does not support Send. This seems to be caused by the use of TValue, from what I can tell. From what I can tell without real knowledge about tract, it does generally support Send+Sync. Would it be possible to add Send support?

The full error is listed below:

note: if you need to support cargo 1.38 or earlier, you can symlink `config` to `config.toml`
   Compiling vst-filter v0.1.0 (C:\Users\Turtvaiz\Downloads\deepfilter-vst)
error[E0277]: `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
   --> src\lib.rs:62:17
    |
62  | impl Plugin for Vst {
    |                 ^^^ `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
    |
    = help: within `Vst`, the trait `Send` is not implemented for `Rc<tract_data::tensor::Tensor>`, which is required by `Vst: Send`
note: required because it appears within the type `tract_core::value::TValue`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\value.rs:9:10
    |
9   | pub enum TValue {
    |          ^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
note: required by a bound in `nih_plug::prelude::Plugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin.rs:59:29
    |
59  | pub trait Plugin: Default + Send + 'static {
    |                             ^^^^ required by this bound in `Plugin`

error[E0277]: `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
   --> src\lib.rs:62:17
    |
62  | impl Plugin for Vst {
    |                 ^^^ `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
    |
    = help: the trait `Send` is not implemented for `(dyn tract_core::ops::OpState + 'static)`, which is required by `Vst: Send`
    = note: required for `Unique<(dyn tract_core::ops::OpState + 'static)>` to implement `Send`
note: required because it appears within the type `Box<(dyn tract_core::ops::OpState + 'static)>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\boxed.rs:235:12
    |
235 | pub struct Box<
    |            ^^^
note: required because it appears within the type `Option<Box<(dyn tract_core::ops::OpState + 'static)>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `PhantomData<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\marker.rs:741:12
    |
741 | pub struct PhantomData<T: ?Sized>;
    |            ^^^^^^^^^^^
note: required because it appears within the type `alloc::raw_vec::RawVec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\raw_vec.rs:75:19
    |
75  | pub(crate) struct RawVec<T, A: Allocator = Global> {
    |                   ^^^^^^
note: required because it appears within the type `Vec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\vec\mod.rs:397:12
    |
397 | pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
    |            ^^^
note: required because it appears within the type `SimpleState<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>, SimplePlan<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>>>`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\plan.rs:132:12
    |
132 | pub struct SimpleState<F, O, M, P>
    |            ^^^^^^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
note: required by a bound in `nih_plug::prelude::Plugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin.rs:59:29
    |
59  | pub trait Plugin: Default + Send + 'static {
    |                             ^^^^ required by this bound in `Plugin`
    = note: the full name for the type has been written to 'C:\Users\Turtvaiz\Downloads\deepfilter-vst\target\debug\deps\vst_df.long-type-2428458703810400329.txt'
    = note: consider using `--verbose` to print the full type name to the console

error[E0277]: `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
   --> src\lib.rs:155:21
    |
155 | impl Vst3Plugin for Vst {
    |                     ^^^ `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
    |
    = help: within `Vst`, the trait `Send` is not implemented for `Rc<tract_data::tensor::Tensor>`, which is required by `Vst: nih_plug::prelude::Plugin`
    = help: the trait `nih_plug::prelude::Plugin` is implemented for `Vst`
note: required because it appears within the type `tract_core::value::TValue`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\value.rs:9:10
    |
9   | pub enum TValue {
    |          ^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
    = note: required for `Vst` to implement `nih_plug::prelude::Plugin`
note: required by a bound in `nih_plug::prelude::Vst3Plugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin\vst3.rs:5:23
    |
5   | pub trait Vst3Plugin: Plugin {
    |                       ^^^^^^ required by this bound in `Vst3Plugin`

error[E0277]: `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
   --> src\lib.rs:155:21
    |
155 | impl Vst3Plugin for Vst {
    |                     ^^^ `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
    |
    = help: the trait `Send` is not implemented for `(dyn tract_core::ops::OpState + 'static)`, which is required by `Vst: nih_plug::prelude::Plugin`
    = help: the trait `nih_plug::prelude::Plugin` is implemented for `Vst`
    = note: required for `Unique<(dyn tract_core::ops::OpState + 'static)>` to implement `Send`
note: required because it appears within the type `Box<(dyn tract_core::ops::OpState + 'static)>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\boxed.rs:235:12
    |
235 | pub struct Box<
    |            ^^^
note: required because it appears within the type `Option<Box<(dyn tract_core::ops::OpState + 'static)>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `PhantomData<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\marker.rs:741:12
    |
741 | pub struct PhantomData<T: ?Sized>;
    |            ^^^^^^^^^^^
note: required because it appears within the type `alloc::raw_vec::RawVec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\raw_vec.rs:75:19
    |
75  | pub(crate) struct RawVec<T, A: Allocator = Global> {
    |                   ^^^^^^
note: required because it appears within the type `Vec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\vec\mod.rs:397:12
    |
397 | pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
    |            ^^^
note: required because it appears within the type `SimpleState<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>, SimplePlan<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>>>`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\plan.rs:132:12
    |
132 | pub struct SimpleState<F, O, M, P>
    |            ^^^^^^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
    = note: required for `Vst` to implement `nih_plug::prelude::Plugin`
note: required by a bound in `nih_plug::prelude::Vst3Plugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin\vst3.rs:5:23
    |
5   | pub trait Vst3Plugin: Plugin {
    |                       ^^^^^^ required by this bound in `Vst3Plugin`
    = note: the full name for the type has been written to 'C:\Users\Turtvaiz\Downloads\deepfilter-vst\target\debug\deps\vst_df.long-type-2428458703810400329.txt'
    = note: consider using `--verbose` to print the full type name to the console

error[E0277]: `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
   --> src\lib.rs:163:21
    |
163 | impl ClapPlugin for Vst {
    |                     ^^^ `Rc<tract_data::tensor::Tensor>` cannot be sent between threads safely
    |
    = help: within `Vst`, the trait `Send` is not implemented for `Rc<tract_data::tensor::Tensor>`, which is required by `Vst: nih_plug::prelude::Plugin`
    = help: the trait `nih_plug::prelude::Plugin` is implemented for `Vst`
note: required because it appears within the type `tract_core::value::TValue`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\value.rs:9:10
    |
9   | pub enum TValue {
    |          ^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
    = note: required for `Vst` to implement `nih_plug::prelude::Plugin`
note: required by a bound in `nih_plug::prelude::ClapPlugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin\clap.rs:6:23
    |
6   | pub trait ClapPlugin: Plugin {
    |                       ^^^^^^ required by this bound in `ClapPlugin`

error[E0277]: `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
   --> src\lib.rs:163:21
    |
163 | impl ClapPlugin for Vst {
    |                     ^^^ `(dyn tract_core::ops::OpState + 'static)` cannot be sent between threads safely
    |
    = help: the trait `Send` is not implemented for `(dyn tract_core::ops::OpState + 'static)`, which is required by `Vst: nih_plug::prelude::Plugin`
    = help: the trait `nih_plug::prelude::Plugin` is implemented for `Vst`
    = note: required for `Unique<(dyn tract_core::ops::OpState + 'static)>` to implement `Send`
note: required because it appears within the type `Box<(dyn tract_core::ops::OpState + 'static)>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\boxed.rs:235:12
    |
235 | pub struct Box<
    |            ^^^
note: required because it appears within the type `Option<Box<(dyn tract_core::ops::OpState + 'static)>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `PhantomData<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\marker.rs:741:12
    |
741 | pub struct PhantomData<T: ?Sized>;
    |            ^^^^^^^^^^^
note: required because it appears within the type `alloc::raw_vec::RawVec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\raw_vec.rs:75:19
    |
75  | pub(crate) struct RawVec<T, A: Allocator = Global> {
    |                   ^^^^^^
note: required because it appears within the type `Vec<Option<Box<(dyn tract_core::ops::OpState + 'static)>>>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\alloc\src\vec\mod.rs:397:12
    |
397 | pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
    |            ^^^
note: required because it appears within the type `SimpleState<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>, SimplePlan<TypedFact, Box<dyn TypedOp>, Graph<TypedFact, Box<dyn TypedOp>>>>`
   --> C:\Users\Turtvaiz\.cargo\registry\src\index.crates.io-6f17d22bba15001f\tract-core-0.21.4\src\plan.rs:132:12
    |
132 | pub struct SimpleState<F, O, M, P>
    |            ^^^^^^^^^^^
note: required because it appears within the type `df::tract::DfTract`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\deepfilternet-7f2a84b8ce7ebe06\d375b2d\libDF\src\tract.rs:198:12
    |
198 | pub struct DfTract {
    |            ^^^^^^^
note: required because it appears within the type `Option<df::tract::DfTract>`
   --> C:\Users\Turtvaiz\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib/rustlib/src/rust\library\core\src\option.rs:571:10
    |
571 | pub enum Option<T> {
    |          ^^^^^^
note: required because it appears within the type `Vst`
   --> src\lib.rs:6:12
    |
6   | pub struct Vst {
    |            ^^^
    = note: required for `Vst` to implement `nih_plug::prelude::Plugin`
note: required by a bound in `nih_plug::prelude::ClapPlugin`
   --> C:\Users\Turtvaiz\.cargo\git\checkouts\nih-plug-a2d2dc277b128e13\dfafe90\src\plugin\clap.rs:6:23
    |
6   | pub trait ClapPlugin: Plugin {
    |                       ^^^^^^ required by this bound in `ClapPlugin`
    = note: the full name for the type has been written to 'C:\Users\Turtvaiz\Downloads\deepfilter-vst\target\debug\deps\vst_df.long-type-2428458703810400329.txt'
    = note: consider using `--verbose` to print the full type name to the console

For more information about this error, try `rustc --explain E0277`.
error: could not compile `vst-filter` (lib) due to 6 previous errors