Skip to main content

fidl_fuchsia_ultrasound/
fidl_fuchsia_ultrasound.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_ultrasound_common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
15pub struct FactoryCreateCapturerRequest {
16    pub request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
17}
18
19impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
20    for FactoryCreateCapturerRequest
21{
22}
23
24#[derive(Debug, PartialEq)]
25pub struct FactoryCreateCapturerResponse {
26    pub reference_clock: fidl::Clock,
27    pub stream_type: fidl_fuchsia_media::AudioStreamType,
28}
29
30impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
31    for FactoryCreateCapturerResponse
32{
33}
34
35#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
36pub struct FactoryCreateRendererRequest {
37    pub renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
38}
39
40impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
41    for FactoryCreateRendererRequest
42{
43}
44
45#[derive(Debug, PartialEq)]
46pub struct FactoryCreateRendererResponse {
47    pub reference_clock: fidl::Clock,
48    pub stream_type: fidl_fuchsia_media::AudioStreamType,
49}
50
51impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect>
52    for FactoryCreateRendererResponse
53{
54}
55
56#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
57pub struct FactoryMarker;
58
59impl fidl::endpoints::ProtocolMarker for FactoryMarker {
60    type Proxy = FactoryProxy;
61    type RequestStream = FactoryRequestStream;
62    #[cfg(target_os = "fuchsia")]
63    type SynchronousProxy = FactorySynchronousProxy;
64
65    const DEBUG_NAME: &'static str = "fuchsia.ultrasound.Factory";
66}
67impl fidl::endpoints::DiscoverableProtocolMarker for FactoryMarker {}
68
69pub trait FactoryProxyInterface: Send + Sync {
70    type CreateCapturerResponseFut: std::future::Future<
71            Output = Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error>,
72        > + Send;
73    fn r#create_capturer(
74        &self,
75        request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
76    ) -> Self::CreateCapturerResponseFut;
77    type CreateRendererResponseFut: std::future::Future<
78            Output = Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error>,
79        > + Send;
80    fn r#create_renderer(
81        &self,
82        renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
83    ) -> Self::CreateRendererResponseFut;
84}
85#[derive(Debug)]
86#[cfg(target_os = "fuchsia")]
87pub struct FactorySynchronousProxy {
88    client: fidl::client::sync::Client,
89}
90
91#[cfg(target_os = "fuchsia")]
92impl fidl::endpoints::SynchronousProxy for FactorySynchronousProxy {
93    type Proxy = FactoryProxy;
94    type Protocol = FactoryMarker;
95
96    fn from_channel(inner: fidl::Channel) -> Self {
97        Self::new(inner)
98    }
99
100    fn into_channel(self) -> fidl::Channel {
101        self.client.into_channel()
102    }
103
104    fn as_channel(&self) -> &fidl::Channel {
105        self.client.as_channel()
106    }
107}
108
109#[cfg(target_os = "fuchsia")]
110impl FactorySynchronousProxy {
111    pub fn new(channel: fidl::Channel) -> Self {
112        Self { client: fidl::client::sync::Client::new(channel) }
113    }
114
115    pub fn into_channel(self) -> fidl::Channel {
116        self.client.into_channel()
117    }
118
119    /// Waits until an event arrives and returns it. It is safe for other
120    /// threads to make concurrent requests while waiting for an event.
121    pub fn wait_for_event(
122        &self,
123        deadline: zx::MonotonicInstant,
124    ) -> Result<FactoryEvent, fidl::Error> {
125        FactoryEvent::decode(self.client.wait_for_event::<FactoryMarker>(deadline)?)
126    }
127
128    /// Creates a new `fuchsia.media.AudioCapturer` that is capable of capturing audio in
129    /// the ultrasonic frequency range.
130    ///
131    /// The capturer will be suitible for capturing audio at ultrasound frequencies. The
132    /// channelization and sample rate of the capturer will be fixed to whatever the underlying
133    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
134    ///
135    /// See `fuchsia.media.AudioCore` for more information on the operation of a
136    /// `fuchsia.media.AudioCapturer`, with the following differences:
137    ///
138    /// - `SetUsage` is disallowed. Ultrasound capturers do not have an associated
139    /// `fuchsia.media.AudioCaptureUsage`.
140    ///
141    /// - `BindGainControl` is disallowed. Ultrasound capturers will always have unity gain.
142    ///
143    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound capturer is not
144    /// configurable, but instead returned from `CreateCapturer`.
145    ///
146    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound capturer is not
147    /// configurable, but instead returned from `CreateCapturer`.
148    pub fn r#create_capturer(
149        &self,
150        mut request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
151        ___deadline: zx::MonotonicInstant,
152    ) -> Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error> {
153        let _response = self.client.send_query::<
154            FactoryCreateCapturerRequest,
155            FactoryCreateCapturerResponse,
156            FactoryMarker,
157        >(
158            (request,),
159            0xe8b6e0e27f02115,
160            fidl::encoding::DynamicFlags::empty(),
161            ___deadline,
162        )?;
163        Ok((_response.reference_clock, _response.stream_type))
164    }
165
166    /// Creates a new `fuchsia.media.AudioRenderer` that is capable of producing audio in
167    /// the ultrasonic frequency range.
168    ///
169    /// The renderer will be suitible for producing audio at ultrasound frequencies. The
170    /// channelization and sample rate of the renderer will be fixed to whatever the underlying
171    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
172    ///
173    /// See `fuchsia.media.AudioCore` for more information on the operation of a
174    /// `fuchsia.media.AudioRenderer`, with the following differences:
175    ///
176    /// - `SetUsage` is disallowed. Ultrasound renderers do not have an associated
177    /// `fuchsia.media.AudioRenderUsage2`.
178    ///
179    /// - `BindGainControl` is disallowed. Ultrasound renderers will always have unity gain.
180    ///
181    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound renderer is not
182    /// configurable, but instead returned from `CreateRenderer`.
183    ///
184    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound renderer is not
185    /// configurable, but instead returned from `CreateRenderer`.
186    pub fn r#create_renderer(
187        &self,
188        mut renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
189        ___deadline: zx::MonotonicInstant,
190    ) -> Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error> {
191        let _response = self.client.send_query::<
192            FactoryCreateRendererRequest,
193            FactoryCreateRendererResponse,
194            FactoryMarker,
195        >(
196            (renderer,),
197            0x3ce8fb1897ec7932,
198            fidl::encoding::DynamicFlags::empty(),
199            ___deadline,
200        )?;
201        Ok((_response.reference_clock, _response.stream_type))
202    }
203}
204
205#[cfg(target_os = "fuchsia")]
206impl From<FactorySynchronousProxy> for zx::NullableHandle {
207    fn from(value: FactorySynchronousProxy) -> Self {
208        value.into_channel().into()
209    }
210}
211
212#[cfg(target_os = "fuchsia")]
213impl From<fidl::Channel> for FactorySynchronousProxy {
214    fn from(value: fidl::Channel) -> Self {
215        Self::new(value)
216    }
217}
218
219#[cfg(target_os = "fuchsia")]
220impl fidl::endpoints::FromClient for FactorySynchronousProxy {
221    type Protocol = FactoryMarker;
222
223    fn from_client(value: fidl::endpoints::ClientEnd<FactoryMarker>) -> Self {
224        Self::new(value.into_channel())
225    }
226}
227
228#[derive(Debug, Clone)]
229pub struct FactoryProxy {
230    client: fidl::client::Client<fidl::encoding::DefaultFuchsiaResourceDialect>,
231}
232
233impl fidl::endpoints::Proxy for FactoryProxy {
234    type Protocol = FactoryMarker;
235
236    fn from_channel(inner: ::fidl::AsyncChannel) -> Self {
237        Self::new(inner)
238    }
239
240    fn into_channel(self) -> Result<::fidl::AsyncChannel, Self> {
241        self.client.into_channel().map_err(|client| Self { client })
242    }
243
244    fn as_channel(&self) -> &::fidl::AsyncChannel {
245        self.client.as_channel()
246    }
247}
248
249impl FactoryProxy {
250    /// Create a new Proxy for fuchsia.ultrasound/Factory.
251    pub fn new(channel: ::fidl::AsyncChannel) -> Self {
252        let protocol_name = <FactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME;
253        Self { client: fidl::client::Client::new(channel, protocol_name) }
254    }
255
256    /// Get a Stream of events from the remote end of the protocol.
257    ///
258    /// # Panics
259    ///
260    /// Panics if the event stream was already taken.
261    pub fn take_event_stream(&self) -> FactoryEventStream {
262        FactoryEventStream { event_receiver: self.client.take_event_receiver() }
263    }
264
265    /// Creates a new `fuchsia.media.AudioCapturer` that is capable of capturing audio in
266    /// the ultrasonic frequency range.
267    ///
268    /// The capturer will be suitible for capturing audio at ultrasound frequencies. The
269    /// channelization and sample rate of the capturer will be fixed to whatever the underlying
270    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
271    ///
272    /// See `fuchsia.media.AudioCore` for more information on the operation of a
273    /// `fuchsia.media.AudioCapturer`, with the following differences:
274    ///
275    /// - `SetUsage` is disallowed. Ultrasound capturers do not have an associated
276    /// `fuchsia.media.AudioCaptureUsage`.
277    ///
278    /// - `BindGainControl` is disallowed. Ultrasound capturers will always have unity gain.
279    ///
280    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound capturer is not
281    /// configurable, but instead returned from `CreateCapturer`.
282    ///
283    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound capturer is not
284    /// configurable, but instead returned from `CreateCapturer`.
285    pub fn r#create_capturer(
286        &self,
287        mut request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
288    ) -> fidl::client::QueryResponseFut<
289        (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
290        fidl::encoding::DefaultFuchsiaResourceDialect,
291    > {
292        FactoryProxyInterface::r#create_capturer(self, request)
293    }
294
295    /// Creates a new `fuchsia.media.AudioRenderer` that is capable of producing audio in
296    /// the ultrasonic frequency range.
297    ///
298    /// The renderer will be suitible for producing audio at ultrasound frequencies. The
299    /// channelization and sample rate of the renderer will be fixed to whatever the underlying
300    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
301    ///
302    /// See `fuchsia.media.AudioCore` for more information on the operation of a
303    /// `fuchsia.media.AudioRenderer`, with the following differences:
304    ///
305    /// - `SetUsage` is disallowed. Ultrasound renderers do not have an associated
306    /// `fuchsia.media.AudioRenderUsage2`.
307    ///
308    /// - `BindGainControl` is disallowed. Ultrasound renderers will always have unity gain.
309    ///
310    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound renderer is not
311    /// configurable, but instead returned from `CreateRenderer`.
312    ///
313    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound renderer is not
314    /// configurable, but instead returned from `CreateRenderer`.
315    pub fn r#create_renderer(
316        &self,
317        mut renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
318    ) -> fidl::client::QueryResponseFut<
319        (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
320        fidl::encoding::DefaultFuchsiaResourceDialect,
321    > {
322        FactoryProxyInterface::r#create_renderer(self, renderer)
323    }
324}
325
326impl FactoryProxyInterface for FactoryProxy {
327    type CreateCapturerResponseFut = fidl::client::QueryResponseFut<
328        (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
329        fidl::encoding::DefaultFuchsiaResourceDialect,
330    >;
331    fn r#create_capturer(
332        &self,
333        mut request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
334    ) -> Self::CreateCapturerResponseFut {
335        fn _decode(
336            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
337        ) -> Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error> {
338            let _response = fidl::client::decode_transaction_body::<
339                FactoryCreateCapturerResponse,
340                fidl::encoding::DefaultFuchsiaResourceDialect,
341                0xe8b6e0e27f02115,
342            >(_buf?)?;
343            Ok((_response.reference_clock, _response.stream_type))
344        }
345        self.client.send_query_and_decode::<
346            FactoryCreateCapturerRequest,
347            (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
348        >(
349            (request,),
350            0xe8b6e0e27f02115,
351            fidl::encoding::DynamicFlags::empty(),
352            _decode,
353        )
354    }
355
356    type CreateRendererResponseFut = fidl::client::QueryResponseFut<
357        (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
358        fidl::encoding::DefaultFuchsiaResourceDialect,
359    >;
360    fn r#create_renderer(
361        &self,
362        mut renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
363    ) -> Self::CreateRendererResponseFut {
364        fn _decode(
365            mut _buf: Result<<fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc, fidl::Error>,
366        ) -> Result<(fidl::Clock, fidl_fuchsia_media::AudioStreamType), fidl::Error> {
367            let _response = fidl::client::decode_transaction_body::<
368                FactoryCreateRendererResponse,
369                fidl::encoding::DefaultFuchsiaResourceDialect,
370                0x3ce8fb1897ec7932,
371            >(_buf?)?;
372            Ok((_response.reference_clock, _response.stream_type))
373        }
374        self.client.send_query_and_decode::<
375            FactoryCreateRendererRequest,
376            (fidl::Clock, fidl_fuchsia_media::AudioStreamType),
377        >(
378            (renderer,),
379            0x3ce8fb1897ec7932,
380            fidl::encoding::DynamicFlags::empty(),
381            _decode,
382        )
383    }
384}
385
386pub struct FactoryEventStream {
387    event_receiver: fidl::client::EventReceiver<fidl::encoding::DefaultFuchsiaResourceDialect>,
388}
389
390impl std::marker::Unpin for FactoryEventStream {}
391
392impl futures::stream::FusedStream for FactoryEventStream {
393    fn is_terminated(&self) -> bool {
394        self.event_receiver.is_terminated()
395    }
396}
397
398impl futures::Stream for FactoryEventStream {
399    type Item = Result<FactoryEvent, fidl::Error>;
400
401    fn poll_next(
402        mut self: std::pin::Pin<&mut Self>,
403        cx: &mut std::task::Context<'_>,
404    ) -> std::task::Poll<Option<Self::Item>> {
405        match futures::ready!(futures::stream::StreamExt::poll_next_unpin(
406            &mut self.event_receiver,
407            cx
408        )?) {
409            Some(buf) => std::task::Poll::Ready(Some(FactoryEvent::decode(buf))),
410            None => std::task::Poll::Ready(None),
411        }
412    }
413}
414
415#[derive(Debug)]
416pub enum FactoryEvent {}
417
418impl FactoryEvent {
419    /// Decodes a message buffer as a [`FactoryEvent`].
420    fn decode(
421        mut buf: <fidl::encoding::DefaultFuchsiaResourceDialect as fidl::encoding::ResourceDialect>::MessageBufEtc,
422    ) -> Result<FactoryEvent, fidl::Error> {
423        let (bytes, _handles) = buf.split_mut();
424        let (tx_header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
425        debug_assert_eq!(tx_header.tx_id, 0);
426        match tx_header.ordinal {
427            _ => Err(fidl::Error::UnknownOrdinal {
428                ordinal: tx_header.ordinal,
429                protocol_name: <FactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
430            }),
431        }
432    }
433}
434
435/// A Stream of incoming requests for fuchsia.ultrasound/Factory.
436pub struct FactoryRequestStream {
437    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
438    is_terminated: bool,
439}
440
441impl std::marker::Unpin for FactoryRequestStream {}
442
443impl futures::stream::FusedStream for FactoryRequestStream {
444    fn is_terminated(&self) -> bool {
445        self.is_terminated
446    }
447}
448
449impl fidl::endpoints::RequestStream for FactoryRequestStream {
450    type Protocol = FactoryMarker;
451    type ControlHandle = FactoryControlHandle;
452
453    fn from_channel(channel: ::fidl::AsyncChannel) -> Self {
454        Self { inner: std::sync::Arc::new(fidl::ServeInner::new(channel)), is_terminated: false }
455    }
456
457    fn control_handle(&self) -> Self::ControlHandle {
458        FactoryControlHandle { inner: self.inner.clone() }
459    }
460
461    fn into_inner(
462        self,
463    ) -> (::std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>, bool)
464    {
465        (self.inner, self.is_terminated)
466    }
467
468    fn from_inner(
469        inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
470        is_terminated: bool,
471    ) -> Self {
472        Self { inner, is_terminated }
473    }
474}
475
476impl futures::Stream for FactoryRequestStream {
477    type Item = Result<FactoryRequest, fidl::Error>;
478
479    fn poll_next(
480        mut self: std::pin::Pin<&mut Self>,
481        cx: &mut std::task::Context<'_>,
482    ) -> std::task::Poll<Option<Self::Item>> {
483        let this = &mut *self;
484        if this.inner.check_shutdown(cx) {
485            this.is_terminated = true;
486            return std::task::Poll::Ready(None);
487        }
488        if this.is_terminated {
489            panic!("polled FactoryRequestStream after completion");
490        }
491        fidl::encoding::with_tls_decode_buf::<_, fidl::encoding::DefaultFuchsiaResourceDialect>(
492            |bytes, handles| {
493                match this.inner.channel().read_etc(cx, bytes, handles) {
494                    std::task::Poll::Ready(Ok(())) => {}
495                    std::task::Poll::Pending => return std::task::Poll::Pending,
496                    std::task::Poll::Ready(Err(zx_status::Status::PEER_CLOSED)) => {
497                        this.is_terminated = true;
498                        return std::task::Poll::Ready(None);
499                    }
500                    std::task::Poll::Ready(Err(e)) => {
501                        return std::task::Poll::Ready(Some(Err(fidl::Error::ServerRequestRead(
502                            e.into(),
503                        ))));
504                    }
505                }
506
507                // A message has been received from the channel
508                let (header, _body_bytes) = fidl::encoding::decode_transaction_header(bytes)?;
509
510                std::task::Poll::Ready(Some(match header.ordinal {
511                    0xe8b6e0e27f02115 => {
512                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
513                        let mut req = fidl::new_empty!(
514                            FactoryCreateCapturerRequest,
515                            fidl::encoding::DefaultFuchsiaResourceDialect
516                        );
517                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<FactoryCreateCapturerRequest>(&header, _body_bytes, handles, &mut req)?;
518                        let control_handle = FactoryControlHandle { inner: this.inner.clone() };
519                        Ok(FactoryRequest::CreateCapturer {
520                            request: req.request,
521
522                            responder: FactoryCreateCapturerResponder {
523                                control_handle: std::mem::ManuallyDrop::new(control_handle),
524                                tx_id: header.tx_id,
525                            },
526                        })
527                    }
528                    0x3ce8fb1897ec7932 => {
529                        header.validate_request_tx_id(fidl::MethodType::TwoWay)?;
530                        let mut req = fidl::new_empty!(
531                            FactoryCreateRendererRequest,
532                            fidl::encoding::DefaultFuchsiaResourceDialect
533                        );
534                        fidl::encoding::Decoder::<fidl::encoding::DefaultFuchsiaResourceDialect>::decode_into::<FactoryCreateRendererRequest>(&header, _body_bytes, handles, &mut req)?;
535                        let control_handle = FactoryControlHandle { inner: this.inner.clone() };
536                        Ok(FactoryRequest::CreateRenderer {
537                            renderer: req.renderer,
538
539                            responder: FactoryCreateRendererResponder {
540                                control_handle: std::mem::ManuallyDrop::new(control_handle),
541                                tx_id: header.tx_id,
542                            },
543                        })
544                    }
545                    _ => Err(fidl::Error::UnknownOrdinal {
546                        ordinal: header.ordinal,
547                        protocol_name:
548                            <FactoryMarker as fidl::endpoints::ProtocolMarker>::DEBUG_NAME,
549                    }),
550                }))
551            },
552        )
553    }
554}
555
556#[derive(Debug)]
557pub enum FactoryRequest {
558    /// Creates a new `fuchsia.media.AudioCapturer` that is capable of capturing audio in
559    /// the ultrasonic frequency range.
560    ///
561    /// The capturer will be suitible for capturing audio at ultrasound frequencies. The
562    /// channelization and sample rate of the capturer will be fixed to whatever the underlying
563    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
564    ///
565    /// See `fuchsia.media.AudioCore` for more information on the operation of a
566    /// `fuchsia.media.AudioCapturer`, with the following differences:
567    ///
568    /// - `SetUsage` is disallowed. Ultrasound capturers do not have an associated
569    /// `fuchsia.media.AudioCaptureUsage`.
570    ///
571    /// - `BindGainControl` is disallowed. Ultrasound capturers will always have unity gain.
572    ///
573    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound capturer is not
574    /// configurable, but instead returned from `CreateCapturer`.
575    ///
576    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound capturer is not
577    /// configurable, but instead returned from `CreateCapturer`.
578    CreateCapturer {
579        request: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
580        responder: FactoryCreateCapturerResponder,
581    },
582    /// Creates a new `fuchsia.media.AudioRenderer` that is capable of producing audio in
583    /// the ultrasonic frequency range.
584    ///
585    /// The renderer will be suitible for producing audio at ultrasound frequencies. The
586    /// channelization and sample rate of the renderer will be fixed to whatever the underlying
587    /// device is configured for. The `fuchsia.media.AudioSampleFormat` will be `FLOAT`.
588    ///
589    /// See `fuchsia.media.AudioCore` for more information on the operation of a
590    /// `fuchsia.media.AudioRenderer`, with the following differences:
591    ///
592    /// - `SetUsage` is disallowed. Ultrasound renderers do not have an associated
593    /// `fuchsia.media.AudioRenderUsage2`.
594    ///
595    /// - `BindGainControl` is disallowed. Ultrasound renderers will always have unity gain.
596    ///
597    /// - `SetPcmStreamType` is disallowed. The stream type of an ultrasound renderer is not
598    /// configurable, but instead returned from `CreateRenderer`.
599    ///
600    /// - `SetReferenceClock` is disallowed. The reference clock of an ultrasound renderer is not
601    /// configurable, but instead returned from `CreateRenderer`.
602    CreateRenderer {
603        renderer: fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
604        responder: FactoryCreateRendererResponder,
605    },
606}
607
608impl FactoryRequest {
609    #[allow(irrefutable_let_patterns)]
610    pub fn into_create_capturer(
611        self,
612    ) -> Option<(
613        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
614        FactoryCreateCapturerResponder,
615    )> {
616        if let FactoryRequest::CreateCapturer { request, responder } = self {
617            Some((request, responder))
618        } else {
619            None
620        }
621    }
622
623    #[allow(irrefutable_let_patterns)]
624    pub fn into_create_renderer(
625        self,
626    ) -> Option<(
627        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
628        FactoryCreateRendererResponder,
629    )> {
630        if let FactoryRequest::CreateRenderer { renderer, responder } = self {
631            Some((renderer, responder))
632        } else {
633            None
634        }
635    }
636
637    /// Name of the method defined in FIDL
638    pub fn method_name(&self) -> &'static str {
639        match *self {
640            FactoryRequest::CreateCapturer { .. } => "create_capturer",
641            FactoryRequest::CreateRenderer { .. } => "create_renderer",
642        }
643    }
644}
645
646#[derive(Debug, Clone)]
647pub struct FactoryControlHandle {
648    inner: std::sync::Arc<fidl::ServeInner<fidl::encoding::DefaultFuchsiaResourceDialect>>,
649}
650
651impl FactoryControlHandle {
652    pub fn shutdown_with_epitaph(&self, status: impl Into<fidl::Epitaph>) {
653        self.inner.shutdown_with_epitaph(status.into())
654    }
655}
656
657impl fidl::endpoints::ControlHandle for FactoryControlHandle {
658    fn shutdown(&self) {
659        self.inner.shutdown()
660    }
661
662    fn shutdown_with_epitaph(&self, status: fidl::Epitaph) {
663        self.inner.shutdown_with_epitaph(status)
664    }
665
666    fn is_closed(&self) -> bool {
667        self.inner.channel().is_closed()
668    }
669    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
670        self.inner.channel().on_closed()
671    }
672
673    #[cfg(target_os = "fuchsia")]
674    fn signal_peer(
675        &self,
676        clear_mask: zx::Signals,
677        set_mask: zx::Signals,
678    ) -> Result<(), zx_status::Status> {
679        use fidl::Peered;
680        self.inner.channel().signal_peer(clear_mask, set_mask)
681    }
682}
683
684impl FactoryControlHandle {}
685
686#[must_use = "FIDL methods require a response to be sent"]
687#[derive(Debug)]
688pub struct FactoryCreateCapturerResponder {
689    control_handle: std::mem::ManuallyDrop<FactoryControlHandle>,
690    tx_id: u32,
691}
692
693/// Set the the channel to be shutdown (see [`FactoryControlHandle::shutdown`])
694/// if the responder is dropped without sending a response, so that the client
695/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
696impl std::ops::Drop for FactoryCreateCapturerResponder {
697    fn drop(&mut self) {
698        self.control_handle.shutdown();
699        // Safety: drops once, never accessed again
700        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
701    }
702}
703
704impl fidl::endpoints::Responder for FactoryCreateCapturerResponder {
705    type ControlHandle = FactoryControlHandle;
706
707    fn control_handle(&self) -> &FactoryControlHandle {
708        &self.control_handle
709    }
710
711    fn drop_without_shutdown(mut self) {
712        // Safety: drops once, never accessed again due to mem::forget
713        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
714        // Prevent Drop from running (which would shut down the channel)
715        std::mem::forget(self);
716    }
717}
718
719impl FactoryCreateCapturerResponder {
720    /// Sends a response to the FIDL transaction.
721    ///
722    /// Sets the channel to shutdown if an error occurs.
723    pub fn send(
724        self,
725        mut reference_clock: fidl::Clock,
726        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
727    ) -> Result<(), fidl::Error> {
728        let _result = self.send_raw(reference_clock, stream_type);
729        if _result.is_err() {
730            self.control_handle.shutdown();
731        }
732        self.drop_without_shutdown();
733        _result
734    }
735
736    /// Similar to "send" but does not shutdown the channel if an error occurs.
737    pub fn send_no_shutdown_on_err(
738        self,
739        mut reference_clock: fidl::Clock,
740        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
741    ) -> Result<(), fidl::Error> {
742        let _result = self.send_raw(reference_clock, stream_type);
743        self.drop_without_shutdown();
744        _result
745    }
746
747    fn send_raw(
748        &self,
749        mut reference_clock: fidl::Clock,
750        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
751    ) -> Result<(), fidl::Error> {
752        self.control_handle.inner.send::<FactoryCreateCapturerResponse>(
753            (reference_clock, stream_type),
754            self.tx_id,
755            0xe8b6e0e27f02115,
756            fidl::encoding::DynamicFlags::empty(),
757        )
758    }
759}
760
761#[must_use = "FIDL methods require a response to be sent"]
762#[derive(Debug)]
763pub struct FactoryCreateRendererResponder {
764    control_handle: std::mem::ManuallyDrop<FactoryControlHandle>,
765    tx_id: u32,
766}
767
768/// Set the the channel to be shutdown (see [`FactoryControlHandle::shutdown`])
769/// if the responder is dropped without sending a response, so that the client
770/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
771impl std::ops::Drop for FactoryCreateRendererResponder {
772    fn drop(&mut self) {
773        self.control_handle.shutdown();
774        // Safety: drops once, never accessed again
775        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
776    }
777}
778
779impl fidl::endpoints::Responder for FactoryCreateRendererResponder {
780    type ControlHandle = FactoryControlHandle;
781
782    fn control_handle(&self) -> &FactoryControlHandle {
783        &self.control_handle
784    }
785
786    fn drop_without_shutdown(mut self) {
787        // Safety: drops once, never accessed again due to mem::forget
788        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
789        // Prevent Drop from running (which would shut down the channel)
790        std::mem::forget(self);
791    }
792}
793
794impl FactoryCreateRendererResponder {
795    /// Sends a response to the FIDL transaction.
796    ///
797    /// Sets the channel to shutdown if an error occurs.
798    pub fn send(
799        self,
800        mut reference_clock: fidl::Clock,
801        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
802    ) -> Result<(), fidl::Error> {
803        let _result = self.send_raw(reference_clock, stream_type);
804        if _result.is_err() {
805            self.control_handle.shutdown();
806        }
807        self.drop_without_shutdown();
808        _result
809    }
810
811    /// Similar to "send" but does not shutdown the channel if an error occurs.
812    pub fn send_no_shutdown_on_err(
813        self,
814        mut reference_clock: fidl::Clock,
815        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
816    ) -> Result<(), fidl::Error> {
817        let _result = self.send_raw(reference_clock, stream_type);
818        self.drop_without_shutdown();
819        _result
820    }
821
822    fn send_raw(
823        &self,
824        mut reference_clock: fidl::Clock,
825        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
826    ) -> Result<(), fidl::Error> {
827        self.control_handle.inner.send::<FactoryCreateRendererResponse>(
828            (reference_clock, stream_type),
829            self.tx_id,
830            0x3ce8fb1897ec7932,
831            fidl::encoding::DynamicFlags::empty(),
832        )
833    }
834}
835
836mod internal {
837    use super::*;
838
839    impl fidl::encoding::ResourceTypeMarker for FactoryCreateCapturerRequest {
840        type Borrowed<'a> = &'a mut Self;
841        fn take_or_borrow<'a>(
842            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
843        ) -> Self::Borrowed<'a> {
844            value
845        }
846    }
847
848    unsafe impl fidl::encoding::TypeMarker for FactoryCreateCapturerRequest {
849        type Owned = Self;
850
851        #[inline(always)]
852        fn inline_align(_context: fidl::encoding::Context) -> usize {
853            4
854        }
855
856        #[inline(always)]
857        fn inline_size(_context: fidl::encoding::Context) -> usize {
858            4
859        }
860    }
861
862    unsafe impl
863        fidl::encoding::Encode<
864            FactoryCreateCapturerRequest,
865            fidl::encoding::DefaultFuchsiaResourceDialect,
866        > for &mut FactoryCreateCapturerRequest
867    {
868        #[inline]
869        unsafe fn encode(
870            self,
871            encoder: &mut fidl::encoding::Encoder<
872                '_,
873                fidl::encoding::DefaultFuchsiaResourceDialect,
874            >,
875            offset: usize,
876            _depth: fidl::encoding::Depth,
877        ) -> fidl::Result<()> {
878            encoder.debug_check_bounds::<FactoryCreateCapturerRequest>(offset);
879            // Delegate to tuple encoding.
880            fidl::encoding::Encode::<
881                FactoryCreateCapturerRequest,
882                fidl::encoding::DefaultFuchsiaResourceDialect,
883            >::encode(
884                (<fidl::encoding::Endpoint<
885                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
886                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
887                    &mut self.request
888                ),),
889                encoder,
890                offset,
891                _depth,
892            )
893        }
894    }
895    unsafe impl<
896        T0: fidl::encoding::Encode<
897                fidl::encoding::Endpoint<
898                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
899                >,
900                fidl::encoding::DefaultFuchsiaResourceDialect,
901            >,
902    >
903        fidl::encoding::Encode<
904            FactoryCreateCapturerRequest,
905            fidl::encoding::DefaultFuchsiaResourceDialect,
906        > for (T0,)
907    {
908        #[inline]
909        unsafe fn encode(
910            self,
911            encoder: &mut fidl::encoding::Encoder<
912                '_,
913                fidl::encoding::DefaultFuchsiaResourceDialect,
914            >,
915            offset: usize,
916            depth: fidl::encoding::Depth,
917        ) -> fidl::Result<()> {
918            encoder.debug_check_bounds::<FactoryCreateCapturerRequest>(offset);
919            // Zero out padding regions. There's no need to apply masks
920            // because the unmasked parts will be overwritten by fields.
921            // Write the fields.
922            self.0.encode(encoder, offset + 0, depth)?;
923            Ok(())
924        }
925    }
926
927    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
928        for FactoryCreateCapturerRequest
929    {
930        #[inline(always)]
931        fn new_empty() -> Self {
932            Self {
933                request: fidl::new_empty!(
934                    fidl::encoding::Endpoint<
935                        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
936                    >,
937                    fidl::encoding::DefaultFuchsiaResourceDialect
938                ),
939            }
940        }
941
942        #[inline]
943        unsafe fn decode(
944            &mut self,
945            decoder: &mut fidl::encoding::Decoder<
946                '_,
947                fidl::encoding::DefaultFuchsiaResourceDialect,
948            >,
949            offset: usize,
950            _depth: fidl::encoding::Depth,
951        ) -> fidl::Result<()> {
952            decoder.debug_check_bounds::<Self>(offset);
953            // Verify that padding bytes are zero.
954            fidl::decode!(
955                fidl::encoding::Endpoint<
956                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
957                >,
958                fidl::encoding::DefaultFuchsiaResourceDialect,
959                &mut self.request,
960                decoder,
961                offset + 0,
962                _depth
963            )?;
964            Ok(())
965        }
966    }
967
968    impl fidl::encoding::ResourceTypeMarker for FactoryCreateCapturerResponse {
969        type Borrowed<'a> = &'a mut Self;
970        fn take_or_borrow<'a>(
971            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
972        ) -> Self::Borrowed<'a> {
973            value
974        }
975    }
976
977    unsafe impl fidl::encoding::TypeMarker for FactoryCreateCapturerResponse {
978        type Owned = Self;
979
980        #[inline(always)]
981        fn inline_align(_context: fidl::encoding::Context) -> usize {
982            4
983        }
984
985        #[inline(always)]
986        fn inline_size(_context: fidl::encoding::Context) -> usize {
987            16
988        }
989    }
990
991    unsafe impl
992        fidl::encoding::Encode<
993            FactoryCreateCapturerResponse,
994            fidl::encoding::DefaultFuchsiaResourceDialect,
995        > for &mut FactoryCreateCapturerResponse
996    {
997        #[inline]
998        unsafe fn encode(
999            self,
1000            encoder: &mut fidl::encoding::Encoder<
1001                '_,
1002                fidl::encoding::DefaultFuchsiaResourceDialect,
1003            >,
1004            offset: usize,
1005            _depth: fidl::encoding::Depth,
1006        ) -> fidl::Result<()> {
1007            encoder.debug_check_bounds::<FactoryCreateCapturerResponse>(offset);
1008            // Delegate to tuple encoding.
1009            fidl::encoding::Encode::<FactoryCreateCapturerResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
1010                (
1011                    <fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.reference_clock),
1012                    <fidl_fuchsia_media::AudioStreamType as fidl::encoding::ValueTypeMarker>::borrow(&self.stream_type),
1013                ),
1014                encoder, offset, _depth
1015            )
1016        }
1017    }
1018    unsafe impl<
1019        T0: fidl::encoding::Encode<
1020                fidl::encoding::HandleType<
1021                    fidl::Clock,
1022                    { fidl::ObjectType::CLOCK.into_raw() },
1023                    2147483648,
1024                >,
1025                fidl::encoding::DefaultFuchsiaResourceDialect,
1026            >,
1027        T1: fidl::encoding::Encode<
1028                fidl_fuchsia_media::AudioStreamType,
1029                fidl::encoding::DefaultFuchsiaResourceDialect,
1030            >,
1031    >
1032        fidl::encoding::Encode<
1033            FactoryCreateCapturerResponse,
1034            fidl::encoding::DefaultFuchsiaResourceDialect,
1035        > for (T0, T1)
1036    {
1037        #[inline]
1038        unsafe fn encode(
1039            self,
1040            encoder: &mut fidl::encoding::Encoder<
1041                '_,
1042                fidl::encoding::DefaultFuchsiaResourceDialect,
1043            >,
1044            offset: usize,
1045            depth: fidl::encoding::Depth,
1046        ) -> fidl::Result<()> {
1047            encoder.debug_check_bounds::<FactoryCreateCapturerResponse>(offset);
1048            // Zero out padding regions. There's no need to apply masks
1049            // because the unmasked parts will be overwritten by fields.
1050            // Write the fields.
1051            self.0.encode(encoder, offset + 0, depth)?;
1052            self.1.encode(encoder, offset + 4, depth)?;
1053            Ok(())
1054        }
1055    }
1056
1057    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1058        for FactoryCreateCapturerResponse
1059    {
1060        #[inline(always)]
1061        fn new_empty() -> Self {
1062            Self {
1063                reference_clock: fidl::new_empty!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
1064                stream_type: fidl::new_empty!(
1065                    fidl_fuchsia_media::AudioStreamType,
1066                    fidl::encoding::DefaultFuchsiaResourceDialect
1067                ),
1068            }
1069        }
1070
1071        #[inline]
1072        unsafe fn decode(
1073            &mut self,
1074            decoder: &mut fidl::encoding::Decoder<
1075                '_,
1076                fidl::encoding::DefaultFuchsiaResourceDialect,
1077            >,
1078            offset: usize,
1079            _depth: fidl::encoding::Depth,
1080        ) -> fidl::Result<()> {
1081            decoder.debug_check_bounds::<Self>(offset);
1082            // Verify that padding bytes are zero.
1083            fidl::decode!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.reference_clock, decoder, offset + 0, _depth)?;
1084            fidl::decode!(
1085                fidl_fuchsia_media::AudioStreamType,
1086                fidl::encoding::DefaultFuchsiaResourceDialect,
1087                &mut self.stream_type,
1088                decoder,
1089                offset + 4,
1090                _depth
1091            )?;
1092            Ok(())
1093        }
1094    }
1095
1096    impl fidl::encoding::ResourceTypeMarker for FactoryCreateRendererRequest {
1097        type Borrowed<'a> = &'a mut Self;
1098        fn take_or_borrow<'a>(
1099            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1100        ) -> Self::Borrowed<'a> {
1101            value
1102        }
1103    }
1104
1105    unsafe impl fidl::encoding::TypeMarker for FactoryCreateRendererRequest {
1106        type Owned = Self;
1107
1108        #[inline(always)]
1109        fn inline_align(_context: fidl::encoding::Context) -> usize {
1110            4
1111        }
1112
1113        #[inline(always)]
1114        fn inline_size(_context: fidl::encoding::Context) -> usize {
1115            4
1116        }
1117    }
1118
1119    unsafe impl
1120        fidl::encoding::Encode<
1121            FactoryCreateRendererRequest,
1122            fidl::encoding::DefaultFuchsiaResourceDialect,
1123        > for &mut FactoryCreateRendererRequest
1124    {
1125        #[inline]
1126        unsafe fn encode(
1127            self,
1128            encoder: &mut fidl::encoding::Encoder<
1129                '_,
1130                fidl::encoding::DefaultFuchsiaResourceDialect,
1131            >,
1132            offset: usize,
1133            _depth: fidl::encoding::Depth,
1134        ) -> fidl::Result<()> {
1135            encoder.debug_check_bounds::<FactoryCreateRendererRequest>(offset);
1136            // Delegate to tuple encoding.
1137            fidl::encoding::Encode::<
1138                FactoryCreateRendererRequest,
1139                fidl::encoding::DefaultFuchsiaResourceDialect,
1140            >::encode(
1141                (<fidl::encoding::Endpoint<
1142                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1143                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1144                    &mut self.renderer
1145                ),),
1146                encoder,
1147                offset,
1148                _depth,
1149            )
1150        }
1151    }
1152    unsafe impl<
1153        T0: fidl::encoding::Encode<
1154                fidl::encoding::Endpoint<
1155                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1156                >,
1157                fidl::encoding::DefaultFuchsiaResourceDialect,
1158            >,
1159    >
1160        fidl::encoding::Encode<
1161            FactoryCreateRendererRequest,
1162            fidl::encoding::DefaultFuchsiaResourceDialect,
1163        > for (T0,)
1164    {
1165        #[inline]
1166        unsafe fn encode(
1167            self,
1168            encoder: &mut fidl::encoding::Encoder<
1169                '_,
1170                fidl::encoding::DefaultFuchsiaResourceDialect,
1171            >,
1172            offset: usize,
1173            depth: fidl::encoding::Depth,
1174        ) -> fidl::Result<()> {
1175            encoder.debug_check_bounds::<FactoryCreateRendererRequest>(offset);
1176            // Zero out padding regions. There's no need to apply masks
1177            // because the unmasked parts will be overwritten by fields.
1178            // Write the fields.
1179            self.0.encode(encoder, offset + 0, depth)?;
1180            Ok(())
1181        }
1182    }
1183
1184    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1185        for FactoryCreateRendererRequest
1186    {
1187        #[inline(always)]
1188        fn new_empty() -> Self {
1189            Self {
1190                renderer: fidl::new_empty!(
1191                    fidl::encoding::Endpoint<
1192                        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1193                    >,
1194                    fidl::encoding::DefaultFuchsiaResourceDialect
1195                ),
1196            }
1197        }
1198
1199        #[inline]
1200        unsafe fn decode(
1201            &mut self,
1202            decoder: &mut fidl::encoding::Decoder<
1203                '_,
1204                fidl::encoding::DefaultFuchsiaResourceDialect,
1205            >,
1206            offset: usize,
1207            _depth: fidl::encoding::Depth,
1208        ) -> fidl::Result<()> {
1209            decoder.debug_check_bounds::<Self>(offset);
1210            // Verify that padding bytes are zero.
1211            fidl::decode!(
1212                fidl::encoding::Endpoint<
1213                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1214                >,
1215                fidl::encoding::DefaultFuchsiaResourceDialect,
1216                &mut self.renderer,
1217                decoder,
1218                offset + 0,
1219                _depth
1220            )?;
1221            Ok(())
1222        }
1223    }
1224
1225    impl fidl::encoding::ResourceTypeMarker for FactoryCreateRendererResponse {
1226        type Borrowed<'a> = &'a mut Self;
1227        fn take_or_borrow<'a>(
1228            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1229        ) -> Self::Borrowed<'a> {
1230            value
1231        }
1232    }
1233
1234    unsafe impl fidl::encoding::TypeMarker for FactoryCreateRendererResponse {
1235        type Owned = Self;
1236
1237        #[inline(always)]
1238        fn inline_align(_context: fidl::encoding::Context) -> usize {
1239            4
1240        }
1241
1242        #[inline(always)]
1243        fn inline_size(_context: fidl::encoding::Context) -> usize {
1244            16
1245        }
1246    }
1247
1248    unsafe impl
1249        fidl::encoding::Encode<
1250            FactoryCreateRendererResponse,
1251            fidl::encoding::DefaultFuchsiaResourceDialect,
1252        > for &mut FactoryCreateRendererResponse
1253    {
1254        #[inline]
1255        unsafe fn encode(
1256            self,
1257            encoder: &mut fidl::encoding::Encoder<
1258                '_,
1259                fidl::encoding::DefaultFuchsiaResourceDialect,
1260            >,
1261            offset: usize,
1262            _depth: fidl::encoding::Depth,
1263        ) -> fidl::Result<()> {
1264            encoder.debug_check_bounds::<FactoryCreateRendererResponse>(offset);
1265            // Delegate to tuple encoding.
1266            fidl::encoding::Encode::<FactoryCreateRendererResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
1267                (
1268                    <fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.reference_clock),
1269                    <fidl_fuchsia_media::AudioStreamType as fidl::encoding::ValueTypeMarker>::borrow(&self.stream_type),
1270                ),
1271                encoder, offset, _depth
1272            )
1273        }
1274    }
1275    unsafe impl<
1276        T0: fidl::encoding::Encode<
1277                fidl::encoding::HandleType<
1278                    fidl::Clock,
1279                    { fidl::ObjectType::CLOCK.into_raw() },
1280                    2147483648,
1281                >,
1282                fidl::encoding::DefaultFuchsiaResourceDialect,
1283            >,
1284        T1: fidl::encoding::Encode<
1285                fidl_fuchsia_media::AudioStreamType,
1286                fidl::encoding::DefaultFuchsiaResourceDialect,
1287            >,
1288    >
1289        fidl::encoding::Encode<
1290            FactoryCreateRendererResponse,
1291            fidl::encoding::DefaultFuchsiaResourceDialect,
1292        > for (T0, T1)
1293    {
1294        #[inline]
1295        unsafe fn encode(
1296            self,
1297            encoder: &mut fidl::encoding::Encoder<
1298                '_,
1299                fidl::encoding::DefaultFuchsiaResourceDialect,
1300            >,
1301            offset: usize,
1302            depth: fidl::encoding::Depth,
1303        ) -> fidl::Result<()> {
1304            encoder.debug_check_bounds::<FactoryCreateRendererResponse>(offset);
1305            // Zero out padding regions. There's no need to apply masks
1306            // because the unmasked parts will be overwritten by fields.
1307            // Write the fields.
1308            self.0.encode(encoder, offset + 0, depth)?;
1309            self.1.encode(encoder, offset + 4, depth)?;
1310            Ok(())
1311        }
1312    }
1313
1314    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1315        for FactoryCreateRendererResponse
1316    {
1317        #[inline(always)]
1318        fn new_empty() -> Self {
1319            Self {
1320                reference_clock: fidl::new_empty!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
1321                stream_type: fidl::new_empty!(
1322                    fidl_fuchsia_media::AudioStreamType,
1323                    fidl::encoding::DefaultFuchsiaResourceDialect
1324                ),
1325            }
1326        }
1327
1328        #[inline]
1329        unsafe fn decode(
1330            &mut self,
1331            decoder: &mut fidl::encoding::Decoder<
1332                '_,
1333                fidl::encoding::DefaultFuchsiaResourceDialect,
1334            >,
1335            offset: usize,
1336            _depth: fidl::encoding::Depth,
1337        ) -> fidl::Result<()> {
1338            decoder.debug_check_bounds::<Self>(offset);
1339            // Verify that padding bytes are zero.
1340            fidl::decode!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.reference_clock, decoder, offset + 0, _depth)?;
1341            fidl::decode!(
1342                fidl_fuchsia_media::AudioStreamType,
1343                fidl::encoding::DefaultFuchsiaResourceDialect,
1344                &mut self.stream_type,
1345                decoder,
1346                offset + 4,
1347                _depth
1348            )?;
1349            Ok(())
1350        }
1351    }
1352}