libobs_wrapper\encoders/
property_helper.rs1use std::{collections::HashMap, str::FromStr, sync::Arc};
2
3use duplicate::duplicate_item;
4
5use crate::{
6 context::ObsContext,
7 data::{
8 output::ObsOutputRef,
9 properties::{
10 get_properties_inner, ObsProperty, ObsPropertyObject, ObsPropertyObjectPrivate,
11 },
12 ObsData,
13 },
14 run_with_obs,
15 runtime::ObsRuntime,
16 unsafe_send::Sendable,
17 utils::{ObjectInfo, ObsError, ObsString},
18};
19
20use super::{
21 audio::ObsAudioEncoder, video::ObsVideoEncoder, ObsAudioEncoderType, ObsVideoEncoderType,
22};
23
24#[duplicate_item(
25 StructName EncoderType;
26 [ObsAudioEncoderBuilder] [ObsAudioEncoderType];
27 [ObsVideoEncoderBuilder] [ObsVideoEncoderType]
28)]
29#[derive(Debug)]
30pub struct StructName {
31 encoder_id: EncoderType,
32 runtime: ObsRuntime,
33 _context: ObsContext,
35 settings: Option<ObsData>,
36 hotkey_data: Option<ObsData>,
37}
38
39#[duplicate_item(
40 StructName EncoderType;
41 [ObsAudioEncoderBuilder] [ObsAudioEncoderType];
42 [ObsVideoEncoderBuilder] [ObsVideoEncoderType]
43)]
44impl StructName {
45 pub fn new(context: ObsContext, encoder_id: &str) -> Self {
46 Self {
47 encoder_id: EncoderType::from_str(encoder_id).unwrap(),
48 runtime: context.runtime().clone(),
49 _context: context,
50 settings: None,
51 hotkey_data: None,
52 }
53 }
54
55 pub fn get_encoder_id(&self) -> &EncoderType {
56 &self.encoder_id
57 }
58
59 pub fn set_settings(&mut self, settings: ObsData) -> &mut Self {
60 self.settings = Some(settings);
61 self
62 }
63
64 pub fn set_hotkey_data(&mut self, hotkey_data: ObsData) -> &mut Self {
65 self.hotkey_data = Some(hotkey_data);
66 self
67 }
68
69 pub fn get_settings(&self) -> Option<&ObsData> {
70 self.settings.as_ref()
71 }
72
73 pub fn get_hotkey_data(&self) -> Option<&ObsData> {
74 self.hotkey_data.as_ref()
75 }
76
77 pub fn get_settings_mut(&mut self) -> Option<&mut ObsData> {
78 self.settings.as_mut()
79 }
80
81 pub fn get_hotkey_data_mut(&mut self) -> Option<&mut ObsData> {
82 self.hotkey_data.as_mut()
83 }
84}
85
86impl ObsAudioEncoderBuilder {
87 pub fn apply_to_context(
88 self,
89 output: &mut ObsOutputRef,
90 name: &str,
91 settings: Option<ObsData>,
92 hotkey_data: Option<ObsData>,
93 mixer_idx: usize,
94 ) -> Result<Arc<ObsAudioEncoder>, ObsError> {
95 let e_id: ObsString = self.encoder_id.into();
96 let info = ObjectInfo::new(e_id, ObsString::new(name), settings, hotkey_data);
97
98 output.create_and_set_audio_encoder(info, mixer_idx)
99 }
100}
101
102impl ObsVideoEncoderBuilder {
103 pub fn set_to_output(
104 self,
105 output: &mut ObsOutputRef,
106 name: &str,
107 ) -> Result<Arc<ObsVideoEncoder>, ObsError> {
108 let e_id: ObsString = self.encoder_id.into();
109 let info = ObjectInfo::new(e_id, ObsString::new(name), self.settings, self.hotkey_data);
110
111 output.create_and_set_video_encoder(info)
112 }
113}
114
115#[duplicate_item(
116 StructName;
117 [ObsAudioEncoderBuilder];
118 [ObsVideoEncoderBuilder]
119)]
120impl ObsPropertyObject for StructName {
121 fn get_properties(&self) -> Result<HashMap<String, ObsProperty>, ObsError> {
122 let properties_raw = self.get_properties_raw()?;
123 get_properties_inner(properties_raw, self.runtime.clone())
124 }
125}
126
127#[duplicate_item(
128 StructName;
129 [ObsAudioEncoderBuilder];
130 [ObsVideoEncoderBuilder]
131)]
132impl ObsPropertyObjectPrivate for StructName {
133 fn get_properties_raw(&self) -> Result<Sendable<*mut libobs::obs_properties_t>, ObsError> {
134 let encoder_name: ObsString = self.encoder_id.clone().into();
135 let encoder_name_ptr = encoder_name.as_ptr();
136
137 run_with_obs!(self.runtime, (encoder_name_ptr), move || unsafe {
138 Sendable(libobs::obs_get_encoder_properties(encoder_name_ptr))
139 })
140 }
141
142 fn get_properties_by_id_raw<T: Into<ObsString> + Sync + Send>(
143 id: T,
144 runtime: ObsRuntime,
145 ) -> Result<Sendable<*mut libobs::obs_properties_t>, ObsError> {
146 let id: ObsString = id.into();
147 let id_ptr = id.as_ptr();
148 run_with_obs!(runtime, (id_ptr), move || unsafe {
149 Sendable(libobs::obs_get_encoder_properties(id_ptr))
150 })
151 }
152}