forked from mirrors/gstreamer-rs
audio/sink,src: Add support for overriding reset vfunc
This commit is contained in:
parent
cc866b53d0
commit
03893f895c
2 changed files with 62 additions and 0 deletions
|
@ -40,6 +40,10 @@ pub trait AudioSinkImpl: AudioSinkImplExt + BaseSinkImpl + Send + Sync + 'static
|
|||
fn write(&self, sink: &AudioSink, audio_data: &[u8]) -> Result<i32, LoggableError> {
|
||||
self.parent_write(sink, audio_data)
|
||||
}
|
||||
|
||||
fn reset(&self, sink: &AudioSink) {
|
||||
self.parent_reset(sink)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait AudioSinkImplExt {
|
||||
|
@ -53,6 +57,7 @@ pub trait AudioSinkImplExt {
|
|||
) -> Result<(), LoggableError>;
|
||||
fn parent_unprepare(&self, sink: &AudioSink) -> Result<(), LoggableError>;
|
||||
fn parent_write(&self, sink: &AudioSink, audio_data: &[u8]) -> Result<i32, LoggableError>;
|
||||
fn parent_reset(&self, sink: &AudioSink);
|
||||
}
|
||||
|
||||
impl<T: AudioSinkImpl + ObjectImpl> AudioSinkImplExt for T {
|
||||
|
@ -167,6 +172,17 @@ impl<T: AudioSinkImpl + ObjectImpl> AudioSinkImplExt for T {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn parent_reset(&self, sink: &AudioSink) {
|
||||
unsafe {
|
||||
let data = self.get_type_data();
|
||||
let parent_class =
|
||||
data.as_ref().get_parent_class() as *mut gst_audio_sys::GstAudioSinkClass;
|
||||
if let Some(f) = (*parent_class).reset {
|
||||
f(sink.to_glib_none().0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<T: ObjectSubclass + AudioSinkImpl + BaseSinkImpl> IsSubclassable<T> for AudioSinkClass
|
||||
|
@ -183,6 +199,7 @@ where
|
|||
klass.prepare = Some(audiosink_prepare::<T>);
|
||||
klass.unprepare = Some(audiosink_unprepare::<T>);
|
||||
klass.write = Some(audiosink_write::<T>);
|
||||
klass.reset = Some(audiosink_reset::<T>);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -314,3 +331,17 @@ where
|
|||
imp.write(&wrap, data_slice).unwrap_or(-1)
|
||||
})
|
||||
}
|
||||
|
||||
unsafe extern "C" fn audiosink_reset<T: ObjectSubclass>(ptr: *mut gst_audio_sys::GstAudioSink)
|
||||
where
|
||||
T: AudioSinkImpl,
|
||||
T::Instance: PanicPoison,
|
||||
{
|
||||
let instance = &*(ptr as *mut T::Instance);
|
||||
let imp = instance.get_impl();
|
||||
let wrap: Borrowed<AudioSink> = from_glib_borrow(ptr);
|
||||
|
||||
gst_panic_to_error!(&wrap, &instance.panicked(), (), {
|
||||
imp.reset(&wrap);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -42,6 +42,10 @@ pub trait AudioSrcImpl: AudioSrcImplExt + BaseSrcImpl + Send + Sync + 'static {
|
|||
) -> Result<(u32, gst::ClockTime), LoggableError> {
|
||||
self.parent_read(src, audio_data)
|
||||
}
|
||||
|
||||
fn reset(&self, src: &AudioSrc) {
|
||||
self.parent_reset(src)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait AudioSrcImplExt {
|
||||
|
@ -59,6 +63,7 @@ pub trait AudioSrcImplExt {
|
|||
src: &AudioSrc,
|
||||
audio_data: &mut [u8],
|
||||
) -> Result<(u32, gst::ClockTime), LoggableError>;
|
||||
fn parent_reset(&self, src: &AudioSrc);
|
||||
}
|
||||
|
||||
impl<T: AudioSrcImpl + ObjectImpl> AudioSrcImplExt for T {
|
||||
|
@ -183,6 +188,17 @@ impl<T: AudioSrcImpl + ObjectImpl> AudioSrcImplExt for T {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn parent_reset(&self, src: &AudioSrc) {
|
||||
unsafe {
|
||||
let data = self.get_type_data();
|
||||
let parent_class =
|
||||
data.as_ref().get_parent_class() as *mut gst_audio_sys::GstAudioSrcClass;
|
||||
if let Some(f) = (*parent_class).reset {
|
||||
f(src.to_glib_none().0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<T: ObjectSubclass + AudioSrcImpl + BaseSrcImpl> IsSubclassable<T> for AudioSrcClass
|
||||
|
@ -199,6 +215,7 @@ where
|
|||
klass.prepare = Some(audiosrc_prepare::<T>);
|
||||
klass.unprepare = Some(audiosrc_unprepare::<T>);
|
||||
klass.read = Some(audiosrc_read::<T>);
|
||||
klass.reset = Some(audiosrc_reset::<T>);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -334,3 +351,17 @@ where
|
|||
res
|
||||
})
|
||||
}
|
||||
|
||||
unsafe extern "C" fn audiosrc_reset<T: ObjectSubclass>(ptr: *mut gst_audio_sys::GstAudioSrc)
|
||||
where
|
||||
T: AudioSrcImpl,
|
||||
T::Instance: PanicPoison,
|
||||
{
|
||||
let instance = &*(ptr as *mut T::Instance);
|
||||
let imp = instance.get_impl();
|
||||
let wrap: Borrowed<AudioSrc> = from_glib_borrow(ptr);
|
||||
|
||||
gst_panic_to_error!(&wrap, &instance.panicked(), (), {
|
||||
imp.reset(&wrap);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue