1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#![allow(non_snake_case)]
use crate::dshow::decl::{IBaseFilter, IEnumFilters};
use crate::ffi_types::{HRES, PCSTR, PCVOID};
use crate::kernel::decl::WString;
use crate::ole::decl::{ComPtr, HrResult};
use crate::ole::privs::ok_to_hrresult;
use crate::prelude::OleIUnknown;
use crate::vt::IUnknownVT;
#[cfg_attr(docsrs, doc(cfg(feature = "dshow")))]
#[repr(C)]
pub struct IFilterGraphVT {
pub IUnknownVT: IUnknownVT,
pub AddFilter: fn(ComPtr, ComPtr, PCSTR) -> HRES,
pub RemoveFilter: fn(ComPtr, ComPtr) -> HRES,
pub EnumFilters: fn(ComPtr, *mut ComPtr) -> HRES,
pub FindFilterByName: fn(ComPtr, PCSTR, *mut ComPtr) -> HRES,
pub ConnectDirect: fn(ComPtr, ComPtr, ComPtr, PCVOID) -> HRES,
pub Reconnect: fn(ComPtr, ComPtr) -> HRES,
pub Disconnect: fn(ComPtr, ComPtr) -> HRES,
pub SetDefaultSyncSource: fn(ComPtr) -> HRES,
}
#[cfg_attr(docsrs, doc(cfg(feature = "dshow")))]
pub struct IFilterGraph(ComPtr);
impl_iunknown!(IFilterGraph, "56a8689f-0ad4-11ce-b03a-0020af0ba770");
impl DshowIFilterGraph for IFilterGraph {}
#[cfg_attr(docsrs, doc(cfg(feature = "dshow")))]
pub trait DshowIFilterGraph: OleIUnknown {
fn AddFilter(&self, filter: &IBaseFilter, name: &str) -> HrResult<()> {
unsafe {
let vt = &**(self.ptr().0 as *mut *mut IFilterGraphVT);
ok_to_hrresult(
(vt.AddFilter)(
self.ptr(),
filter.ptr(),
WString::from_str(name).as_ptr(),
),
)
}
}
#[must_use]
fn EnumFilters(&self) -> HrResult<IEnumFilters> {
let mut ppv_queried = ComPtr::null();
unsafe {
let vt = &**(self.ptr().0 as *mut *mut IFilterGraphVT);
ok_to_hrresult(
(vt.EnumFilters)(self.ptr(), &mut ppv_queried),
)
}.map(|_| IEnumFilters::from(ppv_queried))
}
#[must_use]
fn FindFilterByName(&self, name: &str) -> HrResult<IBaseFilter> {
let mut ppv_queried = ComPtr::null();
unsafe {
let vt = &**(self.ptr().0 as *mut *mut IFilterGraphVT);
ok_to_hrresult(
(vt.FindFilterByName)(
self.ptr(),
WString::from_str(name).as_ptr(),
&mut ppv_queried,
),
)
}.map(|_| IBaseFilter::from(ppv_queried))
}
fn RemoveFilter(&self, filter: &IBaseFilter) -> HrResult<()> {
unsafe {
let vt = &**(self.ptr().0 as *mut *mut IFilterGraphVT);
ok_to_hrresult((vt.RemoveFilter)(self.ptr(), filter.ptr()))
}
}
fn SetDefaultSyncSource(&self) -> HrResult<()> {
unsafe {
let vt = &**(self.ptr().0 as *mut *mut IFilterGraphVT);
ok_to_hrresult((vt.SetDefaultSyncSource)(self.ptr()))
}
}
}