1use std::{borrow::Borrow, ffi::CStr, fmt, mem, num::NonZeroU32, ops::Deref, ops::DerefMut, ptr};
4
5use glib::{
6 translate::*,
7 value::{SendValue, ValueType},
8};
9use smallvec::SmallVec;
10
11use crate::{
12 GenericFormattedValue, GroupId, MessageType, Object, Seqnum, TagList, ffi,
13 format::{CompatibleFormattedValue, FormattedValue},
14 prelude::*,
15 structure::*,
16};
17
18mini_object_wrapper!(Message, MessageRef, ffi::GstMessage, || {
19 ffi::gst_message_get_type()
20});
21
22impl MessageRef {
23 #[doc(alias = "get_src")]
24 #[inline]
25 pub fn src(&self) -> Option<&Object> {
26 unsafe {
27 if (*self.as_ptr()).src.is_null() {
28 None
29 } else {
30 Some(Object::from_glib_ptr_borrow(&(*self.as_ptr()).src))
31 }
32 }
33 }
34
35 #[doc(alias = "get_seqnum")]
36 #[doc(alias = "gst_message_get_seqnum")]
37 pub fn seqnum(&self) -> Seqnum {
38 unsafe {
39 let seqnum = ffi::gst_message_get_seqnum(self.as_mut_ptr());
40
41 if seqnum == 0 {
42 let next = Seqnum::next();
46
47 crate::warning!(
48 crate::CAT_RUST,
49 "get_seqnum detected invalid seqnum, returning next {:?}",
50 next
51 );
52
53 return next;
54 }
55
56 Seqnum(NonZeroU32::new_unchecked(seqnum))
57 }
58 }
59
60 #[doc(alias = "gst_message_set_seqnum")]
61 pub fn set_seqnum(&self, seqnum: Seqnum) {
62 unsafe {
63 ffi::gst_message_set_seqnum(self.as_mut_ptr(), seqnum.0.get());
64 }
65 }
66
67 #[doc(alias = "get_structure")]
68 #[doc(alias = "gst_message_get_structure")]
69 #[inline]
70 pub fn structure(&self) -> Option<&StructureRef> {
71 unsafe {
72 let structure = ffi::gst_message_get_structure(self.as_mut_ptr());
73 if structure.is_null() {
74 None
75 } else {
76 Some(StructureRef::from_glib_borrow(structure))
77 }
78 }
79 }
80
81 #[doc(alias = "gst_message_writable_structure")]
82 #[inline]
83 pub fn structure_mut(&mut self) -> &mut StructureRef {
84 unsafe {
85 StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_structure(
86 self.as_mut_ptr(),
87 ))
88 }
89 }
90
91 #[cfg(feature = "v1_26")]
92 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
93 #[doc(alias = "gst_message_writable_details")]
94 #[inline]
95 pub fn details(&self) -> Option<&StructureRef> {
96 unsafe {
97 let structure = ffi::gst_message_writable_details(self.as_mut_ptr());
98 if structure.is_null() {
99 None
100 } else {
101 Some(StructureRef::from_glib_borrow(structure))
102 }
103 }
104 }
105
106 #[cfg(feature = "v1_26")]
107 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
108 #[doc(alias = "gst_message_writable_details")]
109 #[inline]
110 pub fn details_mut(&mut self) -> &mut StructureRef {
111 unsafe {
112 StructureRef::from_glib_borrow_mut(ffi::gst_message_writable_details(self.as_mut_ptr()))
113 }
114 }
115
116 #[cfg(feature = "v1_26")]
117 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
118 #[doc(alias = "gst_message_set_details")]
119 #[inline]
120 pub fn set_details(&mut self, structure: Structure) {
121 unsafe {
122 ffi::gst_message_set_details(self.as_mut_ptr(), structure.into_glib_ptr());
123 }
124 }
125
126 #[doc(alias = "gst_message_has_name")]
127 #[inline]
128 pub fn has_name(&self, name: &str) -> bool {
129 self.structure().is_some_and(|s| s.has_name(name))
130 }
131
132 pub fn view(&self) -> MessageView<'_> {
133 unsafe {
134 let type_ = (*self.as_ptr()).type_;
135
136 match type_ {
137 ffi::GST_MESSAGE_EOS => Eos::view(self),
138 ffi::GST_MESSAGE_ERROR => Error::view(self),
139 ffi::GST_MESSAGE_WARNING => Warning::view(self),
140 ffi::GST_MESSAGE_INFO => Info::view(self),
141 ffi::GST_MESSAGE_TAG => Tag::view(self),
142 ffi::GST_MESSAGE_BUFFERING => Buffering::view(self),
143 ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view(self),
144 ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view(self),
145 ffi::GST_MESSAGE_STEP_DONE => StepDone::view(self),
146 ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view(self),
147 ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view(self),
148 ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view(self),
149 ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view(self),
150 ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view(self),
151 ffi::GST_MESSAGE_APPLICATION => Application::view(self),
152 ffi::GST_MESSAGE_ELEMENT => Element::view(self),
153 ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view(self),
154 ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view(self),
155 ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view(self),
156 ffi::GST_MESSAGE_LATENCY => Latency::view(self),
157 ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view(self),
158 ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view(self),
159 ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view(self),
160 ffi::GST_MESSAGE_STEP_START => StepStart::view(self),
161 ffi::GST_MESSAGE_QOS => Qos::view(self),
162 ffi::GST_MESSAGE_PROGRESS => Progress::view(self),
163 ffi::GST_MESSAGE_TOC => Toc::view(self),
164 ffi::GST_MESSAGE_RESET_TIME => ResetTime::view(self),
165 ffi::GST_MESSAGE_STREAM_START => StreamStart::view(self),
166 ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view(self),
167 ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view(self),
168 ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view(self),
169 ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view(self),
170 ffi::GST_MESSAGE_REDIRECT => Redirect::view(self),
171 ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view(self),
172 ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view(self),
173 ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view(self),
174 #[cfg(feature = "v1_16")]
175 ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view(self),
176 #[cfg(feature = "v1_18")]
177 ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view(self),
178 #[cfg(feature = "v1_28")]
179 ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view(self),
180 _ => Other::view(self),
181 }
182 }
183 }
184
185 pub fn view_mut(&mut self) -> MessageViewMut<'_> {
186 unsafe {
187 let type_ = (*self.as_ptr()).type_;
188
189 match type_ {
190 ffi::GST_MESSAGE_EOS => Eos::view_mut(self),
191 ffi::GST_MESSAGE_ERROR => Error::view_mut(self),
192 ffi::GST_MESSAGE_WARNING => Warning::view_mut(self),
193 ffi::GST_MESSAGE_INFO => Info::view_mut(self),
194 ffi::GST_MESSAGE_TAG => Tag::view_mut(self),
195 ffi::GST_MESSAGE_BUFFERING => Buffering::view_mut(self),
196 ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view_mut(self),
197 ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view_mut(self),
198 ffi::GST_MESSAGE_STEP_DONE => StepDone::view_mut(self),
199 ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view_mut(self),
200 ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view_mut(self),
201 ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view_mut(self),
202 ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view_mut(self),
203 ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view_mut(self),
204 ffi::GST_MESSAGE_APPLICATION => Application::view_mut(self),
205 ffi::GST_MESSAGE_ELEMENT => Element::view_mut(self),
206 ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view_mut(self),
207 ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view_mut(self),
208 ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view_mut(self),
209 ffi::GST_MESSAGE_LATENCY => Latency::view_mut(self),
210 ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view_mut(self),
211 ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view_mut(self),
212 ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view_mut(self),
213 ffi::GST_MESSAGE_STEP_START => StepStart::view_mut(self),
214 ffi::GST_MESSAGE_QOS => Qos::view_mut(self),
215 ffi::GST_MESSAGE_PROGRESS => Progress::view_mut(self),
216 ffi::GST_MESSAGE_TOC => Toc::view_mut(self),
217 ffi::GST_MESSAGE_RESET_TIME => ResetTime::view_mut(self),
218 ffi::GST_MESSAGE_STREAM_START => StreamStart::view_mut(self),
219 ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view_mut(self),
220 ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view_mut(self),
221 ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view_mut(self),
222 ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view_mut(self),
223 ffi::GST_MESSAGE_REDIRECT => Redirect::view_mut(self),
224 ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view_mut(self),
225 ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view_mut(self),
226 ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view_mut(self),
227 #[cfg(feature = "v1_16")]
228 ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view_mut(self),
229 #[cfg(feature = "v1_18")]
230 ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view_mut(self),
231 #[cfg(feature = "v1_28")]
232 ffi::GST_MESSAGE_DEVICE_MONITOR_STARTED => DeviceMonitorStarted::view_mut(self),
233 _ => Other::view_mut(self),
234 }
235 }
236 }
237
238 #[doc(alias = "get_type")]
239 #[inline]
240 pub fn type_(&self) -> MessageType {
241 unsafe { from_glib((*self.as_ptr()).type_) }
242 }
243}
244
245impl fmt::Debug for Message {
246 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
247 MessageRef::fmt(self, f)
248 }
249}
250
251impl fmt::Debug for MessageRef {
252 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
253 let concrete: &dyn fmt::Debug = match self.view() {
254 MessageView::Eos(concrete) => concrete,
255 MessageView::Error(concrete) => concrete,
256 MessageView::Warning(concrete) => concrete,
257 MessageView::Info(concrete) => concrete,
258 MessageView::Tag(concrete) => concrete,
259 MessageView::Buffering(concrete) => concrete,
260 MessageView::StateChanged(concrete) => concrete,
261 MessageView::StateDirty(concrete) => concrete,
262 MessageView::StepDone(concrete) => concrete,
263 MessageView::ClockProvide(concrete) => concrete,
264 MessageView::ClockLost(concrete) => concrete,
265 MessageView::NewClock(concrete) => concrete,
266 MessageView::StructureChange(concrete) => concrete,
267 MessageView::StreamStatus(concrete) => concrete,
268 MessageView::Application(concrete) => concrete,
269 MessageView::Element(concrete) => concrete,
270 MessageView::SegmentStart(concrete) => concrete,
271 MessageView::SegmentDone(concrete) => concrete,
272 MessageView::DurationChanged(concrete) => concrete,
273 MessageView::Latency(concrete) => concrete,
274 MessageView::AsyncStart(concrete) => concrete,
275 MessageView::AsyncDone(concrete) => concrete,
276 MessageView::RequestState(concrete) => concrete,
277 MessageView::StepStart(concrete) => concrete,
278 MessageView::Qos(concrete) => concrete,
279 MessageView::Progress(concrete) => concrete,
280 MessageView::Toc(concrete) => concrete,
281 MessageView::ResetTime(concrete) => concrete,
282 MessageView::StreamStart(concrete) => concrete,
283 MessageView::NeedContext(concrete) => concrete,
284 MessageView::HaveContext(concrete) => concrete,
285 MessageView::DeviceAdded(concrete) => concrete,
286 MessageView::DeviceRemoved(concrete) => concrete,
287 MessageView::PropertyNotify(concrete) => concrete,
288 MessageView::StreamCollection(concrete) => concrete,
289 MessageView::StreamsSelected(concrete) => concrete,
290 MessageView::Redirect(concrete) => concrete,
291 #[cfg(feature = "v1_16")]
292 MessageView::DeviceChanged(concrete) => concrete,
293 #[cfg(feature = "v1_18")]
294 MessageView::InstantRateRequest(concrete) => concrete,
295 #[cfg(feature = "v1_28")]
296 MessageView::DeviceMonitorStarted(concrete) => concrete,
297 MessageView::Other(concrete) => concrete,
298 };
299
300 concrete.fmt(f)
301 }
302}
303
304#[derive(Debug)]
305#[non_exhaustive]
306pub enum MessageView<'a> {
307 Eos(&'a Eos),
308 Error(&'a Error),
309 Warning(&'a Warning),
310 Info(&'a Info),
311 Tag(&'a Tag),
312 Buffering(&'a Buffering),
313 StateChanged(&'a StateChanged),
314 StateDirty(&'a StateDirty),
315 StepDone(&'a StepDone),
316 ClockProvide(&'a ClockProvide),
317 ClockLost(&'a ClockLost),
318 NewClock(&'a NewClock),
319 StructureChange(&'a StructureChange),
320 StreamStatus(&'a StreamStatus),
321 Application(&'a Application),
322 Element(&'a Element),
323 SegmentStart(&'a SegmentStart),
324 SegmentDone(&'a SegmentDone),
325 DurationChanged(&'a DurationChanged),
326 Latency(&'a Latency),
327 AsyncStart(&'a AsyncStart),
328 AsyncDone(&'a AsyncDone),
329 RequestState(&'a RequestState),
330 StepStart(&'a StepStart),
331 Qos(&'a Qos),
332 Progress(&'a Progress),
333 Toc(&'a Toc),
334 ResetTime(&'a ResetTime),
335 StreamStart(&'a StreamStart),
336 NeedContext(&'a NeedContext),
337 HaveContext(&'a HaveContext),
338 DeviceAdded(&'a DeviceAdded),
339 DeviceRemoved(&'a DeviceRemoved),
340 PropertyNotify(&'a PropertyNotify),
341 StreamCollection(&'a StreamCollection),
342 StreamsSelected(&'a StreamsSelected),
343 Redirect(&'a Redirect),
344 #[cfg(feature = "v1_16")]
345 #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
346 DeviceChanged(&'a DeviceChanged),
347 #[cfg(feature = "v1_18")]
348 #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
349 InstantRateRequest(&'a InstantRateRequest),
350 #[cfg(feature = "v1_28")]
351 #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
352 DeviceMonitorStarted(&'a DeviceMonitorStarted),
353 Other(&'a Other),
354}
355
356#[derive(Debug)]
357#[non_exhaustive]
358pub enum MessageViewMut<'a> {
359 Eos(&'a mut Eos),
360 Error(&'a mut Error),
361 Warning(&'a mut Warning),
362 Info(&'a mut Info),
363 Tag(&'a mut Tag),
364 Buffering(&'a mut Buffering),
365 StateChanged(&'a mut StateChanged),
366 StateDirty(&'a mut StateDirty),
367 StepDone(&'a mut StepDone),
368 ClockProvide(&'a mut ClockProvide),
369 ClockLost(&'a mut ClockLost),
370 NewClock(&'a mut NewClock),
371 StructureChange(&'a mut StructureChange),
372 StreamStatus(&'a mut StreamStatus),
373 Application(&'a mut Application),
374 Element(&'a mut Element),
375 SegmentStart(&'a mut SegmentStart),
376 SegmentDone(&'a mut SegmentDone),
377 DurationChanged(&'a mut DurationChanged),
378 Latency(&'a mut Latency),
379 AsyncStart(&'a mut AsyncStart),
380 AsyncDone(&'a mut AsyncDone),
381 RequestState(&'a mut RequestState),
382 StepStart(&'a mut StepStart),
383 Qos(&'a mut Qos),
384 Progress(&'a mut Progress),
385 Toc(&'a mut Toc),
386 ResetTime(&'a mut ResetTime),
387 StreamStart(&'a mut StreamStart),
388 NeedContext(&'a mut NeedContext),
389 HaveContext(&'a mut HaveContext),
390 DeviceAdded(&'a mut DeviceAdded),
391 DeviceRemoved(&'a mut DeviceRemoved),
392 PropertyNotify(&'a mut PropertyNotify),
393 StreamCollection(&'a mut StreamCollection),
394 StreamsSelected(&'a mut StreamsSelected),
395 Redirect(&'a mut Redirect),
396 #[cfg(feature = "v1_16")]
397 #[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
398 DeviceChanged(&'a mut DeviceChanged),
399 #[cfg(feature = "v1_18")]
400 #[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
401 InstantRateRequest(&'a mut InstantRateRequest),
402 #[cfg(feature = "v1_28")]
403 #[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
404 DeviceMonitorStarted(&'a mut DeviceMonitorStarted),
405 Other(&'a mut Other),
406}
407
408macro_rules! declare_concrete_message(
409 ($name:ident, $param:ident) => {
410 #[repr(transparent)]
411 pub struct $name<$param = MessageRef>($param);
412
413 impl $name {
414 #[inline]
415 pub fn message(&self) -> &MessageRef {
416 unsafe { &*(self as *const Self as *const MessageRef) }
417 }
418
419 #[inline]
420 pub fn message_mut(&mut self) -> &mut MessageRef {
421 unsafe { &mut *(self as *mut Self as *mut MessageRef) }
422 }
423
424 #[inline]
425 unsafe fn view(message: &MessageRef) -> MessageView<'_> { unsafe {
426 let message = &*(message as *const MessageRef as *const Self);
427 MessageView::$name(message)
428 }}
429
430 #[inline]
431 unsafe fn view_mut(message: &mut MessageRef) -> MessageViewMut<'_> { unsafe {
432 let message = &mut *(message as *mut MessageRef as *mut Self);
433 MessageViewMut::$name(message)
434 }}
435 }
436
437 impl Deref for $name {
438 type Target = MessageRef;
439
440 #[inline]
441 fn deref(&self) -> &Self::Target {
442 unsafe {
443 &*(self as *const Self as *const Self::Target)
444 }
445 }
446 }
447
448 impl DerefMut for $name {
449 #[inline]
450 fn deref_mut(&mut self) -> &mut Self::Target {
451 self.message_mut()
452 }
453 }
454
455 impl ToOwned for $name {
456 type Owned = $name<Message>;
457
458 #[inline]
459 fn to_owned(&self) -> Self::Owned {
460 $name::<Message>(self.copy())
461 }
462 }
463
464 impl $name<Message> {
465 #[inline]
466 pub fn get_mut(&mut self) -> Option<&mut $name> {
467 self.0.get_mut().map(|message| unsafe {
468 &mut *(message as *mut MessageRef as *mut $name)
469 })
470 }
471 }
472
473 impl Deref for $name<Message> {
474 type Target = $name;
475
476 #[inline]
477 fn deref(&self) -> &Self::Target {
478 unsafe { &*(self.0.as_ptr() as *const Self::Target) }
479 }
480 }
481
482 impl DerefMut for $name<Message> {
483 #[inline]
484 fn deref_mut(&mut self) -> &mut Self::Target {
485 debug_assert!(self.0.is_writable());
486 unsafe { &mut *(self.0.as_mut_ptr() as *mut Self::Target) }
487 }
488 }
489
490 impl Borrow<$name> for $name<Message> {
491 #[inline]
492 fn borrow(&self) -> &$name {
493 &*self
494 }
495 }
496
497 impl From<$name<Message>> for Message {
498 #[inline]
499 fn from(concrete: $name<Message>) -> Self {
500 skip_assert_initialized!();
501 concrete.0
502 }
503 }
504 }
505);
506
507macro_rules! impl_debug_concrete_message {
511 (
512 $name:ident $({
513 reserved_fields: $reserved_fields:expr,
514 $(
515 $( #[$att:meta] )?
516 $field:literal $( : $accessor:ident )? $(,)?
517 )+
518 })?
519 ) => {
520 impl std::fmt::Debug for $name {
521 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
522 let seqnum = unsafe { ffi::gst_message_get_seqnum(self.as_mut_ptr()) };
528 let seqnum = if seqnum != 0 {
529 &seqnum as &dyn fmt::Debug
530 } else {
531 &"INVALID (0)" as &dyn fmt::Debug
532 };
533
534 let mut ds = f.debug_struct("Message");
535 #[allow(unused_mut)]
536 let mut ds = ds
537 .field("ptr", &self.as_ptr())
538 .field("type", &self.type_())
539 .field("seqnum", &seqnum)
540 .field("source", &self.src().map(|obj| (obj, obj.name())));
541
542 #[allow(unused)]
543 let mut reserved_fields = [].as_slice();
544 $(
545 reserved_fields = ($reserved_fields).as_slice();
546 $(
547 $( #[$att] )?
548 {
549 $( ds = ds.field($field, &self.$accessor()); )?
550 }
551 )+
552 )?
553
554 if let Some(ref structure) = self.structure() {
556 for (field, value) in structure.iter()
557 .filter(|(field, _value)| !reserved_fields.contains(&field.as_str()))
558 {
559 ds = ds.field(field, value);
560 }
561 }
562
563 ds.finish()
564 }
565 }
566
567 impl std::fmt::Debug for $name<Message> {
568 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> fmt::Result {
569 $name::<MessageRef>::fmt(self, f)
570 }
571 }
572 };
573}
574
575declare_concrete_message!(Eos, T);
576impl Eos {
577 #[doc(alias = "gst_message_new_eos")]
578 #[allow(clippy::new_ret_no_self)]
579 pub fn new() -> Message {
580 skip_assert_initialized!();
581 Self::builder().build()
582 }
583
584 pub fn builder<'a>() -> EosBuilder<'a> {
585 assert_initialized_main_thread!();
586 EosBuilder::new()
587 }
588}
589
590impl_debug_concrete_message!(Eos);
591
592declare_concrete_message!(Error, T);
593impl Error {
594 #[doc(alias = "gst_message_new_error")]
595 #[allow(clippy::new_ret_no_self)]
596 pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
597 skip_assert_initialized!();
598 Self::builder(error, message).build()
599 }
600
601 pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> ErrorBuilder<'_> {
602 assert_initialized_main_thread!();
603 ErrorBuilder::new(glib::Error::new(error, message))
604 }
605
606 pub fn builder_from_error<'a>(error: glib::Error) -> ErrorBuilder<'a> {
607 assert_initialized_main_thread!();
608
609 assert!(
610 [
611 crate::CoreError::domain(),
612 crate::ResourceError::domain(),
613 crate::StreamError::domain(),
614 crate::LibraryError::domain(),
615 ]
616 .contains(&error.domain())
617 );
618 ErrorBuilder::new(error)
619 }
620
621 #[doc(alias = "get_error")]
622 #[doc(alias = "gst_message_parse_error")]
623 pub fn error(&self) -> glib::Error {
624 unsafe {
625 let mut error = ptr::null_mut();
626
627 ffi::gst_message_parse_error(self.as_mut_ptr(), &mut error, ptr::null_mut());
628
629 from_glib_full(error)
630 }
631 }
632
633 #[doc(alias = "get_debug")]
634 #[doc(alias = "gst_message_parse_error")]
635 pub fn debug(&self) -> Option<glib::GString> {
636 unsafe {
637 let mut debug = ptr::null_mut();
638
639 ffi::gst_message_parse_error(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
640
641 from_glib_full(debug)
642 }
643 }
644
645 #[doc(alias = "get_details")]
646 #[doc(alias = "gst_message_parse_error_details")]
647 pub fn details(&self) -> Option<&StructureRef> {
648 unsafe {
649 let mut details = ptr::null();
650
651 ffi::gst_message_parse_error_details(self.as_mut_ptr(), &mut details);
652
653 if details.is_null() {
654 None
655 } else {
656 Some(StructureRef::from_glib_borrow(details))
657 }
658 }
659 }
660
661 #[cfg(feature = "v1_26")]
662 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
663 #[doc(alias = "gst_message_parse_error_writable_details")]
664 pub fn writable_details(&mut self) -> &mut StructureRef {
665 unsafe {
666 let mut details = ptr::null_mut();
667
668 ffi::gst_message_parse_error_writable_details(self.as_mut_ptr(), &mut details);
669
670 StructureRef::from_glib_borrow_mut(details)
671 }
672 }
673}
674
675impl std::fmt::Display for Error {
676 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
677 write!(f, "{}", self.error())
678 }
679}
680
681impl_debug_concrete_message!(Error {
682 reserved_fields: ["gerror", "debug", "details"],
683 "error": error,
684 "debug": debug,
685 "details": details,
686});
687
688declare_concrete_message!(Warning, T);
689impl Warning {
690 #[doc(alias = "gst_message_new_warning")]
691 #[allow(clippy::new_ret_no_self)]
692 pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
693 skip_assert_initialized!();
694 Self::builder(error, message).build()
695 }
696
697 pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> WarningBuilder<'_> {
698 assert_initialized_main_thread!();
699 WarningBuilder::new(glib::Error::new(error, message))
700 }
701
702 pub fn builder_from_error<'a>(error: glib::Error) -> WarningBuilder<'a> {
703 assert_initialized_main_thread!();
704
705 assert!(
706 [
707 crate::CoreError::domain(),
708 crate::ResourceError::domain(),
709 crate::StreamError::domain(),
710 crate::LibraryError::domain(),
711 ]
712 .contains(&error.domain())
713 );
714 WarningBuilder::new(error)
715 }
716
717 #[doc(alias = "get_error")]
718 #[doc(alias = "gst_message_parse_warning")]
719 pub fn error(&self) -> glib::Error {
720 unsafe {
721 let mut error = ptr::null_mut();
722
723 ffi::gst_message_parse_warning(self.as_mut_ptr(), &mut error, ptr::null_mut());
724
725 from_glib_full(error)
726 }
727 }
728
729 #[doc(alias = "get_debug")]
730 #[doc(alias = "gst_message_parse_warning")]
731 pub fn debug(&self) -> Option<glib::GString> {
732 unsafe {
733 let mut debug = ptr::null_mut();
734
735 ffi::gst_message_parse_warning(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
736
737 from_glib_full(debug)
738 }
739 }
740
741 #[doc(alias = "get_details")]
742 #[doc(alias = "gst_message_parse_warning_details")]
743 pub fn details(&self) -> Option<&StructureRef> {
744 unsafe {
745 let mut details = ptr::null();
746
747 ffi::gst_message_parse_warning_details(self.as_mut_ptr(), &mut details);
748
749 if details.is_null() {
750 None
751 } else {
752 Some(StructureRef::from_glib_borrow(details))
753 }
754 }
755 }
756
757 #[cfg(feature = "v1_26")]
758 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
759 #[doc(alias = "gst_message_parse_warning_writable_details")]
760 pub fn writable_details(&mut self) -> &mut StructureRef {
761 unsafe {
762 let mut details = ptr::null_mut();
763
764 ffi::gst_message_parse_warning_writable_details(self.as_mut_ptr(), &mut details);
765
766 StructureRef::from_glib_borrow_mut(details)
767 }
768 }
769}
770
771impl std::fmt::Display for Warning {
772 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
773 write!(f, "{}", self.error())
774 }
775}
776
777impl_debug_concrete_message!(Warning {
778 reserved_fields: ["gerror", "debug", "details"],
779 "error": error,
780 "debug": debug,
781 "details": details,
782});
783
784declare_concrete_message!(Info, T);
785impl Info {
786 #[doc(alias = "gst_message_new_info")]
787 #[allow(clippy::new_ret_no_self)]
788 pub fn new<T: MessageErrorDomain>(error: T, message: &str) -> Message {
789 skip_assert_initialized!();
790 Self::builder(error, message).build()
791 }
792
793 pub fn builder<T: MessageErrorDomain>(error: T, message: &str) -> InfoBuilder<'_> {
794 assert_initialized_main_thread!();
795 InfoBuilder::new(glib::Error::new(error, message))
796 }
797
798 pub fn builder_from_error<'a>(error: glib::Error) -> InfoBuilder<'a> {
799 assert_initialized_main_thread!();
800
801 assert!(
802 [
803 crate::CoreError::domain(),
804 crate::ResourceError::domain(),
805 crate::StreamError::domain(),
806 crate::LibraryError::domain(),
807 ]
808 .contains(&error.domain())
809 );
810 InfoBuilder::new(error)
811 }
812
813 #[doc(alias = "get_error")]
814 #[doc(alias = "gst_message_parse_info")]
815 pub fn error(&self) -> glib::Error {
816 unsafe {
817 let mut error = ptr::null_mut();
818
819 ffi::gst_message_parse_info(self.as_mut_ptr(), &mut error, ptr::null_mut());
820
821 from_glib_full(error)
822 }
823 }
824
825 #[doc(alias = "get_debug")]
826 #[doc(alias = "gst_message_parse_info")]
827 pub fn debug(&self) -> Option<glib::GString> {
828 unsafe {
829 let mut debug = ptr::null_mut();
830
831 ffi::gst_message_parse_info(self.as_mut_ptr(), ptr::null_mut(), &mut debug);
832
833 from_glib_full(debug)
834 }
835 }
836
837 #[doc(alias = "get_details")]
838 #[doc(alias = "gst_message_parse_info_details")]
839 pub fn details(&self) -> Option<&StructureRef> {
840 unsafe {
841 let mut details = ptr::null();
842
843 ffi::gst_message_parse_info_details(self.as_mut_ptr(), &mut details);
844
845 if details.is_null() {
846 None
847 } else {
848 Some(StructureRef::from_glib_borrow(details))
849 }
850 }
851 }
852
853 #[cfg(feature = "v1_26")]
854 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
855 #[doc(alias = "gst_message_parse_info_writable_details")]
856 pub fn writable_details(&mut self) -> &mut StructureRef {
857 unsafe {
858 let mut details = ptr::null_mut();
859
860 ffi::gst_message_parse_info_writable_details(self.as_mut_ptr(), &mut details);
861
862 StructureRef::from_glib_borrow_mut(details)
863 }
864 }
865}
866
867impl std::fmt::Display for Info {
868 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
869 write!(f, "{}", self.error())
870 }
871}
872
873impl_debug_concrete_message!(Info {
874 reserved_fields: ["gerror", "debug", "details"],
875 "error": error,
876 "debug": debug,
877 "details": details,
878});
879
880declare_concrete_message!(Tag, T);
881impl Tag {
882 #[doc(alias = "gst_message_new_tag")]
883 #[allow(clippy::new_ret_no_self)]
884 pub fn new(tags: TagList) -> Message {
885 skip_assert_initialized!();
886 Self::builder(tags).build()
887 }
888
889 pub fn builder<'a>(tags: TagList) -> TagBuilder<'a> {
890 assert_initialized_main_thread!();
891 TagBuilder::new(tags)
892 }
893
894 #[doc(alias = "get_tags")]
895 #[doc(alias = "gst_message_parse_tag")]
896 pub fn tags(&self) -> TagList {
897 unsafe {
898 let mut tags = ptr::null_mut();
899 ffi::gst_message_parse_tag(self.as_mut_ptr(), &mut tags);
900 from_glib_full(tags)
901 }
902 }
903}
904
905impl_debug_concrete_message!(Tag {
906 reserved_fields: ["taglist"],
907 "tags": tags,
908});
909
910declare_concrete_message!(Buffering, T);
911impl Buffering {
912 #[doc(alias = "gst_message_new_buffering")]
913 #[allow(clippy::new_ret_no_self)]
914 pub fn new(percent: i32) -> Message {
915 skip_assert_initialized!();
916 Self::builder(percent).build()
917 }
918
919 pub fn builder<'a>(percent: i32) -> BufferingBuilder<'a> {
920 assert_initialized_main_thread!();
921 BufferingBuilder::new(percent)
922 }
923
924 #[doc(alias = "get_percent")]
925 #[doc(alias = "gst_message_parse_buffering")]
926 pub fn percent(&self) -> i32 {
927 unsafe {
928 let mut p = mem::MaybeUninit::uninit();
929 ffi::gst_message_parse_buffering(self.as_mut_ptr(), p.as_mut_ptr());
930 p.assume_init()
931 }
932 }
933
934 #[doc(alias = "get_buffering_stats")]
935 #[doc(alias = "gst_message_parse_buffering_stats")]
936 pub fn buffering_stats(&self) -> (crate::BufferingMode, i32, i32, i64) {
937 unsafe {
938 let mut mode = mem::MaybeUninit::uninit();
939 let mut avg_in = mem::MaybeUninit::uninit();
940 let mut avg_out = mem::MaybeUninit::uninit();
941 let mut buffering_left = mem::MaybeUninit::uninit();
942
943 ffi::gst_message_parse_buffering_stats(
944 self.as_mut_ptr(),
945 mode.as_mut_ptr(),
946 avg_in.as_mut_ptr(),
947 avg_out.as_mut_ptr(),
948 buffering_left.as_mut_ptr(),
949 );
950
951 (
952 from_glib(mode.assume_init()),
953 avg_in.assume_init(),
954 avg_out.assume_init(),
955 buffering_left.assume_init(),
956 )
957 }
958 }
959
960 #[doc(alias = "get_buffering_stats")]
961 #[doc(alias = "gst_message_parse_buffering_stats")]
962 pub fn mode(&self) -> crate::BufferingMode {
963 self.buffering_stats().0
964 }
965
966 #[doc(alias = "get_buffering_stats")]
967 #[doc(alias = "gst_message_parse_buffering_stats")]
968 pub fn avg_in(&self) -> i32 {
969 self.buffering_stats().1
970 }
971
972 #[doc(alias = "get_buffering_stats")]
973 #[doc(alias = "gst_message_parse_buffering_stats")]
974 pub fn avg_out(&self) -> i32 {
975 self.buffering_stats().2
976 }
977
978 #[doc(alias = "get_buffering_stats")]
979 #[doc(alias = "gst_message_parse_buffering_stats")]
980 pub fn buffering_left(&self) -> i64 {
981 self.buffering_stats().3
982 }
983}
984
985impl_debug_concrete_message!(Buffering {
986 reserved_fields: ["buffer-percent", "buffering-mode", "avg-in-rate", "avg-out-rate", "buffering-left"],
987 "percent": percent,
988 "mode": mode,
989 "avg-in": avg_in,
990 "avg-out": avg_out,
991 "buffering-left": buffering_left,
992});
993
994declare_concrete_message!(StateChanged, T);
995impl StateChanged {
996 #[doc(alias = "gst_message_new_state_changed")]
997 #[allow(clippy::new_ret_no_self)]
998 pub fn new(old: crate::State, new: crate::State, pending: crate::State) -> Message {
999 skip_assert_initialized!();
1000 Self::builder(old, new, pending).build()
1001 }
1002
1003 pub fn builder<'a>(
1004 old: crate::State,
1005 new: crate::State,
1006 pending: crate::State,
1007 ) -> StateChangedBuilder<'a> {
1008 assert_initialized_main_thread!();
1009 StateChangedBuilder::new(old, new, pending)
1010 }
1011
1012 #[doc(alias = "get_old")]
1013 #[doc(alias = "gst_message_parse_state_changed")]
1014 pub fn old(&self) -> crate::State {
1015 unsafe {
1016 let mut state = mem::MaybeUninit::uninit();
1017
1018 ffi::gst_message_parse_state_changed(
1019 self.as_mut_ptr(),
1020 state.as_mut_ptr(),
1021 ptr::null_mut(),
1022 ptr::null_mut(),
1023 );
1024
1025 from_glib(state.assume_init())
1026 }
1027 }
1028
1029 #[doc(alias = "get_current")]
1030 #[doc(alias = "gst_message_parse_state_changed")]
1031 pub fn current(&self) -> crate::State {
1032 unsafe {
1033 let mut state = mem::MaybeUninit::uninit();
1034
1035 ffi::gst_message_parse_state_changed(
1036 self.as_mut_ptr(),
1037 ptr::null_mut(),
1038 state.as_mut_ptr(),
1039 ptr::null_mut(),
1040 );
1041
1042 from_glib(state.assume_init())
1043 }
1044 }
1045
1046 #[doc(alias = "get_pending")]
1047 #[doc(alias = "gst_message_parse_state_changed")]
1048 pub fn pending(&self) -> crate::State {
1049 unsafe {
1050 let mut state = mem::MaybeUninit::uninit();
1051
1052 ffi::gst_message_parse_state_changed(
1053 self.as_mut_ptr(),
1054 ptr::null_mut(),
1055 ptr::null_mut(),
1056 state.as_mut_ptr(),
1057 );
1058
1059 from_glib(state.assume_init())
1060 }
1061 }
1062}
1063
1064impl_debug_concrete_message!(StateChanged {
1065 reserved_fields: ["old-state", "new-state", "pending-state"],
1066 "old": old,
1067 "current": current,
1068 "pending": pending,
1069});
1070
1071declare_concrete_message!(StateDirty, T);
1072impl StateDirty {
1073 #[doc(alias = "gst_message_new_state_dirty")]
1074 #[allow(clippy::new_ret_no_self)]
1075 pub fn new() -> Message {
1076 skip_assert_initialized!();
1077 Self::builder().build()
1078 }
1079
1080 pub fn builder<'a>() -> StateDirtyBuilder<'a> {
1081 assert_initialized_main_thread!();
1082 StateDirtyBuilder::new()
1083 }
1084}
1085
1086impl_debug_concrete_message!(StateDirty);
1087
1088declare_concrete_message!(StepDone, T);
1089impl StepDone {
1090 #[doc(alias = "gst_message_new_step_done")]
1091 #[allow(clippy::new_ret_no_self)]
1092 pub fn new(
1093 amount: impl FormattedValue,
1094 rate: f64,
1095 flush: bool,
1096 intermediate: bool,
1097 duration: impl Into<Option<crate::ClockTime>>,
1098 eos: bool,
1099 ) -> Message {
1100 skip_assert_initialized!();
1101 Self::builder(amount, rate, flush, intermediate, duration, eos).build()
1102 }
1103
1104 pub fn builder<'a>(
1105 amount: impl FormattedValue,
1106 rate: f64,
1107 flush: bool,
1108 intermediate: bool,
1109 duration: impl Into<Option<crate::ClockTime>>,
1110 eos: bool,
1111 ) -> StepDoneBuilder<'a> {
1112 assert_initialized_main_thread!();
1113 StepDoneBuilder::new(
1114 amount.into(),
1115 rate,
1116 flush,
1117 intermediate,
1118 duration.into(),
1119 eos,
1120 )
1121 }
1122
1123 #[doc(alias = "gst_message_parse_step_done")]
1124 pub fn get(
1125 &self,
1126 ) -> (
1127 GenericFormattedValue,
1128 f64,
1129 bool,
1130 bool,
1131 Option<crate::ClockTime>,
1132 bool,
1133 ) {
1134 unsafe {
1135 let mut format = mem::MaybeUninit::uninit();
1136 let mut amount = mem::MaybeUninit::uninit();
1137 let mut rate = mem::MaybeUninit::uninit();
1138 let mut flush = mem::MaybeUninit::uninit();
1139 let mut intermediate = mem::MaybeUninit::uninit();
1140 let mut duration = mem::MaybeUninit::uninit();
1141 let mut eos = mem::MaybeUninit::uninit();
1142
1143 ffi::gst_message_parse_step_done(
1144 self.as_mut_ptr(),
1145 format.as_mut_ptr(),
1146 amount.as_mut_ptr(),
1147 rate.as_mut_ptr(),
1148 flush.as_mut_ptr(),
1149 intermediate.as_mut_ptr(),
1150 duration.as_mut_ptr(),
1151 eos.as_mut_ptr(),
1152 );
1153
1154 (
1155 GenericFormattedValue::new(
1156 from_glib(format.assume_init()),
1157 amount.assume_init() as i64,
1158 ),
1159 rate.assume_init(),
1160 from_glib(flush.assume_init()),
1161 from_glib(intermediate.assume_init()),
1162 from_glib(duration.assume_init()),
1163 from_glib(eos.assume_init()),
1164 )
1165 }
1166 }
1167
1168 #[doc(alias = "gst_message_parse_step_done")]
1169 pub fn format(&self) -> GenericFormattedValue {
1170 self.get().0
1171 }
1172
1173 #[doc(alias = "gst_message_parse_step_done")]
1174 pub fn rate(&self) -> f64 {
1175 self.get().1
1176 }
1177
1178 #[doc(alias = "gst_message_parse_step_done")]
1179 pub fn flush(&self) -> bool {
1180 self.get().2
1181 }
1182
1183 #[doc(alias = "gst_message_parse_step_done")]
1184 pub fn intermediate(&self) -> bool {
1185 self.get().3
1186 }
1187
1188 #[doc(alias = "gst_message_parse_step_done")]
1189 pub fn duration(&self) -> Option<crate::ClockTime> {
1190 self.get().4
1191 }
1192
1193 #[doc(alias = "gst_message_parse_step_done")]
1194 pub fn eos(&self) -> bool {
1195 self.get().5
1196 }
1197}
1198
1199impl_debug_concrete_message!(StepDone {
1200 reserved_fields: ["format", "amount", "rate", "flush", "intermediate", "duration", "eos"],
1201 "format": format,
1202 "rate": rate,
1203 "flush": flush,
1204 "intermediate": intermediate,
1205 "duration": duration,
1206 "eos": eos,
1207});
1208
1209declare_concrete_message!(ClockProvide, T);
1210impl ClockProvide {
1211 #[doc(alias = "gst_message_new_clock_provide")]
1212 #[allow(clippy::new_ret_no_self)]
1213 pub fn new(clock: &crate::Clock, ready: bool) -> Message {
1214 skip_assert_initialized!();
1215 Self::builder(clock, ready).build()
1216 }
1217
1218 pub fn builder(clock: &crate::Clock, ready: bool) -> ClockProvideBuilder<'_> {
1219 assert_initialized_main_thread!();
1220 ClockProvideBuilder::new(clock, ready)
1221 }
1222
1223 #[doc(alias = "get_clock")]
1224 #[doc(alias = "gst_message_parse_clock_provide")]
1225 pub fn clock(&self) -> Option<crate::Clock> {
1226 let mut clock = ptr::null_mut();
1227
1228 unsafe {
1229 ffi::gst_message_parse_clock_provide(self.as_mut_ptr(), &mut clock, ptr::null_mut());
1230
1231 from_glib_none(clock)
1232 }
1233 }
1234
1235 #[doc(alias = "get_ready")]
1236 #[doc(alias = "gst_message_parse_clock_provide")]
1237 pub fn is_ready(&self) -> bool {
1238 unsafe {
1239 let mut ready = mem::MaybeUninit::uninit();
1240
1241 ffi::gst_message_parse_clock_provide(
1242 self.as_mut_ptr(),
1243 ptr::null_mut(),
1244 ready.as_mut_ptr(),
1245 );
1246
1247 from_glib(ready.assume_init())
1248 }
1249 }
1250}
1251
1252impl_debug_concrete_message!(ClockProvide {
1253 reserved_fields: ["clock", "ready"],
1254 "clock": clock,
1255 "is-ready": is_ready,
1256});
1257
1258declare_concrete_message!(ClockLost, T);
1259impl ClockLost {
1260 #[doc(alias = "gst_message_new_clock_lost")]
1261 #[allow(clippy::new_ret_no_self)]
1262 pub fn new(clock: &crate::Clock) -> Message {
1263 skip_assert_initialized!();
1264 Self::builder(clock).build()
1265 }
1266
1267 pub fn builder(clock: &crate::Clock) -> ClockLostBuilder<'_> {
1268 assert_initialized_main_thread!();
1269 ClockLostBuilder::new(clock)
1270 }
1271
1272 #[doc(alias = "get_clock")]
1273 #[doc(alias = "gst_message_parse_clock_lost")]
1274 pub fn clock(&self) -> Option<crate::Clock> {
1275 let mut clock = ptr::null_mut();
1276
1277 unsafe {
1278 ffi::gst_message_parse_clock_lost(self.as_mut_ptr(), &mut clock);
1279
1280 from_glib_none(clock)
1281 }
1282 }
1283}
1284
1285impl_debug_concrete_message!(ClockLost {
1286 reserved_fields: ["clock"],
1287 "clock": clock,
1288});
1289
1290declare_concrete_message!(NewClock, T);
1291impl NewClock {
1292 #[doc(alias = "gst_message_new_new_clock")]
1293 #[allow(clippy::new_ret_no_self)]
1294 pub fn new(clock: &crate::Clock) -> Message {
1295 skip_assert_initialized!();
1296 Self::builder(clock).build()
1297 }
1298
1299 pub fn builder(clock: &crate::Clock) -> NewClockBuilder<'_> {
1300 assert_initialized_main_thread!();
1301 NewClockBuilder::new(clock)
1302 }
1303
1304 #[doc(alias = "get_clock")]
1305 #[doc(alias = "gst_message_parse_new_clock")]
1306 pub fn clock(&self) -> Option<crate::Clock> {
1307 let mut clock = ptr::null_mut();
1308
1309 unsafe {
1310 ffi::gst_message_parse_new_clock(self.as_mut_ptr(), &mut clock);
1311
1312 from_glib_none(clock)
1313 }
1314 }
1315}
1316
1317impl_debug_concrete_message!(NewClock {
1318 reserved_fields: ["clock"],
1319 "clock": clock,
1320});
1321
1322declare_concrete_message!(StructureChange, T);
1323impl StructureChange {
1324 #[doc(alias = "gst_message_new_structure_change")]
1325 #[allow(clippy::new_ret_no_self)]
1326 pub fn new(type_: crate::StructureChangeType, owner: &crate::Element, busy: bool) -> Message {
1327 skip_assert_initialized!();
1328 Self::builder(type_, owner, busy).build()
1329 }
1330
1331 pub fn builder(
1332 type_: crate::StructureChangeType,
1333 owner: &crate::Element,
1334 busy: bool,
1335 ) -> StructureChangeBuilder<'_> {
1336 assert_initialized_main_thread!();
1337 StructureChangeBuilder::new(type_, owner, busy)
1338 }
1339
1340 #[doc(alias = "gst_message_parse_structure_change")]
1341 pub fn get(&self) -> (crate::StructureChangeType, crate::Element, bool) {
1342 unsafe {
1343 let mut type_ = mem::MaybeUninit::uninit();
1344 let mut owner = ptr::null_mut();
1345 let mut busy = mem::MaybeUninit::uninit();
1346
1347 ffi::gst_message_parse_structure_change(
1348 self.as_mut_ptr(),
1349 type_.as_mut_ptr(),
1350 &mut owner,
1351 busy.as_mut_ptr(),
1352 );
1353
1354 (
1355 from_glib(type_.assume_init()),
1356 from_glib_none(owner),
1357 from_glib(busy.assume_init()),
1358 )
1359 }
1360 }
1361
1362 #[doc(alias = "gst_message_parse_structure_change")]
1363 pub fn type_(&self) -> crate::StructureChangeType {
1364 self.get().0
1365 }
1366
1367 #[doc(alias = "gst_message_parse_structure_change")]
1368 pub fn owner(&self) -> crate::Element {
1369 self.get().1
1370 }
1371
1372 #[doc(alias = "gst_message_parse_structure_change")]
1373 pub fn busy(&self) -> bool {
1374 self.get().2
1375 }
1376}
1377
1378impl_debug_concrete_message!(StructureChange {
1379 reserved_fields: ["type", "owner", "busy"],
1380 "type": type_,
1381 "owner": owner,
1382 "busy": busy,
1383});
1384
1385declare_concrete_message!(StreamStatus, T);
1386impl StreamStatus {
1387 #[doc(alias = "gst_message_new_stream_status")]
1388 #[allow(clippy::new_ret_no_self)]
1389 pub fn new(type_: crate::StreamStatusType, owner: &crate::Element) -> Message {
1390 skip_assert_initialized!();
1391 Self::builder(type_, owner).build()
1392 }
1393
1394 pub fn builder(
1395 type_: crate::StreamStatusType,
1396 owner: &crate::Element,
1397 ) -> StreamStatusBuilder<'_> {
1398 assert_initialized_main_thread!();
1399 StreamStatusBuilder::new(type_, owner)
1400 }
1401
1402 #[doc(alias = "gst_message_parse_stream_status")]
1403 pub fn get(&self) -> (crate::StreamStatusType, crate::Element) {
1404 unsafe {
1405 let mut type_ = mem::MaybeUninit::uninit();
1406 let mut owner = ptr::null_mut();
1407
1408 ffi::gst_message_parse_stream_status(self.as_mut_ptr(), type_.as_mut_ptr(), &mut owner);
1409
1410 (from_glib(type_.assume_init()), from_glib_none(owner))
1411 }
1412 }
1413
1414 #[doc(alias = "gst_message_parse_stream_status")]
1415 pub fn type_(&self) -> crate::StreamStatusType {
1416 self.get().0
1417 }
1418
1419 #[doc(alias = "gst_message_parse_stream_status")]
1420 pub fn owner(&self) -> crate::Element {
1421 self.get().1
1422 }
1423
1424 #[doc(alias = "get_stream_status_object")]
1425 #[doc(alias = "gst_message_get_stream_status_object")]
1426 pub fn stream_status_object(&self) -> Option<glib::Value> {
1427 unsafe {
1428 let value = ffi::gst_message_get_stream_status_object(self.as_mut_ptr());
1429
1430 from_glib_none(value)
1431 }
1432 }
1433}
1434
1435impl_debug_concrete_message!(StreamStatus {
1436 reserved_fields: ["type", "owner", "object"],
1437 "type": type_,
1438 "owner": owner,
1439 "object": stream_status_object,
1440});
1441
1442declare_concrete_message!(Application, T);
1443impl Application {
1444 #[doc(alias = "gst_message_new_application")]
1445 #[allow(clippy::new_ret_no_self)]
1446 pub fn new(structure: crate::Structure) -> Message {
1447 skip_assert_initialized!();
1448 Self::builder(structure).build()
1449 }
1450
1451 pub fn builder<'a>(structure: crate::Structure) -> ApplicationBuilder<'a> {
1452 assert_initialized_main_thread!();
1453 ApplicationBuilder::new(structure)
1454 }
1455}
1456
1457impl_debug_concrete_message!(Application);
1458
1459declare_concrete_message!(Element, T);
1460impl Element {
1461 #[doc(alias = "gst_message_new_element")]
1462 #[allow(clippy::new_ret_no_self)]
1463 pub fn new(structure: crate::Structure) -> Message {
1464 skip_assert_initialized!();
1465 Self::builder(structure).build()
1466 }
1467
1468 pub fn builder<'a>(structure: crate::Structure) -> ElementBuilder<'a> {
1469 assert_initialized_main_thread!();
1470 ElementBuilder::new(structure)
1471 }
1472}
1473
1474impl_debug_concrete_message!(Element);
1475
1476declare_concrete_message!(SegmentStart, T);
1477impl SegmentStart {
1478 #[doc(alias = "gst_message_new_segment_start")]
1479 #[allow(clippy::new_ret_no_self)]
1480 pub fn new(position: impl FormattedValue) -> Message {
1481 skip_assert_initialized!();
1482 Self::builder(position).build()
1483 }
1484
1485 pub fn builder<'a>(position: impl FormattedValue) -> SegmentStartBuilder<'a> {
1486 assert_initialized_main_thread!();
1487 SegmentStartBuilder::new(position.into())
1488 }
1489
1490 #[doc(alias = "gst_message_parse_segment_start")]
1491 pub fn get(&self) -> GenericFormattedValue {
1492 unsafe {
1493 let mut format = mem::MaybeUninit::uninit();
1494 let mut position = mem::MaybeUninit::uninit();
1495
1496 ffi::gst_message_parse_segment_start(
1497 self.as_mut_ptr(),
1498 format.as_mut_ptr(),
1499 position.as_mut_ptr(),
1500 );
1501
1502 GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1503 }
1504 }
1505
1506 #[doc(alias = "gst_message_parse_segment_start")]
1507 pub fn position(&self) -> GenericFormattedValue {
1508 self.get()
1509 }
1510}
1511
1512impl_debug_concrete_message!(SegmentStart {
1513 reserved_fields: ["format", "position"],
1514 "position": position,
1515});
1516
1517declare_concrete_message!(SegmentDone, T);
1518impl SegmentDone {
1519 #[doc(alias = "gst_message_new_segment_done")]
1520 #[allow(clippy::new_ret_no_self)]
1521 pub fn new(position: impl FormattedValue) -> Message {
1522 skip_assert_initialized!();
1523 Self::builder(position).build()
1524 }
1525
1526 pub fn builder<'a>(position: impl FormattedValue) -> SegmentDoneBuilder<'a> {
1527 assert_initialized_main_thread!();
1528 SegmentDoneBuilder::new(position.into())
1529 }
1530
1531 #[doc(alias = "gst_message_parse_segment_done")]
1532 pub fn get(&self) -> GenericFormattedValue {
1533 unsafe {
1534 let mut format = mem::MaybeUninit::uninit();
1535 let mut position = mem::MaybeUninit::uninit();
1536
1537 ffi::gst_message_parse_segment_done(
1538 self.as_mut_ptr(),
1539 format.as_mut_ptr(),
1540 position.as_mut_ptr(),
1541 );
1542
1543 GenericFormattedValue::new(from_glib(format.assume_init()), position.assume_init())
1544 }
1545 }
1546
1547 #[doc(alias = "gst_message_parse_segment_start")]
1548 pub fn position(&self) -> GenericFormattedValue {
1549 self.get()
1550 }
1551}
1552
1553impl_debug_concrete_message!(SegmentDone {
1554 reserved_fields: ["format", "position"],
1555 "position": position,
1556});
1557
1558declare_concrete_message!(DurationChanged, T);
1559impl DurationChanged {
1560 #[doc(alias = "gst_message_new_duration_changed")]
1561 #[allow(clippy::new_ret_no_self)]
1562 pub fn new() -> Message {
1563 skip_assert_initialized!();
1564 Self::builder().build()
1565 }
1566
1567 pub fn builder<'a>() -> DurationChangedBuilder<'a> {
1568 assert_initialized_main_thread!();
1569 DurationChangedBuilder::new()
1570 }
1571}
1572
1573impl_debug_concrete_message!(DurationChanged);
1574
1575declare_concrete_message!(Latency, T);
1576impl Latency {
1577 #[doc(alias = "gst_message_new_latency")]
1578 #[allow(clippy::new_ret_no_self)]
1579 pub fn new() -> Message {
1580 skip_assert_initialized!();
1581 Self::builder().build()
1582 }
1583
1584 pub fn builder<'a>() -> LatencyBuilder<'a> {
1585 assert_initialized_main_thread!();
1586 LatencyBuilder::new()
1587 }
1588}
1589
1590impl_debug_concrete_message!(Latency);
1591
1592declare_concrete_message!(AsyncStart, T);
1593impl AsyncStart {
1594 #[doc(alias = "gst_message_new_async_start")]
1595 #[allow(clippy::new_ret_no_self)]
1596 pub fn new() -> Message {
1597 skip_assert_initialized!();
1598 Self::builder().build()
1599 }
1600
1601 pub fn builder<'a>() -> AsyncStartBuilder<'a> {
1602 assert_initialized_main_thread!();
1603 AsyncStartBuilder::new()
1604 }
1605}
1606
1607impl_debug_concrete_message!(AsyncStart);
1608
1609declare_concrete_message!(AsyncDone, T);
1610impl AsyncDone {
1611 #[doc(alias = "gst_message_new_async_done")]
1612 #[allow(clippy::new_ret_no_self)]
1613 pub fn new(running_time: impl Into<Option<crate::ClockTime>>) -> Message {
1614 skip_assert_initialized!();
1615 Self::builder().running_time(running_time).build()
1616 }
1617
1618 pub fn builder<'a>() -> AsyncDoneBuilder<'a> {
1619 assert_initialized_main_thread!();
1620 AsyncDoneBuilder::new()
1621 }
1622
1623 #[doc(alias = "get_running_time")]
1624 #[doc(alias = "gst_message_parse_async_done")]
1625 pub fn running_time(&self) -> Option<crate::ClockTime> {
1626 unsafe {
1627 let mut running_time = mem::MaybeUninit::uninit();
1628
1629 ffi::gst_message_parse_async_done(self.as_mut_ptr(), running_time.as_mut_ptr());
1630
1631 from_glib(running_time.assume_init())
1632 }
1633 }
1634}
1635
1636impl_debug_concrete_message!(AsyncDone {
1637 reserved_fields: ["running-time"],
1638 "running-time": running_time,
1639});
1640
1641declare_concrete_message!(RequestState, T);
1642impl RequestState {
1643 #[doc(alias = "gst_message_new_request_state")]
1644 #[allow(clippy::new_ret_no_self)]
1645 pub fn new(state: crate::State) -> Message {
1646 skip_assert_initialized!();
1647 Self::builder(state).build()
1648 }
1649
1650 pub fn builder<'a>(state: crate::State) -> RequestStateBuilder<'a> {
1651 assert_initialized_main_thread!();
1652 RequestStateBuilder::new(state)
1653 }
1654
1655 #[doc(alias = "get_requested_state")]
1656 #[doc(alias = "gst_message_parse_request_state")]
1657 pub fn requested_state(&self) -> crate::State {
1658 unsafe {
1659 let mut state = mem::MaybeUninit::uninit();
1660
1661 ffi::gst_message_parse_request_state(self.as_mut_ptr(), state.as_mut_ptr());
1662
1663 from_glib(state.assume_init())
1664 }
1665 }
1666}
1667
1668impl_debug_concrete_message!(RequestState {
1669 reserved_fields: ["new-state"],
1670 "requested-state": requested_state,
1671});
1672
1673declare_concrete_message!(StepStart, T);
1674impl StepStart {
1675 #[doc(alias = "gst_message_new_step_start")]
1676 #[allow(clippy::new_ret_no_self)]
1677 pub fn new(
1678 active: bool,
1679 amount: impl FormattedValue,
1680 rate: f64,
1681 flush: bool,
1682 intermediate: bool,
1683 ) -> Message {
1684 skip_assert_initialized!();
1685 Self::builder(active, amount, rate, flush, intermediate).build()
1686 }
1687
1688 pub fn builder<'a>(
1689 active: bool,
1690 amount: impl FormattedValue,
1691 rate: f64,
1692 flush: bool,
1693 intermediate: bool,
1694 ) -> StepStartBuilder<'a> {
1695 assert_initialized_main_thread!();
1696 StepStartBuilder::new(active, amount.into(), rate, flush, intermediate)
1697 }
1698
1699 #[doc(alias = "gst_message_parse_step_start")]
1700 pub fn get(&self) -> (bool, GenericFormattedValue, f64, bool, bool) {
1701 unsafe {
1702 let mut active = mem::MaybeUninit::uninit();
1703 let mut format = mem::MaybeUninit::uninit();
1704 let mut amount = mem::MaybeUninit::uninit();
1705 let mut rate = mem::MaybeUninit::uninit();
1706 let mut flush = mem::MaybeUninit::uninit();
1707 let mut intermediate = mem::MaybeUninit::uninit();
1708
1709 ffi::gst_message_parse_step_start(
1710 self.as_mut_ptr(),
1711 active.as_mut_ptr(),
1712 format.as_mut_ptr(),
1713 amount.as_mut_ptr(),
1714 rate.as_mut_ptr(),
1715 flush.as_mut_ptr(),
1716 intermediate.as_mut_ptr(),
1717 );
1718
1719 (
1720 from_glib(active.assume_init()),
1721 GenericFormattedValue::new(
1722 from_glib(format.assume_init()),
1723 amount.assume_init() as i64,
1724 ),
1725 rate.assume_init(),
1726 from_glib(flush.assume_init()),
1727 from_glib(intermediate.assume_init()),
1728 )
1729 }
1730 }
1731
1732 #[doc(alias = "gst_message_parse_step_start")]
1733 pub fn active(&self) -> bool {
1734 self.get().0
1735 }
1736
1737 #[doc(alias = "gst_message_parse_step_start")]
1738 pub fn amount(&self) -> GenericFormattedValue {
1739 self.get().1
1740 }
1741
1742 #[doc(alias = "gst_message_parse_step_start")]
1743 pub fn rate(&self) -> f64 {
1744 self.get().2
1745 }
1746
1747 #[doc(alias = "gst_message_parse_step_start")]
1748 pub fn flush(&self) -> bool {
1749 self.get().3
1750 }
1751
1752 #[doc(alias = "gst_message_parse_step_start")]
1753 pub fn intermediate(&self) -> bool {
1754 self.get().4
1755 }
1756}
1757
1758impl_debug_concrete_message!(StepStart {
1759 reserved_fields: ["active", "format", "amount", "rate", "flush", "intermediate"],
1760 "active": active,
1761 "amount": amount,
1762 "rate": rate,
1763 "flush": flush,
1764 "intermediate": intermediate,
1765});
1766
1767declare_concrete_message!(Qos, T);
1768impl Qos {
1769 #[doc(alias = "gst_message_new_qos")]
1770 #[allow(clippy::new_ret_no_self)]
1771 pub fn new(
1772 live: bool,
1773 running_time: impl Into<Option<crate::ClockTime>>,
1774 stream_time: impl Into<Option<crate::ClockTime>>,
1775 timestamp: impl Into<Option<crate::ClockTime>>,
1776 duration: impl Into<Option<crate::ClockTime>>,
1777 ) -> Message {
1778 skip_assert_initialized!();
1779 Self::builder(live)
1780 .running_time(running_time)
1781 .stream_time(stream_time)
1782 .timestamp(timestamp)
1783 .duration(duration)
1784 .build()
1785 }
1786
1787 pub fn builder<'a>(live: bool) -> QosBuilder<'a> {
1788 assert_initialized_main_thread!();
1789 QosBuilder::new(live)
1790 }
1791
1792 #[doc(alias = "gst_message_parse_qos")]
1793 pub fn get(
1794 &self,
1795 ) -> (
1796 bool,
1797 Option<crate::ClockTime>,
1798 Option<crate::ClockTime>,
1799 Option<crate::ClockTime>,
1800 Option<crate::ClockTime>,
1801 ) {
1802 unsafe {
1803 let mut live = mem::MaybeUninit::uninit();
1804 let mut running_time = mem::MaybeUninit::uninit();
1805 let mut stream_time = mem::MaybeUninit::uninit();
1806 let mut timestamp = mem::MaybeUninit::uninit();
1807 let mut duration = mem::MaybeUninit::uninit();
1808
1809 ffi::gst_message_parse_qos(
1810 self.as_mut_ptr(),
1811 live.as_mut_ptr(),
1812 running_time.as_mut_ptr(),
1813 stream_time.as_mut_ptr(),
1814 timestamp.as_mut_ptr(),
1815 duration.as_mut_ptr(),
1816 );
1817
1818 (
1819 from_glib(live.assume_init()),
1820 from_glib(running_time.assume_init()),
1821 from_glib(stream_time.assume_init()),
1822 from_glib(timestamp.assume_init()),
1823 from_glib(duration.assume_init()),
1824 )
1825 }
1826 }
1827
1828 #[doc(alias = "gst_message_parse_qos")]
1829 pub fn live(&self) -> bool {
1830 self.get().0
1831 }
1832
1833 #[doc(alias = "gst_message_parse_qos")]
1834 pub fn running_time(&self) -> Option<crate::ClockTime> {
1835 self.get().1
1836 }
1837
1838 #[doc(alias = "gst_message_parse_qos")]
1839 pub fn stream_time(&self) -> Option<crate::ClockTime> {
1840 self.get().2
1841 }
1842
1843 #[doc(alias = "gst_message_parse_qos")]
1844 pub fn timestamp(&self) -> Option<crate::ClockTime> {
1845 self.get().3
1846 }
1847
1848 #[doc(alias = "gst_message_parse_qos")]
1849 pub fn duration(&self) -> Option<crate::ClockTime> {
1850 self.get().4
1851 }
1852
1853 #[doc(alias = "get_values")]
1854 #[doc(alias = "gst_message_parse_qos_values")]
1855 pub fn values(&self) -> (i64, f64, i32) {
1856 unsafe {
1857 let mut jitter = mem::MaybeUninit::uninit();
1858 let mut proportion = mem::MaybeUninit::uninit();
1859 let mut quality = mem::MaybeUninit::uninit();
1860
1861 ffi::gst_message_parse_qos_values(
1862 self.as_mut_ptr(),
1863 jitter.as_mut_ptr(),
1864 proportion.as_mut_ptr(),
1865 quality.as_mut_ptr(),
1866 );
1867
1868 (
1869 jitter.assume_init(),
1870 proportion.assume_init(),
1871 quality.assume_init(),
1872 )
1873 }
1874 }
1875
1876 #[doc(alias = "get_values")]
1877 #[doc(alias = "gst_message_parse_qos_values")]
1878 pub fn jitter(&self) -> i64 {
1879 self.values().0
1880 }
1881
1882 #[doc(alias = "get_values")]
1883 #[doc(alias = "gst_message_parse_qos_values")]
1884 pub fn proportion(&self) -> f64 {
1885 self.values().1
1886 }
1887
1888 #[doc(alias = "get_values")]
1889 #[doc(alias = "gst_message_parse_qos_values")]
1890 pub fn quality(&self) -> i32 {
1891 self.values().2
1892 }
1893
1894 #[doc(alias = "get_stats")]
1895 #[doc(alias = "gst_message_parse_qos_stats")]
1896 pub fn stats(&self) -> (GenericFormattedValue, GenericFormattedValue) {
1897 unsafe {
1898 let mut format = mem::MaybeUninit::uninit();
1899 let mut processed = mem::MaybeUninit::uninit();
1900 let mut dropped = mem::MaybeUninit::uninit();
1901
1902 ffi::gst_message_parse_qos_stats(
1903 self.as_mut_ptr(),
1904 format.as_mut_ptr(),
1905 processed.as_mut_ptr(),
1906 dropped.as_mut_ptr(),
1907 );
1908
1909 (
1910 GenericFormattedValue::new(
1911 from_glib(format.assume_init()),
1912 processed.assume_init() as i64,
1913 ),
1914 GenericFormattedValue::new(
1915 from_glib(format.assume_init()),
1916 dropped.assume_init() as i64,
1917 ),
1918 )
1919 }
1920 }
1921
1922 #[doc(alias = "get_stats")]
1923 #[doc(alias = "gst_message_parse_qos_stats")]
1924 pub fn processed(&self) -> GenericFormattedValue {
1925 self.stats().0
1926 }
1927
1928 #[doc(alias = "get_stats")]
1929 #[doc(alias = "gst_message_parse_qos_stats")]
1930 pub fn dropped(&self) -> GenericFormattedValue {
1931 self.stats().1
1932 }
1933}
1934
1935impl_debug_concrete_message!(Qos {
1936 reserved_fields: [
1937 "live", "running-time", "stream-time", "timestamp", "duration",
1938 "jitter", "proportion", "quality", "format", "processed", "dropped"
1939 ],
1940 "is-live": live,
1941 "running-time": running_time,
1942 "stream-time": stream_time,
1943 "timestamp": timestamp,
1944 "duration": duration,
1945 "jitter": jitter,
1946 "proportion": proportion,
1947 "quality": quality,
1948 "processed": processed,
1949 "dropped": dropped,
1950});
1951
1952declare_concrete_message!(Progress, T);
1953impl Progress {
1954 #[doc(alias = "gst_message_new_progress")]
1955 #[allow(clippy::new_ret_no_self)]
1956 pub fn new(type_: crate::ProgressType, code: &str, text: &str) -> Message {
1957 skip_assert_initialized!();
1958 Self::builder(type_, code, text).build()
1959 }
1960
1961 pub fn builder<'a>(
1962 type_: crate::ProgressType,
1963 code: &'a str,
1964 text: &'a str,
1965 ) -> ProgressBuilder<'a> {
1966 assert_initialized_main_thread!();
1967 ProgressBuilder::new(type_, code, text)
1968 }
1969
1970 #[doc(alias = "gst_message_parse_progress")]
1971 pub fn get(&self) -> (crate::ProgressType, &str, &str) {
1972 unsafe {
1973 let mut type_ = mem::MaybeUninit::uninit();
1974 let mut code = ptr::null_mut();
1975 let mut text = ptr::null_mut();
1976
1977 ffi::gst_message_parse_progress(
1978 self.as_mut_ptr(),
1979 type_.as_mut_ptr(),
1980 &mut code,
1981 &mut text,
1982 );
1983
1984 let code = CStr::from_ptr(code).to_str().unwrap();
1985 let text = CStr::from_ptr(text).to_str().unwrap();
1986
1987 (from_glib(type_.assume_init()), code, text)
1988 }
1989 }
1990
1991 #[doc(alias = "gst_message_parse_progress")]
1992 pub fn type_(&self) -> crate::ProgressType {
1993 self.get().0
1994 }
1995
1996 #[doc(alias = "gst_message_parse_progress")]
1997 pub fn code(&self) -> &str {
1998 self.get().1
1999 }
2000
2001 #[doc(alias = "gst_message_parse_progress")]
2002 pub fn text(&self) -> &str {
2003 self.get().2
2004 }
2005}
2006
2007impl_debug_concrete_message!(Progress {
2008 reserved_fields: ["type", "code", "text", "percent", "timeout"],
2009 "type": type_,
2010 "code": code,
2011 "text": text,
2012});
2013
2014declare_concrete_message!(Toc, T);
2015impl Toc {
2016 #[doc(alias = "gst_message_new_toc")]
2019 #[allow(clippy::new_ret_no_self)]
2020 pub fn new(toc: &crate::Toc, updated: bool) -> Message {
2021 skip_assert_initialized!();
2022 Self::builder(toc, updated).build()
2023 }
2024
2025 pub fn builder(toc: &crate::Toc, updated: bool) -> TocBuilder<'_> {
2026 assert_initialized_main_thread!();
2027 TocBuilder::new(toc, updated)
2028 }
2029
2030 #[doc(alias = "get_toc")]
2031 #[doc(alias = "gst_message_parse_toc")]
2032 pub fn toc(&self) -> (crate::Toc, bool) {
2033 unsafe {
2034 let mut toc = ptr::null_mut();
2035 let mut updated = mem::MaybeUninit::uninit();
2036 ffi::gst_message_parse_toc(self.as_mut_ptr(), &mut toc, updated.as_mut_ptr());
2037 (from_glib_full(toc), from_glib(updated.assume_init()))
2038 }
2039 }
2040
2041 #[doc(alias = "get_toc")]
2042 #[doc(alias = "gst_message_parse_toc")]
2043 pub fn toc_object(&self) -> crate::Toc {
2044 self.toc().0
2045 }
2046
2047 #[doc(alias = "get_toc")]
2048 #[doc(alias = "gst_message_parse_toc")]
2049 pub fn updated(&self) -> bool {
2050 self.toc().1
2051 }
2052}
2053
2054impl_debug_concrete_message!(Toc {
2055 reserved_fields: ["toc", "updated"],
2056 "toc": toc_object,
2057 "updated": updated,
2058});
2059
2060declare_concrete_message!(ResetTime, T);
2061impl ResetTime {
2062 #[doc(alias = "gst_message_new_reset_time")]
2063 #[allow(clippy::new_ret_no_self)]
2064 pub fn new(running_time: crate::ClockTime) -> Message {
2065 skip_assert_initialized!();
2066 Self::builder(running_time).build()
2067 }
2068
2069 pub fn builder<'a>(running_time: crate::ClockTime) -> ResetTimeBuilder<'a> {
2070 assert_initialized_main_thread!();
2071 ResetTimeBuilder::new(running_time)
2072 }
2073
2074 #[doc(alias = "get_running_time")]
2075 #[doc(alias = "gst_message_parse_reset_time")]
2076 pub fn running_time(&self) -> crate::ClockTime {
2077 unsafe {
2078 let mut running_time = mem::MaybeUninit::uninit();
2079
2080 ffi::gst_message_parse_reset_time(self.as_mut_ptr(), running_time.as_mut_ptr());
2081
2082 try_from_glib(running_time.assume_init()).expect("undefined running_time")
2083 }
2084 }
2085}
2086
2087impl_debug_concrete_message!(ResetTime {
2088 reserved_fields: ["running-time"],
2089 "running-time": running_time,
2090});
2091
2092declare_concrete_message!(StreamStart, T);
2093impl StreamStart {
2094 #[doc(alias = "gst_message_new_stream_start")]
2095 #[allow(clippy::new_ret_no_self)]
2096 pub fn new() -> Message {
2097 skip_assert_initialized!();
2098 Self::builder().build()
2099 }
2100
2101 pub fn builder<'a>() -> StreamStartBuilder<'a> {
2102 assert_initialized_main_thread!();
2103 StreamStartBuilder::new()
2104 }
2105
2106 #[doc(alias = "get_group_id")]
2107 #[doc(alias = "gst_message_parse_group_id")]
2108 pub fn group_id(&self) -> Option<GroupId> {
2109 unsafe {
2110 let mut group_id = mem::MaybeUninit::uninit();
2111
2112 if from_glib(ffi::gst_message_parse_group_id(
2113 self.as_mut_ptr(),
2114 group_id.as_mut_ptr(),
2115 )) {
2116 let group_id = group_id.assume_init();
2117 if group_id == 0 {
2118 None
2119 } else {
2120 Some(GroupId(NonZeroU32::new_unchecked(group_id)))
2121 }
2122 } else {
2123 None
2124 }
2125 }
2126 }
2127
2128 #[doc(alias = "gst_message_set_group_id")]
2129 pub fn set_group_id(&mut self, group_id: GroupId) {
2130 unsafe {
2131 ffi::gst_message_set_group_id(self.as_mut_ptr(), group_id.0.get());
2132 }
2133 }
2134}
2135
2136impl_debug_concrete_message!(StreamStart {
2137 reserved_fields: ["group-id"],
2138 "group-id": group_id,
2139});
2140
2141declare_concrete_message!(NeedContext, T);
2142impl NeedContext {
2143 #[doc(alias = "gst_message_new_need_context")]
2144 #[allow(clippy::new_ret_no_self)]
2145 pub fn new(context_type: &str) -> Message {
2146 skip_assert_initialized!();
2147 Self::builder(context_type).build()
2148 }
2149
2150 pub fn builder(context_type: &str) -> NeedContextBuilder<'_> {
2151 assert_initialized_main_thread!();
2152 NeedContextBuilder::new(context_type)
2153 }
2154
2155 #[doc(alias = "get_context_type")]
2156 #[doc(alias = "gst_message_parse_context_type")]
2157 pub fn context_type(&self) -> &str {
2158 unsafe {
2159 let mut context_type = ptr::null();
2160
2161 ffi::gst_message_parse_context_type(self.as_mut_ptr(), &mut context_type);
2162
2163 CStr::from_ptr(context_type).to_str().unwrap()
2164 }
2165 }
2166}
2167
2168impl_debug_concrete_message!(NeedContext {
2169 reserved_fields: ["context-type"],
2170 "context-type": context_type,
2171});
2172
2173declare_concrete_message!(HaveContext, T);
2174impl HaveContext {
2175 #[doc(alias = "gst_message_new_have_context")]
2176 #[allow(clippy::new_ret_no_self)]
2177 pub fn new(context: crate::Context) -> Message {
2178 skip_assert_initialized!();
2179 Self::builder(context).build()
2180 }
2181
2182 pub fn builder<'a>(context: crate::Context) -> HaveContextBuilder<'a> {
2183 assert_initialized_main_thread!();
2184 HaveContextBuilder::new(context)
2185 }
2186
2187 #[doc(alias = "get_context")]
2188 #[doc(alias = "gst_message_parse_have_context")]
2189 pub fn context(&self) -> crate::Context {
2190 unsafe {
2191 let mut context = ptr::null_mut();
2192 ffi::gst_message_parse_have_context(self.as_mut_ptr(), &mut context);
2193 from_glib_full(context)
2194 }
2195 }
2196}
2197
2198impl_debug_concrete_message!(HaveContext {
2199 reserved_fields: ["context"],
2200 "context": context,
2201});
2202
2203declare_concrete_message!(DeviceAdded, T);
2204impl DeviceAdded {
2205 #[doc(alias = "gst_message_new_device_added")]
2206 #[allow(clippy::new_ret_no_self)]
2207 pub fn new(device: &crate::Device) -> Message {
2208 skip_assert_initialized!();
2209 Self::builder(device).build()
2210 }
2211
2212 pub fn builder(device: &crate::Device) -> DeviceAddedBuilder<'_> {
2213 assert_initialized_main_thread!();
2214 DeviceAddedBuilder::new(device)
2215 }
2216
2217 #[doc(alias = "get_device")]
2218 #[doc(alias = "gst_message_parse_device_added")]
2219 pub fn device(&self) -> crate::Device {
2220 unsafe {
2221 let mut device = ptr::null_mut();
2222
2223 ffi::gst_message_parse_device_added(self.as_mut_ptr(), &mut device);
2224
2225 from_glib_full(device)
2226 }
2227 }
2228}
2229
2230impl_debug_concrete_message!(DeviceAdded {
2231 reserved_fields: ["device"],
2232 "device": device,
2233});
2234
2235declare_concrete_message!(DeviceRemoved, T);
2236impl DeviceRemoved {
2237 #[doc(alias = "gst_message_new_device_removed")]
2238 #[allow(clippy::new_ret_no_self)]
2239 pub fn new(device: &crate::Device) -> Message {
2240 skip_assert_initialized!();
2241 Self::builder(device).build()
2242 }
2243
2244 pub fn builder(device: &crate::Device) -> DeviceRemovedBuilder<'_> {
2245 assert_initialized_main_thread!();
2246 DeviceRemovedBuilder::new(device)
2247 }
2248
2249 #[doc(alias = "get_device")]
2250 #[doc(alias = "gst_message_parse_device_removed")]
2251 pub fn device(&self) -> crate::Device {
2252 unsafe {
2253 let mut device = ptr::null_mut();
2254
2255 ffi::gst_message_parse_device_removed(self.as_mut_ptr(), &mut device);
2256
2257 from_glib_full(device)
2258 }
2259 }
2260}
2261
2262impl_debug_concrete_message!(DeviceRemoved {
2263 reserved_fields: ["device"],
2264 "device": device,
2265});
2266
2267declare_concrete_message!(PropertyNotify, T);
2268impl PropertyNotify {
2269 #[doc(alias = "gst_message_new_property_notify")]
2270 #[allow(clippy::new_ret_no_self)]
2271 pub fn new(object: &impl IsA<crate::Object>, property_name: &str) -> Message {
2272 skip_assert_initialized!();
2273 Self::builder(object, property_name).build()
2274 }
2275
2276 pub fn builder<'a>(
2277 object: &'a impl IsA<crate::Object>,
2278 property_name: &'a str,
2279 ) -> PropertyNotifyBuilder<'a> {
2280 assert_initialized_main_thread!();
2281 PropertyNotifyBuilder::new(property_name).src(object)
2282 }
2283
2284 #[doc(alias = "gst_message_parse_property_notify")]
2285 pub fn get(&self) -> (Object, &str, Option<&glib::Value>) {
2286 unsafe {
2287 let mut object = ptr::null_mut();
2288 let mut property_name = ptr::null();
2289 let mut value = ptr::null();
2290
2291 ffi::gst_message_parse_property_notify(
2292 self.as_mut_ptr(),
2293 &mut object,
2294 &mut property_name,
2295 &mut value,
2296 );
2297
2298 (
2299 from_glib_none(object),
2300 CStr::from_ptr(property_name).to_str().unwrap(),
2301 if value.is_null() {
2302 None
2303 } else {
2304 Some(&*(value as *const glib::Value))
2305 },
2306 )
2307 }
2308 }
2309
2310 #[doc(alias = "gst_message_parse_property_notify")]
2311 pub fn object(&self) -> Object {
2312 self.get().0
2313 }
2314
2315 #[doc(alias = "gst_message_parse_property_notify")]
2316 pub fn property_name(&self) -> &str {
2317 self.get().1
2318 }
2319
2320 #[doc(alias = "gst_message_parse_property_notify")]
2321 pub fn value(&self) -> Option<&glib::Value> {
2322 self.get().2
2323 }
2324}
2325
2326impl_debug_concrete_message!(PropertyNotify {
2327 reserved_fields: ["property-name", "property-value"],
2328 "object": object,
2329 "property-name": property_name,
2330 "value": value,
2331});
2332
2333declare_concrete_message!(StreamCollection, T);
2334impl StreamCollection {
2335 #[doc(alias = "gst_message_new_stream_collection")]
2336 #[allow(clippy::new_ret_no_self)]
2337 pub fn new(collection: &crate::StreamCollection) -> Message {
2338 skip_assert_initialized!();
2339 Self::builder(collection).build()
2340 }
2341
2342 pub fn builder(collection: &crate::StreamCollection) -> StreamCollectionBuilder<'_> {
2343 assert_initialized_main_thread!();
2344 StreamCollectionBuilder::new(collection)
2345 }
2346
2347 #[doc(alias = "get_stream_collection")]
2348 #[doc(alias = "gst_message_parse_stream_collection")]
2349 pub fn stream_collection(&self) -> crate::StreamCollection {
2350 unsafe {
2351 let mut collection = ptr::null_mut();
2352
2353 ffi::gst_message_parse_stream_collection(self.as_mut_ptr(), &mut collection);
2354
2355 from_glib_full(collection)
2356 }
2357 }
2358}
2359
2360impl_debug_concrete_message!(StreamCollection {
2361 reserved_fields: ["stream-collection"],
2362 "stream-collection": stream_collection,
2363});
2364
2365declare_concrete_message!(StreamsSelected, T);
2366impl StreamsSelected {
2367 #[doc(alias = "gst_message_new_streams_selected")]
2368 #[allow(clippy::new_ret_no_self)]
2369 pub fn new(collection: &crate::StreamCollection) -> Message {
2370 skip_assert_initialized!();
2371 Self::builder(collection).build()
2372 }
2373
2374 pub fn builder(collection: &crate::StreamCollection) -> StreamsSelectedBuilder<'_> {
2375 assert_initialized_main_thread!();
2376 StreamsSelectedBuilder::new(collection)
2377 }
2378
2379 #[doc(alias = "get_stream_collection")]
2380 #[doc(alias = "gst_message_parse_streams_selected")]
2381 pub fn stream_collection(&self) -> crate::StreamCollection {
2382 unsafe {
2383 let mut collection = ptr::null_mut();
2384
2385 ffi::gst_message_parse_streams_selected(self.as_mut_ptr(), &mut collection);
2386
2387 from_glib_full(collection)
2388 }
2389 }
2390
2391 #[doc(alias = "get_streams")]
2392 #[doc(alias = "gst_message_streams_selected_get_size")]
2393 #[doc(alias = "gst_message_streams_selected_get_stream")]
2394 pub fn streams(&self) -> StreamsSelectedIter<'_> {
2395 StreamsSelectedIter::new(self)
2396 }
2397
2398 fn as_streams_debug(&self) -> StreamsDebug<'_> {
2399 StreamsDebug(self)
2400 }
2401}
2402
2403struct StreamsDebug<'a>(&'a StreamsSelected);
2404impl std::fmt::Debug for StreamsDebug<'_> {
2405 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2406 f.debug_list().entries(self.0.streams()).finish()
2407 }
2408}
2409
2410impl_debug_concrete_message!(StreamsSelected {
2411 reserved_fields: ["stream-collection", "streams"],
2412 "stream-collection": stream_collection,
2413 "streams": as_streams_debug,
2414});
2415
2416crate::utils::define_fixed_size_iter!(
2417 StreamsSelectedIter,
2418 &'a StreamsSelected,
2419 crate::Stream,
2420 |collection: &StreamsSelected| unsafe {
2421 ffi::gst_message_streams_selected_get_size(collection.as_mut_ptr()) as usize
2422 },
2423 |collection: &StreamsSelected, idx: usize| unsafe {
2424 from_glib_full(ffi::gst_message_streams_selected_get_stream(
2425 collection.as_mut_ptr(),
2426 idx as u32,
2427 ))
2428 }
2429);
2430
2431declare_concrete_message!(Redirect, T);
2432impl Redirect {
2433 #[doc(alias = "gst_message_new_redirect")]
2434 #[allow(clippy::new_ret_no_self)]
2435 pub fn new(location: &str) -> Message {
2436 skip_assert_initialized!();
2437 Self::builder(location).build()
2438 }
2439
2440 pub fn builder(location: &str) -> RedirectBuilder<'_> {
2441 assert_initialized_main_thread!();
2442 RedirectBuilder::new(location)
2443 }
2444
2445 #[doc(alias = "get_entries")]
2446 #[doc(alias = "gst_message_get_num_redirect_entries")]
2447 #[doc(alias = "gst_message_parse_redirect_entry")]
2448 pub fn entries(&self) -> RedirectEntriesIter<'_> {
2449 RedirectEntriesIter::new(self)
2450 }
2451
2452 fn as_entries_debug(&self) -> EntriesDebug<'_> {
2453 EntriesDebug(self)
2454 }
2455}
2456
2457struct EntriesDebug<'a>(&'a Redirect);
2458impl std::fmt::Debug for EntriesDebug<'_> {
2459 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2460 f.debug_list().entries(self.0.entries()).finish()
2461 }
2462}
2463
2464impl_debug_concrete_message!(Redirect {
2465 reserved_fields: ["redirect-entry-locations", "redirect-entry-taglists", "redirect-entry-structures"],
2466 "entries": as_entries_debug,
2467});
2468
2469crate::utils::define_fixed_size_iter!(
2470 RedirectEntriesIter,
2471 &'a Redirect,
2472 (&'a str, Option<TagList>, Option<&'a StructureRef>),
2473 |collection: &Redirect| unsafe {
2474 ffi::gst_message_get_num_redirect_entries(collection.as_mut_ptr()) as usize
2475 },
2476 |collection: &Redirect, idx: usize| unsafe {
2477 let mut location = ptr::null();
2478 let mut tags = ptr::null_mut();
2479 let mut structure = ptr::null();
2480
2481 ffi::gst_message_parse_redirect_entry(
2482 collection.as_mut_ptr(),
2483 idx,
2484 &mut location,
2485 &mut tags,
2486 &mut structure,
2487 );
2488
2489 let structure = if structure.is_null() {
2490 None
2491 } else {
2492 Some(StructureRef::from_glib_borrow(structure))
2493 };
2494
2495 (
2496 CStr::from_ptr(location).to_str().unwrap(),
2497 from_glib_none(tags),
2498 structure,
2499 )
2500 }
2501);
2502
2503#[cfg(feature = "v1_16")]
2504#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2505declare_concrete_message!(DeviceChanged, T);
2506#[cfg(feature = "v1_16")]
2507#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
2508impl DeviceChanged {
2509 #[doc(alias = "gst_message_new_device_changed")]
2510 #[allow(clippy::new_ret_no_self)]
2511 pub fn new(device: &crate::Device, changed_device: &crate::Device) -> Message {
2512 skip_assert_initialized!();
2513 Self::builder(device, changed_device).build()
2514 }
2515
2516 pub fn builder<'a>(
2517 device: &'a crate::Device,
2518 changed_device: &'a crate::Device,
2519 ) -> DeviceChangedBuilder<'a> {
2520 assert_initialized_main_thread!();
2521 DeviceChangedBuilder::new(device, changed_device)
2522 }
2523
2524 #[doc(alias = "get_device_changed")]
2525 #[doc(alias = "gst_message_parse_device_changed")]
2526 pub fn device_changed(&self) -> (crate::Device, crate::Device) {
2527 unsafe {
2528 let mut device = ptr::null_mut();
2529 let mut changed_device = ptr::null_mut();
2530
2531 ffi::gst_message_parse_device_changed(
2532 self.as_mut_ptr(),
2533 &mut device,
2534 &mut changed_device,
2535 );
2536
2537 (from_glib_full(device), from_glib_full(changed_device))
2538 }
2539 }
2540
2541 #[doc(alias = "get_device_changed")]
2542 #[doc(alias = "gst_message_parse_device_changed")]
2543 pub fn device(&self) -> crate::Device {
2544 self.device_changed().0
2545 }
2546
2547 #[doc(alias = "get_device_changed")]
2548 #[doc(alias = "gst_message_parse_device_changed")]
2549 pub fn device_changed_(&self) -> crate::Device {
2550 self.device_changed().1
2551 }
2552}
2553
2554#[cfg(feature = "v1_16")]
2555impl_debug_concrete_message!(DeviceChanged {
2556 reserved_fields: ["device", "device-changed"],
2557 "device": device,
2558 "device-changed": device_changed_,
2559});
2560
2561#[cfg(feature = "v1_18")]
2562#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2563declare_concrete_message!(InstantRateRequest, T);
2564#[cfg(feature = "v1_18")]
2565#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
2566impl InstantRateRequest {
2567 #[doc(alias = "gst_message_new_instant_rate_request")]
2568 #[allow(clippy::new_ret_no_self)]
2569 pub fn new(rate_multiplier: f64) -> Message {
2570 skip_assert_initialized!();
2571 Self::builder(rate_multiplier).build()
2572 }
2573
2574 pub fn builder<'a>(rate_multiplier: f64) -> InstantRateRequestBuilder<'a> {
2575 assert_initialized_main_thread!();
2576 InstantRateRequestBuilder::new(rate_multiplier)
2577 }
2578
2579 #[doc(alias = "parse_instant_rate_request")]
2580 #[doc(alias = "gst_message_parse_instant_rate_request")]
2581 pub fn rate_multiplier(&self) -> f64 {
2582 unsafe {
2583 let mut rate_multiplier = mem::MaybeUninit::uninit();
2584
2585 ffi::gst_message_parse_instant_rate_request(
2586 self.as_mut_ptr(),
2587 rate_multiplier.as_mut_ptr(),
2588 );
2589
2590 rate_multiplier.assume_init()
2591 }
2592 }
2593}
2594
2595#[cfg(feature = "v1_18")]
2596impl_debug_concrete_message!(InstantRateRequest {
2597 reserved_fields: ["rate"],
2598 "rate-multiplier": rate_multiplier,
2599});
2600
2601#[cfg(feature = "v1_28")]
2602#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2603declare_concrete_message!(DeviceMonitorStarted, T);
2604#[cfg(feature = "v1_28")]
2605#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
2606impl DeviceMonitorStarted {
2607 #[doc(alias = "gst_message_new_device_monitor_started")]
2608 #[allow(clippy::new_ret_no_self)]
2609 pub fn new(started: bool) -> Message {
2610 skip_assert_initialized!();
2611 Self::builder(started).build()
2612 }
2613
2614 pub fn builder<'a>(started: bool) -> DeviceMonitorStartedBuilder<'a> {
2615 assert_initialized_main_thread!();
2616 DeviceMonitorStartedBuilder::new(started)
2617 }
2618
2619 #[doc(alias = "gst_message_parse_device_monitor_started")]
2620 pub fn started(&self) -> bool {
2621 unsafe {
2622 let mut started = mem::MaybeUninit::uninit();
2623
2624 ffi::gst_message_parse_device_monitor_started(self.as_mut_ptr(), started.as_mut_ptr());
2625
2626 from_glib(started.assume_init())
2627 }
2628 }
2629}
2630
2631#[cfg(feature = "v1_28")]
2632impl_debug_concrete_message!(DeviceMonitorStarted {
2633 reserved_fields: ["success"],
2634 "started": started,
2635});
2636
2637declare_concrete_message!(Other, T);
2638impl_debug_concrete_message!(Other);
2639
2640struct MessageBuilder<'a> {
2641 src: Option<Object>,
2642 seqnum: Option<Seqnum>,
2643 #[cfg(feature = "v1_26")]
2644 details: Option<Structure>,
2645 other_fields: Vec<(&'a str, glib::SendValue)>,
2646}
2647
2648impl<'a> MessageBuilder<'a> {
2649 fn new() -> Self {
2650 Self {
2651 src: None,
2652 seqnum: None,
2653 #[cfg(feature = "v1_26")]
2654 details: None,
2655 other_fields: Vec::new(),
2656 }
2657 }
2658
2659 pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
2660 Self {
2661 src: Some(src.clone().upcast::<Object>()),
2662 ..self
2663 }
2664 }
2665
2666 fn seqnum(self, seqnum: Seqnum) -> Self {
2667 Self {
2668 seqnum: Some(seqnum),
2669 ..self
2670 }
2671 }
2672
2673 #[cfg(feature = "v1_26")]
2674 fn details(self, details: Structure) -> Self {
2675 Self {
2676 details: Some(details),
2677 ..self
2678 }
2679 }
2680
2681 fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
2682 let mut other_fields = self.other_fields;
2683 other_fields.push((name, value.to_send_value()));
2684
2685 Self {
2686 other_fields,
2687 ..self
2688 }
2689 }
2690}
2691
2692macro_rules! message_builder_generic_impl {
2693 ($new_fn:expr) => {
2694 #[allow(clippy::needless_update)]
2695 pub fn src<O: IsA<Object> + Cast + Clone>(self, src: &O) -> Self {
2696 Self {
2697 builder: self.builder.src(src),
2698 ..self
2699 }
2700 }
2701
2702 #[allow(clippy::needless_update)]
2703 pub fn src_if<O: IsA<Object> + Cast + Clone>(self, src: &O, predicate: bool) -> Self {
2704 if predicate { self.src(src) } else { self }
2705 }
2706
2707 #[allow(clippy::needless_update)]
2708 pub fn src_if_some<O: IsA<Object> + Cast + Clone>(self, src: Option<&O>) -> Self {
2709 if let Some(src) = src {
2710 self.src(src)
2711 } else {
2712 self
2713 }
2714 }
2715
2716 #[doc(alias = "gst_message_set_seqnum")]
2717 #[allow(clippy::needless_update)]
2718 pub fn seqnum(self, seqnum: Seqnum) -> Self {
2719 Self {
2720 builder: self.builder.seqnum(seqnum),
2721 ..self
2722 }
2723 }
2724
2725 #[doc(alias = "gst_message_set_seqnum")]
2726 #[allow(clippy::needless_update)]
2727 pub fn seqnum_if(self, seqnum: Seqnum, predicate: bool) -> Self {
2728 if predicate { self.seqnum(seqnum) } else { self }
2729 }
2730
2731 #[doc(alias = "gst_message_set_seqnum")]
2732 #[allow(clippy::needless_update)]
2733 pub fn seqnum_if_some(self, seqnum: Option<Seqnum>) -> Self {
2734 if let Some(seqnum) = seqnum {
2735 self.seqnum(seqnum)
2736 } else {
2737 self
2738 }
2739 }
2740
2741 #[cfg(feature = "v1_26")]
2742 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2743 #[doc(alias = "gst_message_set_details")]
2744 #[allow(clippy::needless_update)]
2745 pub fn details(self, details: Structure) -> Self {
2746 Self {
2747 builder: self.builder.details(details),
2748 ..self
2749 }
2750 }
2751
2752 #[cfg(feature = "v1_26")]
2753 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2754 #[doc(alias = "gst_message_set_details")]
2755 #[allow(clippy::needless_update)]
2756 pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2757 if predicate {
2758 self.details(details)
2759 } else {
2760 self
2761 }
2762 }
2763
2764 #[cfg(feature = "v1_26")]
2765 #[cfg_attr(docsrs, doc(cfg(feature = "v1_26")))]
2766 #[doc(alias = "gst_message_set_details")]
2767 #[allow(clippy::needless_update)]
2768 pub fn details_if_some(self, details: Option<Structure>) -> Self {
2769 if let Some(details) = details {
2770 self.details(details)
2771 } else {
2772 self
2773 }
2774 }
2775
2776 #[allow(clippy::needless_update)]
2781 pub fn other_field(self, name: &'a str, value: impl ToSendValue) -> Self {
2782 Self {
2783 builder: self.builder.other_field(name, value),
2784 ..self
2785 }
2786 }
2787
2788 impl_builder_gvalue_extra_setters!(other_field);
2789
2790 #[must_use = "Building the message without using it has no effect"]
2791 #[allow(clippy::redundant_closure_call)]
2792 pub fn build(mut self) -> Message {
2793 unsafe {
2794 let src = self.builder.src.to_glib_none().0;
2795 let msg = $new_fn(&mut self, src);
2796 if let Some(seqnum) = self.builder.seqnum {
2797 ffi::gst_message_set_seqnum(msg, seqnum.0.get());
2798 }
2799
2800 #[cfg(feature = "v1_26")]
2801 if let Some(details) = self.builder.details {
2802 ffi::gst_message_set_details(msg, details.into_glib_ptr());
2803 }
2804
2805 if !self.builder.other_fields.is_empty() {
2806 let structure = ffi::gst_message_writable_structure(msg);
2807
2808 if !structure.is_null() {
2809 let structure = StructureRef::from_glib_borrow_mut(structure as *mut _);
2810
2811 for (k, v) in self.builder.other_fields {
2812 structure.set_value(k, v);
2813 }
2814 }
2815 }
2816
2817 from_glib_full(msg)
2818 }
2819 }
2820 };
2821}
2822
2823#[must_use = "The builder must be built to be used"]
2824pub struct EosBuilder<'a> {
2825 builder: MessageBuilder<'a>,
2826}
2827
2828impl<'a> EosBuilder<'a> {
2829 fn new() -> Self {
2830 skip_assert_initialized!();
2831 Self {
2832 builder: MessageBuilder::new(),
2833 }
2834 }
2835
2836 message_builder_generic_impl!(|_, src| ffi::gst_message_new_eos(src));
2837}
2838
2839pub trait MessageErrorDomain: glib::error::ErrorDomain {}
2840
2841impl MessageErrorDomain for crate::CoreError {}
2842impl MessageErrorDomain for crate::ResourceError {}
2843impl MessageErrorDomain for crate::StreamError {}
2844impl MessageErrorDomain for crate::LibraryError {}
2845
2846#[must_use = "The builder must be built to be used"]
2847pub struct ErrorBuilder<'a> {
2848 builder: MessageBuilder<'a>,
2849 error: glib::Error,
2850 debug: Option<&'a str>,
2851 #[allow(unused)]
2852 details: Option<Structure>,
2853}
2854
2855impl<'a> ErrorBuilder<'a> {
2856 fn new(error: glib::Error) -> Self {
2857 skip_assert_initialized!();
2858 Self {
2859 builder: MessageBuilder::new(),
2860 error,
2861 debug: None,
2862 details: None,
2863 }
2864 }
2865
2866 pub fn debug(self, debug: &'a str) -> Self {
2867 Self {
2868 debug: Some(debug),
2869 ..self
2870 }
2871 }
2872
2873 pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
2874 if predicate { self.debug(debug) } else { self }
2875 }
2876
2877 pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
2878 if let Some(debug) = debug {
2879 self.debug(debug)
2880 } else {
2881 self
2882 }
2883 }
2884
2885 #[cfg(not(feature = "v1_26"))]
2886 pub fn details(self, details: Structure) -> Self {
2887 Self {
2888 details: Some(details),
2889 ..self
2890 }
2891 }
2892
2893 #[cfg(not(feature = "v1_26"))]
2894 pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2895 if predicate {
2896 self.details(details)
2897 } else {
2898 self
2899 }
2900 }
2901
2902 #[cfg(not(feature = "v1_26"))]
2903 pub fn details_if_some(self, details: Option<Structure>) -> Self {
2904 if let Some(details) = details {
2905 self.details(details)
2906 } else {
2907 self
2908 }
2909 }
2910
2911 message_builder_generic_impl!(|s: &mut Self, src| {
2912 let details = match s.details.take() {
2913 None => ptr::null_mut(),
2914 Some(details) => details.into_glib_ptr(),
2915 };
2916
2917 ffi::gst_message_new_error_with_details(
2918 src,
2919 mut_override(s.error.to_glib_none().0),
2920 s.debug.to_glib_none().0,
2921 details,
2922 )
2923 });
2924}
2925
2926#[must_use = "The builder must be built to be used"]
2927pub struct WarningBuilder<'a> {
2928 builder: MessageBuilder<'a>,
2929 error: glib::Error,
2930 debug: Option<&'a str>,
2931 #[allow(unused)]
2932 details: Option<Structure>,
2933}
2934
2935impl<'a> WarningBuilder<'a> {
2936 fn new(error: glib::Error) -> Self {
2937 skip_assert_initialized!();
2938 Self {
2939 builder: MessageBuilder::new(),
2940 error,
2941 debug: None,
2942 details: None,
2943 }
2944 }
2945
2946 pub fn debug(self, debug: &'a str) -> Self {
2947 Self {
2948 debug: Some(debug),
2949 ..self
2950 }
2951 }
2952
2953 pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
2954 if predicate { self.debug(debug) } else { self }
2955 }
2956
2957 pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
2958 if let Some(debug) = debug {
2959 self.debug(debug)
2960 } else {
2961 self
2962 }
2963 }
2964
2965 #[cfg(not(feature = "v1_26"))]
2966 pub fn details(self, details: Structure) -> Self {
2967 Self {
2968 details: Some(details),
2969 ..self
2970 }
2971 }
2972
2973 #[cfg(not(feature = "v1_26"))]
2974 pub fn details_if(self, details: Structure, predicate: bool) -> Self {
2975 if predicate {
2976 self.details(details)
2977 } else {
2978 self
2979 }
2980 }
2981
2982 #[cfg(not(feature = "v1_26"))]
2983 pub fn details_if_some(self, details: Option<Structure>) -> Self {
2984 if let Some(details) = details {
2985 self.details(details)
2986 } else {
2987 self
2988 }
2989 }
2990
2991 message_builder_generic_impl!(|s: &mut Self, src| {
2992 let details = match s.details.take() {
2993 None => ptr::null_mut(),
2994 Some(details) => details.into_glib_ptr(),
2995 };
2996
2997 ffi::gst_message_new_warning_with_details(
2998 src,
2999 mut_override(s.error.to_glib_none().0),
3000 s.debug.to_glib_none().0,
3001 details,
3002 )
3003 });
3004}
3005
3006#[must_use = "The builder must be built to be used"]
3007pub struct InfoBuilder<'a> {
3008 builder: MessageBuilder<'a>,
3009 error: glib::Error,
3010 debug: Option<&'a str>,
3011 #[allow(unused)]
3012 details: Option<Structure>,
3013}
3014
3015impl<'a> InfoBuilder<'a> {
3016 fn new(error: glib::Error) -> Self {
3017 skip_assert_initialized!();
3018 Self {
3019 builder: MessageBuilder::new(),
3020 error,
3021 debug: None,
3022 details: None,
3023 }
3024 }
3025
3026 pub fn debug(self, debug: &'a str) -> Self {
3027 Self {
3028 debug: Some(debug),
3029 ..self
3030 }
3031 }
3032
3033 pub fn debug_if(self, debug: &'a str, predicate: bool) -> Self {
3034 if predicate { self.debug(debug) } else { self }
3035 }
3036
3037 pub fn debug_if_some(self, debug: Option<&'a str>) -> Self {
3038 if let Some(debug) = debug {
3039 self.debug(debug)
3040 } else {
3041 self
3042 }
3043 }
3044
3045 #[cfg(not(feature = "v1_26"))]
3046 pub fn details(self, details: Structure) -> Self {
3047 Self {
3048 details: Some(details),
3049 ..self
3050 }
3051 }
3052
3053 #[cfg(not(feature = "v1_26"))]
3054 pub fn details_if(self, details: Structure, predicate: bool) -> Self {
3055 if predicate {
3056 self.details(details)
3057 } else {
3058 self
3059 }
3060 }
3061
3062 #[cfg(not(feature = "v1_26"))]
3063 pub fn details_if_some(self, details: Option<Structure>) -> Self {
3064 if let Some(details) = details {
3065 self.details(details)
3066 } else {
3067 self
3068 }
3069 }
3070
3071 message_builder_generic_impl!(|s: &mut Self, src| {
3072 let details = match s.details.take() {
3073 None => ptr::null_mut(),
3074 Some(details) => details.into_glib_ptr(),
3075 };
3076
3077 ffi::gst_message_new_info_with_details(
3078 src,
3079 mut_override(s.error.to_glib_none().0),
3080 s.debug.to_glib_none().0,
3081 details,
3082 )
3083 });
3084}
3085
3086#[must_use = "The builder must be built to be used"]
3087pub struct TagBuilder<'a> {
3088 builder: MessageBuilder<'a>,
3089 tags: Option<TagList>,
3090}
3091
3092impl<'a> TagBuilder<'a> {
3093 fn new(tags: TagList) -> Self {
3094 skip_assert_initialized!();
3095 Self {
3096 builder: MessageBuilder::new(),
3097 tags: Some(tags),
3098 }
3099 }
3100
3101 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_tag(
3102 src,
3103 s.tags.take().into_glib_ptr()
3104 ));
3105}
3106
3107#[must_use = "The builder must be built to be used"]
3108pub struct BufferingBuilder<'a> {
3109 builder: MessageBuilder<'a>,
3110 percent: i32,
3111 stats: Option<(crate::BufferingMode, i32, i32, i64)>,
3112}
3113
3114impl<'a> BufferingBuilder<'a> {
3115 fn new(percent: i32) -> Self {
3116 skip_assert_initialized!();
3117 Self {
3118 builder: MessageBuilder::new(),
3119 percent,
3120 stats: None,
3121 }
3122 }
3123
3124 pub fn stats(
3125 self,
3126 mode: crate::BufferingMode,
3127 avg_in: i32,
3128 avg_out: i32,
3129 buffering_left: i64,
3130 ) -> Self {
3131 skip_assert_initialized!();
3132 Self {
3133 stats: Some((mode, avg_in, avg_out, buffering_left)),
3134 ..self
3135 }
3136 }
3137
3138 message_builder_generic_impl!(|s: &mut Self, src| {
3139 let msg = ffi::gst_message_new_buffering(src, s.percent);
3140
3141 if let Some((mode, avg_in, avg_out, buffering_left)) = s.stats {
3142 ffi::gst_message_set_buffering_stats(
3143 msg,
3144 mode.into_glib(),
3145 avg_in,
3146 avg_out,
3147 buffering_left,
3148 );
3149 }
3150
3151 msg
3152 });
3153}
3154
3155#[must_use = "The builder must be built to be used"]
3156pub struct StateChangedBuilder<'a> {
3157 builder: MessageBuilder<'a>,
3158 old: crate::State,
3159 new: crate::State,
3160 pending: crate::State,
3161}
3162
3163impl<'a> StateChangedBuilder<'a> {
3164 fn new(old: crate::State, new: crate::State, pending: crate::State) -> Self {
3165 skip_assert_initialized!();
3166 Self {
3167 builder: MessageBuilder::new(),
3168 old,
3169 new,
3170 pending,
3171 }
3172 }
3173
3174 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_state_changed(
3175 src,
3176 s.old.into_glib(),
3177 s.new.into_glib(),
3178 s.pending.into_glib(),
3179 ));
3180}
3181
3182#[must_use = "The builder must be built to be used"]
3183pub struct StateDirtyBuilder<'a> {
3184 builder: MessageBuilder<'a>,
3185}
3186
3187impl<'a> StateDirtyBuilder<'a> {
3188 fn new() -> Self {
3189 skip_assert_initialized!();
3190 Self {
3191 builder: MessageBuilder::new(),
3192 }
3193 }
3194
3195 message_builder_generic_impl!(|_, src| ffi::gst_message_new_state_dirty(src));
3196}
3197
3198#[must_use = "The builder must be built to be used"]
3199pub struct StepDoneBuilder<'a> {
3200 builder: MessageBuilder<'a>,
3201 amount: GenericFormattedValue,
3202 rate: f64,
3203 flush: bool,
3204 intermediate: bool,
3205 duration: Option<crate::ClockTime>,
3206 eos: bool,
3207}
3208
3209impl<'a> StepDoneBuilder<'a> {
3210 fn new(
3211 amount: GenericFormattedValue,
3212 rate: f64,
3213 flush: bool,
3214 intermediate: bool,
3215 duration: Option<crate::ClockTime>,
3216 eos: bool,
3217 ) -> Self {
3218 skip_assert_initialized!();
3219 assert_eq!(amount.format(), duration.format());
3220 Self {
3221 builder: MessageBuilder::new(),
3222 amount,
3223 rate,
3224 flush,
3225 intermediate,
3226 duration,
3227 eos,
3228 }
3229 }
3230
3231 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_done(
3232 src,
3233 s.amount.format().into_glib(),
3234 s.amount.value() as u64,
3235 s.rate,
3236 s.flush.into_glib(),
3237 s.intermediate.into_glib(),
3238 s.duration.into_raw_value() as u64,
3239 s.eos.into_glib(),
3240 ));
3241}
3242
3243#[must_use = "The builder must be built to be used"]
3244pub struct ClockProvideBuilder<'a> {
3245 builder: MessageBuilder<'a>,
3246 clock: &'a crate::Clock,
3247 ready: bool,
3248}
3249
3250impl<'a> ClockProvideBuilder<'a> {
3251 fn new(clock: &'a crate::Clock, ready: bool) -> Self {
3252 skip_assert_initialized!();
3253 Self {
3254 builder: MessageBuilder::new(),
3255 clock,
3256 ready,
3257 }
3258 }
3259
3260 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_provide(
3261 src,
3262 s.clock.to_glib_none().0,
3263 s.ready.into_glib()
3264 ));
3265}
3266
3267#[must_use = "The builder must be built to be used"]
3268pub struct ClockLostBuilder<'a> {
3269 builder: MessageBuilder<'a>,
3270 clock: &'a crate::Clock,
3271}
3272
3273impl<'a> ClockLostBuilder<'a> {
3274 fn new(clock: &'a crate::Clock) -> Self {
3275 skip_assert_initialized!();
3276 Self {
3277 builder: MessageBuilder::new(),
3278 clock,
3279 }
3280 }
3281
3282 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_clock_lost(
3283 src,
3284 s.clock.to_glib_none().0
3285 ));
3286}
3287
3288#[must_use = "The builder must be built to be used"]
3289pub struct NewClockBuilder<'a> {
3290 builder: MessageBuilder<'a>,
3291 clock: &'a crate::Clock,
3292}
3293
3294impl<'a> NewClockBuilder<'a> {
3295 fn new(clock: &'a crate::Clock) -> Self {
3296 skip_assert_initialized!();
3297 Self {
3298 builder: MessageBuilder::new(),
3299 clock,
3300 }
3301 }
3302
3303 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_new_clock(
3304 src,
3305 s.clock.to_glib_none().0
3306 ));
3307}
3308
3309#[must_use = "The builder must be built to be used"]
3310pub struct StructureChangeBuilder<'a> {
3311 builder: MessageBuilder<'a>,
3312 type_: crate::StructureChangeType,
3313 owner: &'a crate::Element,
3314 busy: bool,
3315}
3316
3317impl<'a> StructureChangeBuilder<'a> {
3318 fn new(type_: crate::StructureChangeType, owner: &'a crate::Element, busy: bool) -> Self {
3319 skip_assert_initialized!();
3320 Self {
3321 builder: MessageBuilder::new(),
3322 type_,
3323 owner,
3324 busy,
3325 }
3326 }
3327
3328 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_structure_change(
3329 src,
3330 s.type_.into_glib(),
3331 s.owner.to_glib_none().0,
3332 s.busy.into_glib(),
3333 ));
3334}
3335
3336#[must_use = "The builder must be built to be used"]
3337pub struct StreamStatusBuilder<'a> {
3338 builder: MessageBuilder<'a>,
3339 type_: crate::StreamStatusType,
3340 owner: &'a crate::Element,
3341 status_object: Option<glib::SendValue>,
3342}
3343
3344impl<'a> StreamStatusBuilder<'a> {
3345 fn new(type_: crate::StreamStatusType, owner: &'a crate::Element) -> Self {
3346 skip_assert_initialized!();
3347 Self {
3348 builder: MessageBuilder::new(),
3349 type_,
3350 owner,
3351 status_object: None,
3352 }
3353 }
3354
3355 pub fn status_object(self, status_object: impl ToSendValue) -> Self {
3356 Self {
3357 status_object: Some(status_object.to_send_value()),
3358 ..self
3359 }
3360 }
3361
3362 pub fn status_object_if(self, status_object: impl ToSendValue, predicate: bool) -> Self {
3363 if predicate {
3364 self.status_object(status_object)
3365 } else {
3366 self
3367 }
3368 }
3369
3370 pub fn status_object_if_some(self, status_object: Option<impl ToSendValue>) -> Self {
3371 if let Some(status_object) = status_object {
3372 self.status_object(status_object)
3373 } else {
3374 self
3375 }
3376 }
3377
3378 message_builder_generic_impl!(|s: &mut Self, src| {
3379 let msg =
3380 ffi::gst_message_new_stream_status(src, s.type_.into_glib(), s.owner.to_glib_none().0);
3381 if let Some(ref status_object) = s.status_object {
3382 ffi::gst_message_set_stream_status_object(msg, status_object.to_glib_none().0);
3383 }
3384 msg
3385 });
3386}
3387
3388#[must_use = "The builder must be built to be used"]
3389pub struct ApplicationBuilder<'a> {
3390 builder: MessageBuilder<'a>,
3391 structure: Option<crate::Structure>,
3392}
3393
3394impl<'a> ApplicationBuilder<'a> {
3395 fn new(structure: crate::Structure) -> Self {
3396 skip_assert_initialized!();
3397 Self {
3398 builder: MessageBuilder::new(),
3399 structure: Some(structure),
3400 }
3401 }
3402
3403 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_application(
3404 src,
3405 s.structure.take().unwrap().into_glib_ptr()
3406 ));
3407}
3408
3409#[must_use = "The builder must be built to be used"]
3410pub struct ElementBuilder<'a> {
3411 builder: MessageBuilder<'a>,
3412 structure: Option<crate::Structure>,
3413}
3414
3415impl<'a> ElementBuilder<'a> {
3416 fn new(structure: crate::Structure) -> Self {
3417 skip_assert_initialized!();
3418 Self {
3419 builder: MessageBuilder::new(),
3420 structure: Some(structure),
3421 }
3422 }
3423
3424 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_element(
3425 src,
3426 s.structure.take().unwrap().into_glib_ptr()
3427 ));
3428}
3429
3430#[must_use = "The builder must be built to be used"]
3431pub struct SegmentStartBuilder<'a> {
3432 builder: MessageBuilder<'a>,
3433 position: GenericFormattedValue,
3434}
3435
3436impl<'a> SegmentStartBuilder<'a> {
3437 fn new(position: GenericFormattedValue) -> Self {
3438 skip_assert_initialized!();
3439 Self {
3440 builder: MessageBuilder::new(),
3441 position,
3442 }
3443 }
3444
3445 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_start(
3446 src,
3447 s.position.format().into_glib(),
3448 s.position.value(),
3449 ));
3450}
3451
3452#[must_use = "The builder must be built to be used"]
3453pub struct SegmentDoneBuilder<'a> {
3454 builder: MessageBuilder<'a>,
3455 position: GenericFormattedValue,
3456}
3457
3458impl<'a> SegmentDoneBuilder<'a> {
3459 fn new(position: GenericFormattedValue) -> Self {
3460 skip_assert_initialized!();
3461 Self {
3462 builder: MessageBuilder::new(),
3463 position,
3464 }
3465 }
3466
3467 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_segment_done(
3468 src,
3469 s.position.format().into_glib(),
3470 s.position.value(),
3471 ));
3472}
3473
3474#[must_use = "The builder must be built to be used"]
3475pub struct DurationChangedBuilder<'a> {
3476 builder: MessageBuilder<'a>,
3477}
3478
3479impl<'a> DurationChangedBuilder<'a> {
3480 fn new() -> Self {
3481 skip_assert_initialized!();
3482 Self {
3483 builder: MessageBuilder::new(),
3484 }
3485 }
3486
3487 message_builder_generic_impl!(|_, src| ffi::gst_message_new_duration_changed(src));
3488}
3489
3490#[must_use = "The builder must be built to be used"]
3491pub struct LatencyBuilder<'a> {
3492 builder: MessageBuilder<'a>,
3493}
3494
3495impl<'a> LatencyBuilder<'a> {
3496 fn new() -> Self {
3497 skip_assert_initialized!();
3498 Self {
3499 builder: MessageBuilder::new(),
3500 }
3501 }
3502
3503 message_builder_generic_impl!(|_, src| ffi::gst_message_new_latency(src));
3504}
3505
3506#[must_use = "The builder must be built to be used"]
3507pub struct AsyncStartBuilder<'a> {
3508 builder: MessageBuilder<'a>,
3509}
3510
3511impl<'a> AsyncStartBuilder<'a> {
3512 fn new() -> Self {
3513 skip_assert_initialized!();
3514 Self {
3515 builder: MessageBuilder::new(),
3516 }
3517 }
3518
3519 message_builder_generic_impl!(|_, src| ffi::gst_message_new_async_start(src));
3520}
3521
3522#[must_use = "The builder must be built to be used"]
3523pub struct AsyncDoneBuilder<'a> {
3524 builder: MessageBuilder<'a>,
3525 running_time: Option<crate::ClockTime>,
3526}
3527
3528impl<'a> AsyncDoneBuilder<'a> {
3529 fn new() -> Self {
3530 skip_assert_initialized!();
3531 Self {
3532 builder: MessageBuilder::new(),
3533 running_time: None,
3534 }
3535 }
3536
3537 pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
3538 self.running_time = running_time.into();
3539 self
3540 }
3541
3542 pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
3543 if predicate {
3544 self.running_time(running_time)
3545 } else {
3546 self
3547 }
3548 }
3549
3550 pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
3551 if let Some(running_time) = running_time {
3552 self.running_time(running_time)
3553 } else {
3554 self
3555 }
3556 }
3557
3558 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_async_done(
3559 src,
3560 s.running_time.into_glib()
3561 ));
3562}
3563
3564#[must_use = "The builder must be built to be used"]
3565pub struct RequestStateBuilder<'a> {
3566 builder: MessageBuilder<'a>,
3567 state: crate::State,
3568}
3569
3570impl<'a> RequestStateBuilder<'a> {
3571 fn new(state: crate::State) -> Self {
3572 skip_assert_initialized!();
3573 Self {
3574 builder: MessageBuilder::new(),
3575 state,
3576 }
3577 }
3578
3579 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_request_state(
3580 src,
3581 s.state.into_glib()
3582 ));
3583}
3584
3585#[must_use = "The builder must be built to be used"]
3586pub struct StepStartBuilder<'a> {
3587 builder: MessageBuilder<'a>,
3588 active: bool,
3589 amount: GenericFormattedValue,
3590 rate: f64,
3591 flush: bool,
3592 intermediate: bool,
3593}
3594
3595impl<'a> StepStartBuilder<'a> {
3596 fn new(
3597 active: bool,
3598 amount: GenericFormattedValue,
3599 rate: f64,
3600 flush: bool,
3601 intermediate: bool,
3602 ) -> Self {
3603 skip_assert_initialized!();
3604 Self {
3605 builder: MessageBuilder::new(),
3606 active,
3607 amount,
3608 rate,
3609 flush,
3610 intermediate,
3611 }
3612 }
3613
3614 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_step_start(
3615 src,
3616 s.active.into_glib(),
3617 s.amount.format().into_glib(),
3618 s.amount.value() as u64,
3619 s.rate,
3620 s.flush.into_glib(),
3621 s.intermediate.into_glib(),
3622 ));
3623}
3624
3625#[must_use = "The builder must be built to be used"]
3626pub struct QosBuilder<'a> {
3627 builder: MessageBuilder<'a>,
3628 live: bool,
3629 running_time: Option<crate::ClockTime>,
3630 stream_time: Option<crate::ClockTime>,
3631 timestamp: Option<crate::ClockTime>,
3632 duration: Option<crate::ClockTime>,
3633 values: Option<(i64, f64, i32)>,
3634 stats: Option<(GenericFormattedValue, GenericFormattedValue)>,
3635}
3636
3637impl<'a> QosBuilder<'a> {
3638 fn new(live: bool) -> Self {
3639 skip_assert_initialized!();
3640 Self {
3641 builder: MessageBuilder::new(),
3642 live,
3643 running_time: None,
3644 stream_time: None,
3645 timestamp: None,
3646 duration: None,
3647 values: None,
3648 stats: None,
3649 }
3650 }
3651
3652 pub fn running_time(mut self, running_time: impl Into<Option<crate::ClockTime>>) -> Self {
3653 self.running_time = running_time.into();
3654 self
3655 }
3656
3657 pub fn running_time_if(self, running_time: crate::ClockTime, predicate: bool) -> Self {
3658 if predicate {
3659 self.running_time(running_time)
3660 } else {
3661 self
3662 }
3663 }
3664
3665 pub fn running_time_if_some(self, running_time: Option<crate::ClockTime>) -> Self {
3666 if let Some(running_time) = running_time {
3667 self.running_time(running_time)
3668 } else {
3669 self
3670 }
3671 }
3672
3673 pub fn stream_time(mut self, stream_time: impl Into<Option<crate::ClockTime>>) -> Self {
3674 self.stream_time = stream_time.into();
3675 self
3676 }
3677
3678 pub fn stream_time_if(self, stream_time: crate::ClockTime, predicate: bool) -> Self {
3679 if predicate {
3680 self.stream_time(stream_time)
3681 } else {
3682 self
3683 }
3684 }
3685
3686 pub fn stream_time_if_some(self, stream_time: Option<crate::ClockTime>) -> Self {
3687 if let Some(stream_time) = stream_time {
3688 self.stream_time(stream_time)
3689 } else {
3690 self
3691 }
3692 }
3693
3694 pub fn timestamp(mut self, timestamp: impl Into<Option<crate::ClockTime>>) -> Self {
3695 self.timestamp = timestamp.into();
3696 self
3697 }
3698
3699 pub fn timestamp_if(self, timestamp: crate::ClockTime, predicate: bool) -> Self {
3700 if predicate {
3701 self.timestamp(timestamp)
3702 } else {
3703 self
3704 }
3705 }
3706
3707 pub fn timestamp_if_some(self, timestamp: Option<crate::ClockTime>) -> Self {
3708 if let Some(timestamp) = timestamp {
3709 self.timestamp(timestamp)
3710 } else {
3711 self
3712 }
3713 }
3714
3715 pub fn duration(mut self, duration: impl Into<Option<crate::ClockTime>>) -> Self {
3716 self.duration = duration.into();
3717 self
3718 }
3719
3720 pub fn duration_if(self, duration: crate::ClockTime, predicate: bool) -> Self {
3721 if predicate {
3722 self.duration(duration)
3723 } else {
3724 self
3725 }
3726 }
3727
3728 pub fn duration_if_some(self, duration: Option<crate::ClockTime>) -> Self {
3729 if let Some(duration) = duration {
3730 self.duration(duration)
3731 } else {
3732 self
3733 }
3734 }
3735
3736 pub fn values(self, jitter: i64, proportion: f64, quality: i32) -> Self {
3737 Self {
3738 values: Some((jitter, proportion, quality)),
3739 ..self
3740 }
3741 }
3742
3743 pub fn stats<V: FormattedValue>(
3744 self,
3745 processed: V,
3746 dropped: impl CompatibleFormattedValue<V>,
3747 ) -> Self {
3748 let dropped = dropped.try_into_checked(processed).unwrap();
3749 Self {
3750 stats: Some((processed.into(), dropped.into())),
3751 ..self
3752 }
3753 }
3754
3755 message_builder_generic_impl!(|s: &mut Self, src| {
3756 let msg = ffi::gst_message_new_qos(
3757 src,
3758 s.live.into_glib(),
3759 s.running_time.into_glib(),
3760 s.stream_time.into_glib(),
3761 s.timestamp.into_glib(),
3762 s.duration.into_glib(),
3763 );
3764 if let Some((jitter, proportion, quality)) = s.values {
3765 ffi::gst_message_set_qos_values(msg, jitter, proportion, quality);
3766 }
3767 if let Some((processed, dropped)) = s.stats {
3768 ffi::gst_message_set_qos_stats(
3769 msg,
3770 processed.format().into_glib(),
3771 processed.value() as u64,
3772 dropped.value() as u64,
3773 );
3774 }
3775 msg
3776 });
3777}
3778
3779#[must_use = "The builder must be built to be used"]
3780pub struct ProgressBuilder<'a> {
3781 builder: MessageBuilder<'a>,
3782 type_: crate::ProgressType,
3783 code: &'a str,
3784 text: &'a str,
3785}
3786
3787impl<'a> ProgressBuilder<'a> {
3788 fn new(type_: crate::ProgressType, code: &'a str, text: &'a str) -> Self {
3789 skip_assert_initialized!();
3790 Self {
3791 builder: MessageBuilder::new(),
3792 type_,
3793 code,
3794 text,
3795 }
3796 }
3797
3798 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_progress(
3799 src,
3800 s.type_.into_glib(),
3801 s.code.to_glib_none().0,
3802 s.text.to_glib_none().0,
3803 ));
3804}
3805
3806#[must_use = "The builder must be built to be used"]
3807pub struct TocBuilder<'a> {
3808 builder: MessageBuilder<'a>,
3809 toc: &'a crate::Toc,
3810 updated: bool,
3811}
3812
3813impl<'a> TocBuilder<'a> {
3814 fn new(toc: &'a crate::Toc, updated: bool) -> Self {
3815 skip_assert_initialized!();
3816 Self {
3817 builder: MessageBuilder::new(),
3818 toc,
3819 updated,
3820 }
3821 }
3822
3823 message_builder_generic_impl!(|s: &Self, src| ffi::gst_message_new_toc(
3824 src,
3825 s.toc.to_glib_none().0,
3826 s.updated.into_glib()
3827 ));
3828}
3829
3830#[must_use = "The builder must be built to be used"]
3831pub struct ResetTimeBuilder<'a> {
3832 builder: MessageBuilder<'a>,
3833 running_time: crate::ClockTime,
3834}
3835
3836impl<'a> ResetTimeBuilder<'a> {
3837 fn new(running_time: crate::ClockTime) -> Self {
3838 skip_assert_initialized!();
3839 Self {
3840 builder: MessageBuilder::new(),
3841 running_time,
3842 }
3843 }
3844
3845 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_reset_time(
3846 src,
3847 s.running_time.into_glib()
3848 ));
3849}
3850
3851#[must_use = "The builder must be built to be used"]
3852pub struct StreamStartBuilder<'a> {
3853 builder: MessageBuilder<'a>,
3854 group_id: Option<GroupId>,
3855}
3856
3857impl<'a> StreamStartBuilder<'a> {
3858 fn new() -> Self {
3859 skip_assert_initialized!();
3860 Self {
3861 builder: MessageBuilder::new(),
3862 group_id: None,
3863 }
3864 }
3865
3866 pub fn group_id(self, group_id: GroupId) -> Self {
3867 Self {
3868 group_id: Some(group_id),
3869 ..self
3870 }
3871 }
3872
3873 pub fn group_id_if(self, group_id: GroupId, predicate: bool) -> Self {
3874 if predicate {
3875 self.group_id(group_id)
3876 } else {
3877 self
3878 }
3879 }
3880
3881 pub fn group_id_if_some(self, group_id: Option<GroupId>) -> Self {
3882 if let Some(group_id) = group_id {
3883 self.group_id(group_id)
3884 } else {
3885 self
3886 }
3887 }
3888
3889 message_builder_generic_impl!(|s: &mut Self, src| {
3890 let msg = ffi::gst_message_new_stream_start(src);
3891 if let Some(group_id) = s.group_id {
3892 ffi::gst_message_set_group_id(msg, group_id.0.get());
3893 }
3894 msg
3895 });
3896}
3897
3898#[must_use = "The builder must be built to be used"]
3899pub struct NeedContextBuilder<'a> {
3900 builder: MessageBuilder<'a>,
3901 context_type: &'a str,
3902}
3903
3904impl<'a> NeedContextBuilder<'a> {
3905 fn new(context_type: &'a str) -> Self {
3906 skip_assert_initialized!();
3907 Self {
3908 builder: MessageBuilder::new(),
3909 context_type,
3910 }
3911 }
3912
3913 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_need_context(
3914 src,
3915 s.context_type.to_glib_none().0
3916 ));
3917}
3918
3919#[must_use = "The builder must be built to be used"]
3920pub struct HaveContextBuilder<'a> {
3921 builder: MessageBuilder<'a>,
3922 context: Option<crate::Context>,
3923}
3924
3925impl<'a> HaveContextBuilder<'a> {
3926 fn new(context: crate::Context) -> Self {
3927 skip_assert_initialized!();
3928 Self {
3929 builder: MessageBuilder::new(),
3930 context: Some(context),
3931 }
3932 }
3933
3934 message_builder_generic_impl!(|s: &mut Self, src| {
3935 let context = s.context.take().unwrap();
3936 ffi::gst_message_new_have_context(src, context.into_glib_ptr())
3937 });
3938}
3939
3940#[must_use = "The builder must be built to be used"]
3941pub struct DeviceAddedBuilder<'a> {
3942 builder: MessageBuilder<'a>,
3943 device: &'a crate::Device,
3944}
3945
3946impl<'a> DeviceAddedBuilder<'a> {
3947 fn new(device: &'a crate::Device) -> Self {
3948 skip_assert_initialized!();
3949 Self {
3950 builder: MessageBuilder::new(),
3951 device,
3952 }
3953 }
3954
3955 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_added(
3956 src,
3957 s.device.to_glib_none().0
3958 ));
3959}
3960
3961#[must_use = "The builder must be built to be used"]
3962pub struct DeviceRemovedBuilder<'a> {
3963 builder: MessageBuilder<'a>,
3964 device: &'a crate::Device,
3965}
3966
3967impl<'a> DeviceRemovedBuilder<'a> {
3968 fn new(device: &'a crate::Device) -> Self {
3969 skip_assert_initialized!();
3970 Self {
3971 builder: MessageBuilder::new(),
3972 device,
3973 }
3974 }
3975
3976 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_removed(
3977 src,
3978 s.device.to_glib_none().0
3979 ));
3980}
3981
3982#[must_use = "The builder must be built to be used"]
3983pub struct PropertyNotifyBuilder<'a> {
3984 builder: MessageBuilder<'a>,
3985 property_name: &'a str,
3986 value: Option<glib::SendValue>,
3987}
3988
3989impl<'a> PropertyNotifyBuilder<'a> {
3990 fn new(property_name: &'a str) -> Self {
3991 skip_assert_initialized!();
3992 Self {
3993 builder: MessageBuilder::new(),
3994 property_name,
3995 value: None,
3996 }
3997 }
3998
3999 pub fn value(self, value: impl ToSendValue) -> Self {
4000 Self {
4001 value: Some(value.to_send_value()),
4002 ..self
4003 }
4004 }
4005
4006 pub fn value_if(self, value: impl ToSendValue, predicate: bool) -> Self {
4007 if predicate { self.value(value) } else { self }
4008 }
4009
4010 pub fn value_if_some(self, value: Option<impl ToSendValue>) -> Self {
4011 if let Some(value) = value {
4012 self.value(value)
4013 } else {
4014 self
4015 }
4016 }
4017
4018 pub fn value_from_iter<V: ValueType + ToSendValue + FromIterator<SendValue>, I: ToSendValue>(
4019 self,
4020 name: &'a str,
4021 iter: impl IntoIterator<Item = I>,
4022 ) -> Self {
4023 let iter = iter.into_iter().map(|item| item.to_send_value());
4024 self.other_field(name, V::from_iter(iter))
4025 }
4026
4027 pub fn value_field_if_not_empty<
4028 V: ValueType + ToSendValue + FromIterator<SendValue>,
4029 I: ToSendValue,
4030 >(
4031 self,
4032 name: &'a str,
4033 iter: impl IntoIterator<Item = I>,
4034 ) -> Self {
4035 let mut iter = iter.into_iter().peekable();
4036 if iter.peek().is_some() {
4037 let iter = iter.map(|item| item.to_send_value());
4038 self.other_field(name, V::from_iter(iter))
4039 } else {
4040 self
4041 }
4042 }
4043
4044 message_builder_generic_impl!(|s: &mut Self, src| {
4045 let v = s.value.take();
4046 ffi::gst_message_new_property_notify(
4047 src,
4048 s.property_name.to_glib_none().0,
4049 v.as_ref().map(|v| v.as_ptr()).unwrap_or(ptr::null_mut()),
4050 )
4051 });
4052}
4053
4054#[must_use = "The builder must be built to be used"]
4055pub struct StreamCollectionBuilder<'a> {
4056 builder: MessageBuilder<'a>,
4057 collection: &'a crate::StreamCollection,
4058}
4059
4060impl<'a> StreamCollectionBuilder<'a> {
4061 fn new(collection: &'a crate::StreamCollection) -> Self {
4062 skip_assert_initialized!();
4063 Self {
4064 builder: MessageBuilder::new(),
4065 collection,
4066 }
4067 }
4068
4069 message_builder_generic_impl!(|s: &mut Self, src| {
4070 ffi::gst_message_new_stream_collection(src, s.collection.to_glib_none().0)
4071 });
4072}
4073
4074#[must_use = "The builder must be built to be used"]
4075pub struct StreamsSelectedBuilder<'a> {
4076 builder: MessageBuilder<'a>,
4077 collection: &'a crate::StreamCollection,
4078 streams: SmallVec<[crate::Stream; 8]>,
4079}
4080
4081impl<'a> StreamsSelectedBuilder<'a> {
4082 fn new(collection: &'a crate::StreamCollection) -> Self {
4083 skip_assert_initialized!();
4084 Self {
4085 builder: MessageBuilder::new(),
4086 collection,
4087 streams: SmallVec::default(),
4088 }
4089 }
4090
4091 pub fn streams<S: std::borrow::Borrow<crate::Stream>>(
4092 self,
4093 streams: impl IntoIterator<Item = S>,
4094 ) -> Self {
4095 Self {
4096 streams: streams
4097 .into_iter()
4098 .map(|s| s.borrow().clone())
4099 .collect::<SmallVec<_>>(),
4100 ..self
4101 }
4102 }
4103
4104 pub fn streams_if<S: std::borrow::Borrow<crate::Stream>>(
4105 self,
4106 streams: impl IntoIterator<Item = S>,
4107 predicate: bool,
4108 ) -> Self {
4109 if predicate {
4110 self.streams(streams)
4111 } else {
4112 self
4113 }
4114 }
4115
4116 pub fn streams_if_some<S: std::borrow::Borrow<crate::Stream>>(
4117 self,
4118 streams: Option<impl IntoIterator<Item = S>>,
4119 ) -> Self {
4120 if let Some(streams) = streams {
4121 self.streams(streams)
4122 } else {
4123 self
4124 }
4125 }
4126
4127 pub fn streams_if_not_empty<S: std::borrow::Borrow<crate::Stream>>(
4128 self,
4129 streams: impl IntoIterator<Item = S>,
4130 ) -> Self {
4131 let mut streams = streams.into_iter().peekable();
4132 if streams.peek().is_some() {
4133 self.streams(streams)
4134 } else {
4135 self
4136 }
4137 }
4138
4139 message_builder_generic_impl!(|s: &mut Self, src| {
4140 let msg = ffi::gst_message_new_streams_selected(src, s.collection.to_glib_none().0);
4141 for stream in &s.streams {
4142 ffi::gst_message_streams_selected_add(msg, stream.to_glib_none().0);
4143 }
4144 msg
4145 });
4146}
4147
4148#[must_use = "The builder must be built to be used"]
4149pub struct RedirectBuilder<'a> {
4150 builder: MessageBuilder<'a>,
4151 location: &'a str,
4152 tag_list: Option<TagList>,
4153 entry_struct: Option<Structure>,
4154 #[allow(clippy::type_complexity)]
4155 entries: SmallVec<[(&'a str, Option<TagList>, Option<Structure>); 4]>,
4156}
4157
4158impl<'a> RedirectBuilder<'a> {
4159 fn new(location: &'a str) -> Self {
4160 skip_assert_initialized!();
4161 Self {
4162 builder: MessageBuilder::new(),
4163 location,
4164 tag_list: None,
4165 entry_struct: None,
4166 entries: SmallVec::default(),
4167 }
4168 }
4169
4170 pub fn tag_list(self, tag_list: TagList) -> Self {
4171 Self {
4172 tag_list: Some(tag_list),
4173 ..self
4174 }
4175 }
4176
4177 pub fn tag_list_if(self, tag_list: TagList, predicate: bool) -> Self {
4178 if predicate {
4179 self.tag_list(tag_list)
4180 } else {
4181 self
4182 }
4183 }
4184
4185 pub fn tag_list_if_some(self, tag_list: Option<TagList>) -> Self {
4186 if let Some(tag_list) = tag_list {
4187 self.tag_list(tag_list)
4188 } else {
4189 self
4190 }
4191 }
4192
4193 pub fn entry_struct(self, entry_struct: Structure) -> Self {
4194 Self {
4195 entry_struct: Some(entry_struct),
4196 ..self
4197 }
4198 }
4199
4200 pub fn entry_struct_if(self, entry_struct: Structure, predicate: bool) -> Self {
4201 if predicate {
4202 self.entry_struct(entry_struct)
4203 } else {
4204 self
4205 }
4206 }
4207
4208 pub fn entry_struct_if_some(self, entry_struct: Option<Structure>) -> Self {
4209 if let Some(entry_struct) = entry_struct {
4210 self.entry_struct(entry_struct)
4211 } else {
4212 self
4213 }
4214 }
4215
4216 pub fn entries(
4217 self,
4218 entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4219 ) -> Self {
4220 skip_assert_initialized!();
4221 Self {
4222 entries: entries.into_iter().collect(),
4223 ..self
4224 }
4225 }
4226
4227 #[allow(clippy::type_complexity)]
4228 pub fn entries_if(
4229 self,
4230 entries: impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>,
4231 predicate: bool,
4232 ) -> Self {
4233 if predicate {
4234 self.entries(entries)
4235 } else {
4236 self
4237 }
4238 }
4239
4240 #[allow(clippy::type_complexity)]
4241 pub fn entries_if_some(
4242 self,
4243 entries: Option<impl IntoIterator<Item = (&'a str, Option<TagList>, Option<Structure>)>>,
4244 ) -> Self {
4245 if let Some(entries) = entries {
4246 self.entries(entries)
4247 } else {
4248 self
4249 }
4250 }
4251
4252 message_builder_generic_impl!(|s: &mut Self, src| {
4253 let entry_struct = s.entry_struct.take();
4254 let tag_list = s.tag_list.take();
4255
4256 let msg = ffi::gst_message_new_redirect(
4257 src,
4258 s.location.to_glib_none().0,
4259 tag_list.into_glib_ptr(),
4260 entry_struct.into_glib_ptr(),
4261 );
4262 for (location, tag_list, entry_struct) in mem::take(&mut s.entries) {
4263 ffi::gst_message_add_redirect_entry(
4264 msg,
4265 location.to_glib_none().0,
4266 tag_list.into_glib_ptr(),
4267 entry_struct.into_glib_ptr(),
4268 );
4269 }
4270 msg
4271 });
4272}
4273
4274#[cfg(feature = "v1_16")]
4275#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4276#[must_use = "The builder must be built to be used"]
4277pub struct DeviceChangedBuilder<'a> {
4278 builder: MessageBuilder<'a>,
4279 device: &'a crate::Device,
4280 changed_device: &'a crate::Device,
4281}
4282
4283#[cfg(feature = "v1_16")]
4284#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
4285impl<'a> DeviceChangedBuilder<'a> {
4286 fn new(device: &'a crate::Device, changed_device: &'a crate::Device) -> Self {
4287 skip_assert_initialized!();
4288 Self {
4289 builder: MessageBuilder::new(),
4290 device,
4291 changed_device,
4292 }
4293 }
4294
4295 message_builder_generic_impl!(|s: &mut Self, src| ffi::gst_message_new_device_changed(
4296 src,
4297 s.device.to_glib_none().0,
4298 s.changed_device.to_glib_none().0,
4299 ));
4300}
4301
4302#[cfg(feature = "v1_18")]
4303#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4304#[must_use = "The builder must be built to be used"]
4305pub struct InstantRateRequestBuilder<'a> {
4306 builder: MessageBuilder<'a>,
4307 rate_multiplier: f64,
4308}
4309
4310#[cfg(feature = "v1_18")]
4311#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
4312impl<'a> InstantRateRequestBuilder<'a> {
4313 fn new(rate_multiplier: f64) -> Self {
4314 skip_assert_initialized!();
4315 Self {
4316 builder: MessageBuilder::new(),
4317 rate_multiplier,
4318 }
4319 }
4320
4321 message_builder_generic_impl!(
4322 |s: &mut Self, src| ffi::gst_message_new_instant_rate_request(src, s.rate_multiplier,)
4323 );
4324}
4325
4326#[cfg(feature = "v1_28")]
4327#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4328#[must_use = "The builder must be built to be used"]
4329pub struct DeviceMonitorStartedBuilder<'a> {
4330 builder: MessageBuilder<'a>,
4331 started: bool,
4332}
4333
4334#[cfg(feature = "v1_28")]
4335#[cfg_attr(docsrs, doc(cfg(feature = "v1_28")))]
4336impl<'a> DeviceMonitorStartedBuilder<'a> {
4337 fn new(started: bool) -> Self {
4338 skip_assert_initialized!();
4339 Self {
4340 builder: MessageBuilder::new(),
4341 started,
4342 }
4343 }
4344
4345 message_builder_generic_impl!(
4346 |s: &mut Self, src| ffi::gst_message_new_device_monitor_started(src, s.started.into_glib(),)
4347 );
4348}
4349
4350#[cfg(test)]
4351mod tests {
4352 use super::*;
4353
4354 #[test]
4355 fn test_simple() {
4356 crate::init().unwrap();
4357
4358 let seqnum = Seqnum::next();
4360 let eos_msg = Eos::builder().seqnum(seqnum).build();
4361 match eos_msg.view() {
4362 MessageView::Eos(eos_msg) => {
4363 assert_eq!(eos_msg.seqnum(), seqnum);
4364 assert!(eos_msg.structure().is_none());
4365 }
4366 _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4367 }
4368
4369 let buffering_msg = Buffering::new(42);
4371 match buffering_msg.view() {
4372 MessageView::Buffering(buffering_msg) => {
4373 assert_eq!(buffering_msg.percent(), 42);
4374 }
4375 _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4376 }
4377 }
4378
4379 #[test]
4380 #[allow(deprecated)]
4381 fn test_other_fields() {
4382 crate::init().unwrap();
4383
4384 let seqnum = Seqnum::next();
4385 let eos_msg = Eos::builder()
4386 .other_field("extra-field", true)
4387 .seqnum(seqnum)
4388 .build();
4389 match eos_msg.view() {
4390 MessageView::Eos(eos_msg) => {
4391 assert_eq!(eos_msg.seqnum(), seqnum);
4392 if let Some(other_fields) = eos_msg.structure() {
4393 assert!(other_fields.has_field("extra-field"));
4394 }
4395 }
4396 _ => panic!("eos_msg.view() is not a MessageView::Eos(_)"),
4397 }
4398
4399 let buffering_msg = Buffering::builder(42)
4400 .other_field("extra-field", true)
4401 .build();
4402 match buffering_msg.view() {
4403 MessageView::Buffering(buffering_msg) => {
4404 assert_eq!(buffering_msg.percent(), 42);
4405 if let Some(other_fields) = buffering_msg.structure() {
4406 assert!(other_fields.has_field("extra-field"));
4407 }
4408 }
4409 _ => panic!("buffering_msg.view() is not a MessageView::Buffering(_)"),
4410 }
4411 }
4412
4413 #[test]
4414 fn test_get_seqnum_valid() {
4415 crate::init().unwrap();
4416
4417 let msg = StreamStart::new();
4418 let seqnum = Seqnum(
4419 NonZeroU32::new(unsafe { ffi::gst_message_get_seqnum(msg.as_mut_ptr()) }).unwrap(),
4420 );
4421
4422 match msg.view() {
4423 MessageView::StreamStart(stream_start) => assert_eq!(seqnum, stream_start.seqnum()),
4424 _ => panic!(),
4425 }
4426 }
4427
4428 #[test]
4429 fn test_get_seqnum_invalid() {
4430 crate::init().unwrap();
4431
4432 let msg = StreamStart::new();
4433 let seqnum_init = msg.seqnum();
4434
4435 unsafe {
4437 (*msg.as_mut_ptr()).seqnum = ffi::GST_SEQNUM_INVALID as u32;
4438 assert_eq!(0, (*msg.as_ptr()).seqnum);
4439 };
4440
4441 match msg.view() {
4442 MessageView::StreamStart(stream_start) => {
4443 assert!(seqnum_init < stream_start.seqnum());
4446 }
4447 _ => panic!(),
4448 }
4449 }
4450
4451 #[test]
4452 fn debug_impl() {
4453 crate::init().unwrap();
4454
4455 let mut message = Eos::new();
4457 let debug = format!("{message:?}");
4458 println!("{debug}");
4459
4460 {
4461 let message = message.make_mut();
4462 message.structure_mut().set("user-defined", "my value");
4463 }
4464 let debug = format!("{message:?}");
4465 println!("{debug}");
4466 assert!(debug.contains("my value"));
4467
4468 let mut message = Error::new(crate::CoreError::Failed, "test msg");
4470 let debug = format!("{message:?}");
4471 assert!(!debug.contains("gerror")); println!("{debug}");
4473
4474 {
4475 let message = message.make_mut();
4476 message.structure_mut().set("user-defined", "my value");
4477 }
4478 let debug = format!("{message:?}");
4479 println!("{debug}");
4480 assert!(debug.contains("my value"));
4481
4482 let mut message = Qos::new(
4484 true,
4485 420.mseconds(),
4486 42.mseconds(),
4487 Some(400.mseconds()),
4488 90.seconds(),
4489 );
4490 let debug = format!("{message:?}");
4491 assert!(!debug.contains("format")); println!("{debug}");
4493
4494 {
4495 let message = message.make_mut();
4496 message.structure_mut().set("user-defined", "my value");
4497 }
4498 let debug = format!("{message:?}");
4499 println!("{debug}");
4500 assert!(debug.contains("my value"));
4501 }
4502}