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