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 fidl::endpoints::ControlHandle for FactoryControlHandle {
652    fn shutdown(&self) {
653        self.inner.shutdown()
654    }
655
656    fn shutdown_with_epitaph(&self, status: zx_status::Status) {
657        self.inner.shutdown_with_epitaph(status)
658    }
659
660    fn is_closed(&self) -> bool {
661        self.inner.channel().is_closed()
662    }
663    fn on_closed(&self) -> fidl::OnSignalsRef<'_> {
664        self.inner.channel().on_closed()
665    }
666
667    #[cfg(target_os = "fuchsia")]
668    fn signal_peer(
669        &self,
670        clear_mask: zx::Signals,
671        set_mask: zx::Signals,
672    ) -> Result<(), zx_status::Status> {
673        use fidl::Peered;
674        self.inner.channel().signal_peer(clear_mask, set_mask)
675    }
676}
677
678impl FactoryControlHandle {}
679
680#[must_use = "FIDL methods require a response to be sent"]
681#[derive(Debug)]
682pub struct FactoryCreateCapturerResponder {
683    control_handle: std::mem::ManuallyDrop<FactoryControlHandle>,
684    tx_id: u32,
685}
686
687/// Set the the channel to be shutdown (see [`FactoryControlHandle::shutdown`])
688/// if the responder is dropped without sending a response, so that the client
689/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
690impl std::ops::Drop for FactoryCreateCapturerResponder {
691    fn drop(&mut self) {
692        self.control_handle.shutdown();
693        // Safety: drops once, never accessed again
694        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
695    }
696}
697
698impl fidl::endpoints::Responder for FactoryCreateCapturerResponder {
699    type ControlHandle = FactoryControlHandle;
700
701    fn control_handle(&self) -> &FactoryControlHandle {
702        &self.control_handle
703    }
704
705    fn drop_without_shutdown(mut self) {
706        // Safety: drops once, never accessed again due to mem::forget
707        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
708        // Prevent Drop from running (which would shut down the channel)
709        std::mem::forget(self);
710    }
711}
712
713impl FactoryCreateCapturerResponder {
714    /// Sends a response to the FIDL transaction.
715    ///
716    /// Sets the channel to shutdown if an error occurs.
717    pub fn send(
718        self,
719        mut reference_clock: fidl::Clock,
720        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
721    ) -> Result<(), fidl::Error> {
722        let _result = self.send_raw(reference_clock, stream_type);
723        if _result.is_err() {
724            self.control_handle.shutdown();
725        }
726        self.drop_without_shutdown();
727        _result
728    }
729
730    /// Similar to "send" but does not shutdown the channel if an error occurs.
731    pub fn send_no_shutdown_on_err(
732        self,
733        mut reference_clock: fidl::Clock,
734        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
735    ) -> Result<(), fidl::Error> {
736        let _result = self.send_raw(reference_clock, stream_type);
737        self.drop_without_shutdown();
738        _result
739    }
740
741    fn send_raw(
742        &self,
743        mut reference_clock: fidl::Clock,
744        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
745    ) -> Result<(), fidl::Error> {
746        self.control_handle.inner.send::<FactoryCreateCapturerResponse>(
747            (reference_clock, stream_type),
748            self.tx_id,
749            0xe8b6e0e27f02115,
750            fidl::encoding::DynamicFlags::empty(),
751        )
752    }
753}
754
755#[must_use = "FIDL methods require a response to be sent"]
756#[derive(Debug)]
757pub struct FactoryCreateRendererResponder {
758    control_handle: std::mem::ManuallyDrop<FactoryControlHandle>,
759    tx_id: u32,
760}
761
762/// Set the the channel to be shutdown (see [`FactoryControlHandle::shutdown`])
763/// if the responder is dropped without sending a response, so that the client
764/// doesn't hang. To prevent this behavior, call `drop_without_shutdown`.
765impl std::ops::Drop for FactoryCreateRendererResponder {
766    fn drop(&mut self) {
767        self.control_handle.shutdown();
768        // Safety: drops once, never accessed again
769        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
770    }
771}
772
773impl fidl::endpoints::Responder for FactoryCreateRendererResponder {
774    type ControlHandle = FactoryControlHandle;
775
776    fn control_handle(&self) -> &FactoryControlHandle {
777        &self.control_handle
778    }
779
780    fn drop_without_shutdown(mut self) {
781        // Safety: drops once, never accessed again due to mem::forget
782        unsafe { std::mem::ManuallyDrop::drop(&mut self.control_handle) };
783        // Prevent Drop from running (which would shut down the channel)
784        std::mem::forget(self);
785    }
786}
787
788impl FactoryCreateRendererResponder {
789    /// Sends a response to the FIDL transaction.
790    ///
791    /// Sets the channel to shutdown if an error occurs.
792    pub fn send(
793        self,
794        mut reference_clock: fidl::Clock,
795        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
796    ) -> Result<(), fidl::Error> {
797        let _result = self.send_raw(reference_clock, stream_type);
798        if _result.is_err() {
799            self.control_handle.shutdown();
800        }
801        self.drop_without_shutdown();
802        _result
803    }
804
805    /// Similar to "send" but does not shutdown the channel if an error occurs.
806    pub fn send_no_shutdown_on_err(
807        self,
808        mut reference_clock: fidl::Clock,
809        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
810    ) -> Result<(), fidl::Error> {
811        let _result = self.send_raw(reference_clock, stream_type);
812        self.drop_without_shutdown();
813        _result
814    }
815
816    fn send_raw(
817        &self,
818        mut reference_clock: fidl::Clock,
819        mut stream_type: &fidl_fuchsia_media::AudioStreamType,
820    ) -> Result<(), fidl::Error> {
821        self.control_handle.inner.send::<FactoryCreateRendererResponse>(
822            (reference_clock, stream_type),
823            self.tx_id,
824            0x3ce8fb1897ec7932,
825            fidl::encoding::DynamicFlags::empty(),
826        )
827    }
828}
829
830mod internal {
831    use super::*;
832
833    impl fidl::encoding::ResourceTypeMarker for FactoryCreateCapturerRequest {
834        type Borrowed<'a> = &'a mut Self;
835        fn take_or_borrow<'a>(
836            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
837        ) -> Self::Borrowed<'a> {
838            value
839        }
840    }
841
842    unsafe impl fidl::encoding::TypeMarker for FactoryCreateCapturerRequest {
843        type Owned = Self;
844
845        #[inline(always)]
846        fn inline_align(_context: fidl::encoding::Context) -> usize {
847            4
848        }
849
850        #[inline(always)]
851        fn inline_size(_context: fidl::encoding::Context) -> usize {
852            4
853        }
854    }
855
856    unsafe impl
857        fidl::encoding::Encode<
858            FactoryCreateCapturerRequest,
859            fidl::encoding::DefaultFuchsiaResourceDialect,
860        > for &mut FactoryCreateCapturerRequest
861    {
862        #[inline]
863        unsafe fn encode(
864            self,
865            encoder: &mut fidl::encoding::Encoder<
866                '_,
867                fidl::encoding::DefaultFuchsiaResourceDialect,
868            >,
869            offset: usize,
870            _depth: fidl::encoding::Depth,
871        ) -> fidl::Result<()> {
872            encoder.debug_check_bounds::<FactoryCreateCapturerRequest>(offset);
873            // Delegate to tuple encoding.
874            fidl::encoding::Encode::<
875                FactoryCreateCapturerRequest,
876                fidl::encoding::DefaultFuchsiaResourceDialect,
877            >::encode(
878                (<fidl::encoding::Endpoint<
879                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
880                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
881                    &mut self.request
882                ),),
883                encoder,
884                offset,
885                _depth,
886            )
887        }
888    }
889    unsafe impl<
890        T0: fidl::encoding::Encode<
891                fidl::encoding::Endpoint<
892                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
893                >,
894                fidl::encoding::DefaultFuchsiaResourceDialect,
895            >,
896    >
897        fidl::encoding::Encode<
898            FactoryCreateCapturerRequest,
899            fidl::encoding::DefaultFuchsiaResourceDialect,
900        > for (T0,)
901    {
902        #[inline]
903        unsafe fn encode(
904            self,
905            encoder: &mut fidl::encoding::Encoder<
906                '_,
907                fidl::encoding::DefaultFuchsiaResourceDialect,
908            >,
909            offset: usize,
910            depth: fidl::encoding::Depth,
911        ) -> fidl::Result<()> {
912            encoder.debug_check_bounds::<FactoryCreateCapturerRequest>(offset);
913            // Zero out padding regions. There's no need to apply masks
914            // because the unmasked parts will be overwritten by fields.
915            // Write the fields.
916            self.0.encode(encoder, offset + 0, depth)?;
917            Ok(())
918        }
919    }
920
921    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
922        for FactoryCreateCapturerRequest
923    {
924        #[inline(always)]
925        fn new_empty() -> Self {
926            Self {
927                request: fidl::new_empty!(
928                    fidl::encoding::Endpoint<
929                        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
930                    >,
931                    fidl::encoding::DefaultFuchsiaResourceDialect
932                ),
933            }
934        }
935
936        #[inline]
937        unsafe fn decode(
938            &mut self,
939            decoder: &mut fidl::encoding::Decoder<
940                '_,
941                fidl::encoding::DefaultFuchsiaResourceDialect,
942            >,
943            offset: usize,
944            _depth: fidl::encoding::Depth,
945        ) -> fidl::Result<()> {
946            decoder.debug_check_bounds::<Self>(offset);
947            // Verify that padding bytes are zero.
948            fidl::decode!(
949                fidl::encoding::Endpoint<
950                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioCapturerMarker>,
951                >,
952                fidl::encoding::DefaultFuchsiaResourceDialect,
953                &mut self.request,
954                decoder,
955                offset + 0,
956                _depth
957            )?;
958            Ok(())
959        }
960    }
961
962    impl fidl::encoding::ResourceTypeMarker for FactoryCreateCapturerResponse {
963        type Borrowed<'a> = &'a mut Self;
964        fn take_or_borrow<'a>(
965            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
966        ) -> Self::Borrowed<'a> {
967            value
968        }
969    }
970
971    unsafe impl fidl::encoding::TypeMarker for FactoryCreateCapturerResponse {
972        type Owned = Self;
973
974        #[inline(always)]
975        fn inline_align(_context: fidl::encoding::Context) -> usize {
976            4
977        }
978
979        #[inline(always)]
980        fn inline_size(_context: fidl::encoding::Context) -> usize {
981            16
982        }
983    }
984
985    unsafe impl
986        fidl::encoding::Encode<
987            FactoryCreateCapturerResponse,
988            fidl::encoding::DefaultFuchsiaResourceDialect,
989        > for &mut FactoryCreateCapturerResponse
990    {
991        #[inline]
992        unsafe fn encode(
993            self,
994            encoder: &mut fidl::encoding::Encoder<
995                '_,
996                fidl::encoding::DefaultFuchsiaResourceDialect,
997            >,
998            offset: usize,
999            _depth: fidl::encoding::Depth,
1000        ) -> fidl::Result<()> {
1001            encoder.debug_check_bounds::<FactoryCreateCapturerResponse>(offset);
1002            // Delegate to tuple encoding.
1003            fidl::encoding::Encode::<FactoryCreateCapturerResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
1004                (
1005                    <fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.reference_clock),
1006                    <fidl_fuchsia_media::AudioStreamType as fidl::encoding::ValueTypeMarker>::borrow(&self.stream_type),
1007                ),
1008                encoder, offset, _depth
1009            )
1010        }
1011    }
1012    unsafe impl<
1013        T0: fidl::encoding::Encode<
1014                fidl::encoding::HandleType<
1015                    fidl::Clock,
1016                    { fidl::ObjectType::CLOCK.into_raw() },
1017                    2147483648,
1018                >,
1019                fidl::encoding::DefaultFuchsiaResourceDialect,
1020            >,
1021        T1: fidl::encoding::Encode<
1022                fidl_fuchsia_media::AudioStreamType,
1023                fidl::encoding::DefaultFuchsiaResourceDialect,
1024            >,
1025    >
1026        fidl::encoding::Encode<
1027            FactoryCreateCapturerResponse,
1028            fidl::encoding::DefaultFuchsiaResourceDialect,
1029        > for (T0, T1)
1030    {
1031        #[inline]
1032        unsafe fn encode(
1033            self,
1034            encoder: &mut fidl::encoding::Encoder<
1035                '_,
1036                fidl::encoding::DefaultFuchsiaResourceDialect,
1037            >,
1038            offset: usize,
1039            depth: fidl::encoding::Depth,
1040        ) -> fidl::Result<()> {
1041            encoder.debug_check_bounds::<FactoryCreateCapturerResponse>(offset);
1042            // Zero out padding regions. There's no need to apply masks
1043            // because the unmasked parts will be overwritten by fields.
1044            // Write the fields.
1045            self.0.encode(encoder, offset + 0, depth)?;
1046            self.1.encode(encoder, offset + 4, depth)?;
1047            Ok(())
1048        }
1049    }
1050
1051    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1052        for FactoryCreateCapturerResponse
1053    {
1054        #[inline(always)]
1055        fn new_empty() -> Self {
1056            Self {
1057                reference_clock: fidl::new_empty!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
1058                stream_type: fidl::new_empty!(
1059                    fidl_fuchsia_media::AudioStreamType,
1060                    fidl::encoding::DefaultFuchsiaResourceDialect
1061                ),
1062            }
1063        }
1064
1065        #[inline]
1066        unsafe fn decode(
1067            &mut self,
1068            decoder: &mut fidl::encoding::Decoder<
1069                '_,
1070                fidl::encoding::DefaultFuchsiaResourceDialect,
1071            >,
1072            offset: usize,
1073            _depth: fidl::encoding::Depth,
1074        ) -> fidl::Result<()> {
1075            decoder.debug_check_bounds::<Self>(offset);
1076            // Verify that padding bytes are zero.
1077            fidl::decode!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.reference_clock, decoder, offset + 0, _depth)?;
1078            fidl::decode!(
1079                fidl_fuchsia_media::AudioStreamType,
1080                fidl::encoding::DefaultFuchsiaResourceDialect,
1081                &mut self.stream_type,
1082                decoder,
1083                offset + 4,
1084                _depth
1085            )?;
1086            Ok(())
1087        }
1088    }
1089
1090    impl fidl::encoding::ResourceTypeMarker for FactoryCreateRendererRequest {
1091        type Borrowed<'a> = &'a mut Self;
1092        fn take_or_borrow<'a>(
1093            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1094        ) -> Self::Borrowed<'a> {
1095            value
1096        }
1097    }
1098
1099    unsafe impl fidl::encoding::TypeMarker for FactoryCreateRendererRequest {
1100        type Owned = Self;
1101
1102        #[inline(always)]
1103        fn inline_align(_context: fidl::encoding::Context) -> usize {
1104            4
1105        }
1106
1107        #[inline(always)]
1108        fn inline_size(_context: fidl::encoding::Context) -> usize {
1109            4
1110        }
1111    }
1112
1113    unsafe impl
1114        fidl::encoding::Encode<
1115            FactoryCreateRendererRequest,
1116            fidl::encoding::DefaultFuchsiaResourceDialect,
1117        > for &mut FactoryCreateRendererRequest
1118    {
1119        #[inline]
1120        unsafe fn encode(
1121            self,
1122            encoder: &mut fidl::encoding::Encoder<
1123                '_,
1124                fidl::encoding::DefaultFuchsiaResourceDialect,
1125            >,
1126            offset: usize,
1127            _depth: fidl::encoding::Depth,
1128        ) -> fidl::Result<()> {
1129            encoder.debug_check_bounds::<FactoryCreateRendererRequest>(offset);
1130            // Delegate to tuple encoding.
1131            fidl::encoding::Encode::<
1132                FactoryCreateRendererRequest,
1133                fidl::encoding::DefaultFuchsiaResourceDialect,
1134            >::encode(
1135                (<fidl::encoding::Endpoint<
1136                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1137                > as fidl::encoding::ResourceTypeMarker>::take_or_borrow(
1138                    &mut self.renderer
1139                ),),
1140                encoder,
1141                offset,
1142                _depth,
1143            )
1144        }
1145    }
1146    unsafe impl<
1147        T0: fidl::encoding::Encode<
1148                fidl::encoding::Endpoint<
1149                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1150                >,
1151                fidl::encoding::DefaultFuchsiaResourceDialect,
1152            >,
1153    >
1154        fidl::encoding::Encode<
1155            FactoryCreateRendererRequest,
1156            fidl::encoding::DefaultFuchsiaResourceDialect,
1157        > for (T0,)
1158    {
1159        #[inline]
1160        unsafe fn encode(
1161            self,
1162            encoder: &mut fidl::encoding::Encoder<
1163                '_,
1164                fidl::encoding::DefaultFuchsiaResourceDialect,
1165            >,
1166            offset: usize,
1167            depth: fidl::encoding::Depth,
1168        ) -> fidl::Result<()> {
1169            encoder.debug_check_bounds::<FactoryCreateRendererRequest>(offset);
1170            // Zero out padding regions. There's no need to apply masks
1171            // because the unmasked parts will be overwritten by fields.
1172            // Write the fields.
1173            self.0.encode(encoder, offset + 0, depth)?;
1174            Ok(())
1175        }
1176    }
1177
1178    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1179        for FactoryCreateRendererRequest
1180    {
1181        #[inline(always)]
1182        fn new_empty() -> Self {
1183            Self {
1184                renderer: fidl::new_empty!(
1185                    fidl::encoding::Endpoint<
1186                        fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1187                    >,
1188                    fidl::encoding::DefaultFuchsiaResourceDialect
1189                ),
1190            }
1191        }
1192
1193        #[inline]
1194        unsafe fn decode(
1195            &mut self,
1196            decoder: &mut fidl::encoding::Decoder<
1197                '_,
1198                fidl::encoding::DefaultFuchsiaResourceDialect,
1199            >,
1200            offset: usize,
1201            _depth: fidl::encoding::Depth,
1202        ) -> fidl::Result<()> {
1203            decoder.debug_check_bounds::<Self>(offset);
1204            // Verify that padding bytes are zero.
1205            fidl::decode!(
1206                fidl::encoding::Endpoint<
1207                    fidl::endpoints::ServerEnd<fidl_fuchsia_media::AudioRendererMarker>,
1208                >,
1209                fidl::encoding::DefaultFuchsiaResourceDialect,
1210                &mut self.renderer,
1211                decoder,
1212                offset + 0,
1213                _depth
1214            )?;
1215            Ok(())
1216        }
1217    }
1218
1219    impl fidl::encoding::ResourceTypeMarker for FactoryCreateRendererResponse {
1220        type Borrowed<'a> = &'a mut Self;
1221        fn take_or_borrow<'a>(
1222            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
1223        ) -> Self::Borrowed<'a> {
1224            value
1225        }
1226    }
1227
1228    unsafe impl fidl::encoding::TypeMarker for FactoryCreateRendererResponse {
1229        type Owned = Self;
1230
1231        #[inline(always)]
1232        fn inline_align(_context: fidl::encoding::Context) -> usize {
1233            4
1234        }
1235
1236        #[inline(always)]
1237        fn inline_size(_context: fidl::encoding::Context) -> usize {
1238            16
1239        }
1240    }
1241
1242    unsafe impl
1243        fidl::encoding::Encode<
1244            FactoryCreateRendererResponse,
1245            fidl::encoding::DefaultFuchsiaResourceDialect,
1246        > for &mut FactoryCreateRendererResponse
1247    {
1248        #[inline]
1249        unsafe fn encode(
1250            self,
1251            encoder: &mut fidl::encoding::Encoder<
1252                '_,
1253                fidl::encoding::DefaultFuchsiaResourceDialect,
1254            >,
1255            offset: usize,
1256            _depth: fidl::encoding::Depth,
1257        ) -> fidl::Result<()> {
1258            encoder.debug_check_bounds::<FactoryCreateRendererResponse>(offset);
1259            // Delegate to tuple encoding.
1260            fidl::encoding::Encode::<FactoryCreateRendererResponse, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
1261                (
1262                    <fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.reference_clock),
1263                    <fidl_fuchsia_media::AudioStreamType as fidl::encoding::ValueTypeMarker>::borrow(&self.stream_type),
1264                ),
1265                encoder, offset, _depth
1266            )
1267        }
1268    }
1269    unsafe impl<
1270        T0: fidl::encoding::Encode<
1271                fidl::encoding::HandleType<
1272                    fidl::Clock,
1273                    { fidl::ObjectType::CLOCK.into_raw() },
1274                    2147483648,
1275                >,
1276                fidl::encoding::DefaultFuchsiaResourceDialect,
1277            >,
1278        T1: fidl::encoding::Encode<
1279                fidl_fuchsia_media::AudioStreamType,
1280                fidl::encoding::DefaultFuchsiaResourceDialect,
1281            >,
1282    >
1283        fidl::encoding::Encode<
1284            FactoryCreateRendererResponse,
1285            fidl::encoding::DefaultFuchsiaResourceDialect,
1286        > for (T0, T1)
1287    {
1288        #[inline]
1289        unsafe fn encode(
1290            self,
1291            encoder: &mut fidl::encoding::Encoder<
1292                '_,
1293                fidl::encoding::DefaultFuchsiaResourceDialect,
1294            >,
1295            offset: usize,
1296            depth: fidl::encoding::Depth,
1297        ) -> fidl::Result<()> {
1298            encoder.debug_check_bounds::<FactoryCreateRendererResponse>(offset);
1299            // Zero out padding regions. There's no need to apply masks
1300            // because the unmasked parts will be overwritten by fields.
1301            // Write the fields.
1302            self.0.encode(encoder, offset + 0, depth)?;
1303            self.1.encode(encoder, offset + 4, depth)?;
1304            Ok(())
1305        }
1306    }
1307
1308    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
1309        for FactoryCreateRendererResponse
1310    {
1311        #[inline(always)]
1312        fn new_empty() -> Self {
1313            Self {
1314                reference_clock: fidl::new_empty!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect),
1315                stream_type: fidl::new_empty!(
1316                    fidl_fuchsia_media::AudioStreamType,
1317                    fidl::encoding::DefaultFuchsiaResourceDialect
1318                ),
1319            }
1320        }
1321
1322        #[inline]
1323        unsafe fn decode(
1324            &mut self,
1325            decoder: &mut fidl::encoding::Decoder<
1326                '_,
1327                fidl::encoding::DefaultFuchsiaResourceDialect,
1328            >,
1329            offset: usize,
1330            _depth: fidl::encoding::Depth,
1331        ) -> fidl::Result<()> {
1332            decoder.debug_check_bounds::<Self>(offset);
1333            // Verify that padding bytes are zero.
1334            fidl::decode!(fidl::encoding::HandleType<fidl::Clock, { fidl::ObjectType::CLOCK.into_raw() }, 2147483648>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.reference_clock, decoder, offset + 0, _depth)?;
1335            fidl::decode!(
1336                fidl_fuchsia_media::AudioStreamType,
1337                fidl::encoding::DefaultFuchsiaResourceDialect,
1338                &mut self.stream_type,
1339                decoder,
1340                offset + 4,
1341                _depth
1342            )?;
1343            Ok(())
1344        }
1345    }
1346}