diff --git a/examples/src/bin/subclass_vfuncs/iirfilter/imp.rs b/examples/src/bin/subclass_vfuncs/iirfilter/imp.rs index 89ff47d32..a62c0aec9 100644 --- a/examples/src/bin/subclass_vfuncs/iirfilter/imp.rs +++ b/examples/src/bin/subclass_vfuncs/iirfilter/imp.rs @@ -45,6 +45,8 @@ impl ObjectSubclass for IirFilter { type ParentType = gst_audio::AudioFilter; type Class = super::Class; + // Here we set default implementations for all the virtual methods. + // This is mandatory for all virtual methods that are not `Option`s. fn class_init(class: &mut Self::Class) { class.set_rate = |obj, rate| obj.imp().set_rate_default(rate); } diff --git a/examples/src/bin/subclass_vfuncs/iirfilter/mod.rs b/examples/src/bin/subclass_vfuncs/iirfilter/mod.rs index babb6c742..e1dbf8c88 100644 --- a/examples/src/bin/subclass_vfuncs/iirfilter/mod.rs +++ b/examples/src/bin/subclass_vfuncs/iirfilter/mod.rs @@ -60,6 +60,8 @@ unsafe impl ClassStruct for Class { type Type = imp::IirFilter; } +/// This allows directly using `Class` as e.g. `gst_audio::AudioFilterClass` or +/// `gst_base::BaseTransformClass` without having to cast. impl std::ops::Deref for Class { type Target = glib::Class<<::Type as ObjectSubclass>::ParentType>; @@ -68,6 +70,8 @@ impl std::ops::Deref for Class { } } +/// Overrides the virtual methods with the actual implementation of the subclass as is provided by +/// the subclass' implementation of the `Impl` trait. unsafe impl IsSubclassable for IirFilter { fn class_init(class: &mut glib::Class) { Self::parent_class_init::(class); diff --git a/examples/src/bin/subclass_vfuncs/lowpass/imp.rs b/examples/src/bin/subclass_vfuncs/lowpass/imp.rs index 280e91e95..91f282940 100644 --- a/examples/src/bin/subclass_vfuncs/lowpass/imp.rs +++ b/examples/src/bin/subclass_vfuncs/lowpass/imp.rs @@ -121,6 +121,11 @@ impl AudioFilterImpl for Lowpass {} // Implement of IirFilter virtual methods impl IirFilterImpl for Lowpass { fn set_rate(&self, rate: u32) { + // Could call + // self.parent_set_rate(rate); + // here but chaining up is not necessary if the base class doesn't require that + // or if the behaviour of the parent class should be completely overridden. + self.state.lock().unwrap().rate = Some(rate); self.calculate_coeffs(); }