在Rust中,有没有一种方法可以将`gstreamer::Bin`子类化,这样我仍然可以使用它原来的方法?

在Rust中,有没有一种方法可以将`gstreamer::Bin`子类化,这样我仍然可以使用它原来的方法?,rust,gstreamer,glib,Rust,Gstreamer,Glib,我试图将gstreamer::Bin子类化,以覆盖其Bin::handle_message方法,目的是截取流末消息,丢弃它们并发出丢弃它们的信号(如果它们不是流末消息,则使用默认的Bin::handle_message行为) 问题是,我仍然需要它的原始方法(比如Bin::add,Bin::add_pad等等),因为我需要堆叠在原始gstreamer::Bin之上的唯一行为就是前面提到的消息拦截 我提到我仍然需要它的原始方法,因为当我尝试遵循示例时,我编写的结果CustomBin不满足IsA,因此

我试图将
gstreamer::Bin
子类化,以覆盖其
Bin::handle_message
方法,目的是截取流末消息,丢弃它们并发出丢弃它们的信号(如果它们不是流末消息,则使用默认的
Bin::handle_message
行为)

问题是,我仍然需要它的原始方法(比如
Bin::add
Bin::add_pad
等等),因为我需要堆叠在原始
gstreamer::Bin
之上的唯一行为就是前面提到的消息拦截

我提到我仍然需要它的原始方法,因为当我尝试遵循示例时,我编写的结果
CustomBin
不满足
IsA
,因此不符合
gstreamer::GstBinExt
的全面实现条件,这反过来又使得它没有原始的
gstreamer::Bin
方法

我也遇到了这个例子,但最终我不想为我希望从管道中动态添加和删除的每一组元素重新实现消息拦截行为。我也不需要将它注册为一个元素,我只需要在我自己的板条箱中使用它,以及其中定义的管道

作为参考,我将在下面附上我实现这一目标的尝试

我错过了什么


pub-struct-CustomBin{
eos_守卫:互斥锁,
}
CustomBin的impl默认值{
fn default()->Self{
自我{
eos_guard:Mutex::new(无),
}
}
}
CustomBin的impl ObjectImpl{
巧舌如簧的对象;
}
用于CustomBin{}的impl元素impl
impl-BinImpl用于CustomBin{
fn handle_消息(&self,bin:&bin,message:message){
如果让MessageView::Eos(41;)=message.view(){
如果让某些(发送方)=self.eos\u guard.lock().unwrap().take()){
发件人。发送(())。打开或(());
}否则{
self.parent\u handle\u消息(bin,消息);
}
}否则{
self.parent\u handle\u消息(bin,消息);
}
}
}
CustomBin的impl ObjectSubclass{
常量名称:&'static str=“GstCustomBin”;
类型ParentType=Bin;
类型实例=ElementInstanceStruct;
类型Class=ClassStruct;
glib_object_子类!();
fn new()->Self{
Self::default()
}
}
impl CustomBin{
发布fn安装eos防护罩(和自身)->接收器{
让mut-eos_-guard=self.eos_-guard.lock().unwrap();
let(发送方、接收方)=信道();
如果eos\u guard.is\u some(){
惊慌失措!(“已安装流末防护”);
}否则{
eos_护罩。更换(发送器);
}
接受者
}
}

您的
CustomBin
结构是该类型的内部实现,而不是本身的
glib::Object
(或
gst::Bin
)。如果将其与Java进行比较,那么这就是所有私有字段和受保护的虚拟方法

这足以创建一个新实例,并将其用作其任何父类

让obj:glib::Object=glib::Object::new(CustomBin::get_type(),&[(“name”,“bla”)])。展开();
让bin:gst::bin=obj.downcast::().unwrap();
请注意,上面的
obj
bin
不是您的
CustomBin
结构


要在
CustomBin
周围创建一个公共的Rust API,可以使用宏。你可以找到一个例子。不要只看那些突出显示的行,还要看上面的所有代码。

我认为您至少需要
class\u init
+
klass.set\u metadata
实现以及ObjectSubClass实现。按照您发布的示例,我得到两个类似的错误:1)
(进程:29533):GLib GObject WARNING**:12:06:52.310:../../../../GObject/gsignal.c:1763:信号“GstBus::sync message”的类型为“”的参数1不是值类型
,2)与第一个参数相同,但对于
“GstBus::message”
。我遗漏了什么?今天早上我发现我在测试结构时忘了调用
gstreamer::init()。除此之外,我实现了您指给我的示例,效果很好。再次,非常感谢。