winsafe\mf/
funcs.rs

1#![allow(non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::guard::*;
6use crate::mf::{ffi, privs::*};
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10/// [`MFCreateAsyncResult`](https://learn.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mfcreateasyncresult)
11/// function.
12#[must_use]
13pub fn MFCreateAsyncResult(
14	object: Option<&impl ole_IUnknown>,
15	callback: &IMFAsyncCallback,
16	state: Option<&impl ole_IUnknown>,
17) -> HrResult<IMFAsyncResult> {
18	let mut queried = unsafe { IMFAsyncResult::null() };
19	ok_to_hrresult(unsafe {
20		ffi::MFCreateAsyncResult(
21			object.map_or(std::ptr::null_mut(), |o| o.ptr()),
22			callback.ptr(),
23			state.map_or(std::ptr::null_mut(), |s| s.ptr()),
24			queried.as_mut(),
25		)
26	})
27	.map(|_| queried)
28}
29
30/// [`MFCreateMediaSession`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-mfcreatemediasession)
31/// function.
32///
33/// # Examples
34///
35/// ```no_run
36/// use winsafe::{self as w, prelude::*};
37///
38/// let media_session = w::MFCreateMediaSession(None::<&w::IMFAttributes>)?;
39/// # w::HrResult::Ok(())
40/// ```
41#[must_use]
42pub fn MFCreateMediaSession(
43	configuration: Option<&impl mf_IMFAttributes>,
44) -> HrResult<IMFMediaSession> {
45	let mut queried = unsafe { IMFMediaSession::null() };
46	ok_to_hrresult(unsafe {
47		ffi::MFCreateMediaSession(
48			configuration.map_or(std::ptr::null_mut(), |c| c.ptr()),
49			queried.as_mut(),
50		)
51	})
52	.map(|_| queried)
53}
54
55/// [`MFCreateMFByteStreamOnStream`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-mfcreatemfbytestreamonstream)
56/// function.
57///
58/// # Examples
59///
60/// ```no_run
61/// use winsafe::{self as w, prelude::*};
62///
63/// let raw_data: Vec<u8>; // initialized somewhere
64/// # let raw_data = Vec::<u8>::new();
65///
66/// let stream = w::SHCreateMemStream(&raw_data)?;
67/// let byte_stream = w::MFCreateMFByteStreamOnStream(&stream)?;
68/// # w::HrResult::Ok(())
69/// ```
70#[must_use]
71pub fn MFCreateMFByteStreamOnStream(stream: &impl ole_IStream) -> HrResult<IMFByteStream> {
72	let mut queried = unsafe { IMFByteStream::null() };
73	ok_to_hrresult(unsafe { ffi::MFCreateMFByteStreamOnStream(stream.ptr(), queried.as_mut()) })
74		.map(|_| queried)
75}
76
77/// [`MFCreateSourceResolver`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-mfcreatesourceresolver)
78/// function.
79///
80/// # Examples
81///
82/// ```no_run
83/// use winsafe::{self as w, prelude::*};
84///
85/// let source_resolver = w::MFCreateSourceResolver()?;
86/// # w::HrResult::Ok(())
87/// ```
88#[must_use]
89pub fn MFCreateSourceResolver() -> HrResult<IMFSourceResolver> {
90	let mut queried = unsafe { IMFSourceResolver::null() };
91	ok_to_hrresult(unsafe { ffi::MFCreateSourceResolver(queried.as_mut()) }).map(|_| queried)
92}
93
94/// [`MFCreateTopology`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-mfcreatetopology)
95/// function.
96///
97/// # Examples
98///
99/// ```no_run
100/// use winsafe::{self as w, prelude::*};
101///
102/// let topology = w::MFCreateTopology()?;
103/// # w::HrResult::Ok(())
104/// ```
105#[must_use]
106pub fn MFCreateTopology() -> HrResult<IMFTopology> {
107	let mut queried = unsafe { IMFTopology::null() };
108	ok_to_hrresult(unsafe { ffi::MFCreateTopology(queried.as_mut()) }).map(|_| queried)
109}
110
111/// [`MFCreateTopologyNode`](https://learn.microsoft.com/en-us/windows/win32/api/mfidl/nf-mfidl-mfcreatetopologynode)
112/// function.
113///
114/// # Examples
115///
116/// ```no_run
117/// use winsafe::{self as w, prelude::*, co};
118///
119/// let topology_node = w::MFCreateTopologyNode(co::MF_TOPOLOGY::OUTPUT_NODE)?;
120/// # w::HrResult::Ok(())
121/// ```
122#[must_use]
123pub fn MFCreateTopologyNode(node_type: co::MF_TOPOLOGY) -> HrResult<IMFTopologyNode> {
124	let mut queried = unsafe { IMFTopologyNode::null() };
125	ok_to_hrresult(unsafe { ffi::MFCreateTopologyNode(node_type.raw(), queried.as_mut()) })
126		.map(|_| queried)
127}
128
129/// [`MFStartup`](https://learn.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mfstartup)
130/// function.
131///
132/// In the original C implementation, you must call
133/// [`MFShutdown`](https://learn.microsoft.com/en-us/windows/win32/api/mfapi/nf-mfapi-mfshutdown)
134/// as a cleanup operation.
135///
136/// Here, the cleanup is performed automatically, because `MFStartup` returns a
137/// [`MFShutdownGuard`](crate::guard::MFShutdownGuard), which automatically
138/// calls `MFShutdown` when the guard goes out of scope. You must, however, keep
139/// the guard alive, otherwise the cleanup will be performed right away.
140///
141/// # Examples
142///
143/// ```no_run
144/// use winsafe::{self as w, prelude::*, co};
145///
146/// let _mf_guard = w::MFStartup( // keep guard alive
147///     co::MFSTARTUP::NOSOCKET,
148/// )?;
149///
150/// // program runs...
151///
152/// // MFShutdown() automatically called
153/// # w::HrResult::Ok(())
154/// ```
155pub fn MFStartup(flags: co::MFSTARTUP) -> HrResult<MFShutdownGuard> {
156	unsafe {
157		ok_to_hrresult(ffi::MFStartup(MF_VERSION, flags.raw())).map(|_| MFShutdownGuard::new())
158	}
159}