| // Copyright 2022 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| library fuchsia.audio.mixer; |
| |
| using fuchsia.audio; |
| using fuchsia.audio.effects; |
| using fuchsia.media2; |
| using fuchsia.mediastreams; |
| using zx; |
| |
| /// A Producer node can pull from a StreamSink or a RingBuffer. |
| type ProducerDataSource = flexible resource union { |
| 1: stream_sink StreamSinkProducer; |
| 2: ring_buffer fuchsia.audio.RingBuffer; |
| }; |
| |
| /// A Consumer node can write to a StreamSink or a RingBuffer. |
| type ConsumerDataSource = flexible resource union { |
| 1: stream_sink StreamSinkConsumer; |
| 2: ring_buffer fuchsia.audio.RingBuffer; |
| }; |
| |
| /// A producer driven by a [`fuchsia.media2/StreamSink`]. |
| type StreamSinkProducer = resource table { |
| /// Channel to receive packets. |
| /// |
| /// Required. |
| 1: stream_sink server_end:fuchsia.media2.StreamSink; |
| |
| /// Encoding of this audio stream. |
| /// |
| /// Required. |
| 2: format fuchsia.mediastreams.AudioFormat; |
| |
| /// Clock for this node's output stream. The clock must be |
| /// ZX_CLOCK_OPT_MONOTONIC and ZX_CLOCK_OPT_CONTINUOUS with ZX_RIGHT_READ. |
| /// See "Clocks" under the description for [`Graph`]. |
| /// |
| /// Required. |
| 3: reference_clock zx.handle:CLOCK; |
| }; |
| |
| /// A consumer driven by a [`fuchsia.media2/StreamSink`]. |
| type StreamSinkConsumer = resource table { |
| /// Channel to send packets. |
| /// |
| /// Required. |
| 1: stream_sink client_end:fuchsia.media2.StreamSink; |
| |
| /// Encoding of this audio stream. |
| /// |
| /// Required. |
| 2: format fuchsia.mediastreams.AudioFormat; |
| |
| /// Clock for this node's input stream. The clock must be |
| /// ZX_CLOCK_OPT_MONOTONIC and ZX_CLOCK_OPT_CONTINUOUS with ZX_RIGHT_READ. |
| /// See "Clocks" under the description for [`Graph`]. |
| /// |
| /// Required. |
| 3: reference_clock zx.handle:CLOCK; |
| }; |
| |
| /// Return value for CreateCustom. |
| type CustomNodeProperties = resource table { |
| /// IDs for each input node. See comments at [`Graph.CreateCustom`]. |
| /// |
| /// Required. |
| 1: input_ids vector<NodeId>:fuchsia.audio.effects.MAX_INPUT_STREAMS; |
| |
| /// IDs for each output node. See comments at [`Graph.CreateCustom`]. |
| /// |
| /// Required. |
| 2: output_ids vector<NodeId>:fuchsia.audio.effects.MAX_OUTPUT_STREAMS; |
| }; |
| |
| /// Options for consumer nodes, including hidden consumer nodes within Splitter |
| /// and Custom nodes. |
| type ConsumerOptions = resource table { |
| /// The Consumer's mix job should execute on this thread. |
| /// |
| /// Required. |
| 1: thread ThreadId; |
| |
| /// Each mix job should consume one `period` worth of audio data each `period`. |
| /// |
| /// Required. |
| 2: period zx.duration; |
| }; |
| |
| /// Every node is part of an output pipeline or an input pipeline. |
| /// |
| /// Output pipelines, also known as "render" pipelines, produce audio that is |
| /// written to an output device, usually some kind of speaker. Output pipelines |
| /// operate on audio that should be rendered to an output device at some time |
| /// in the future. |
| /// |
| /// Input pipelines, also known as "capture" pipelines, consume audio that is |
| /// read from an input device, usually some kind of microphone. Input pipelines |
| /// operate on audio that was captured from an input device at some time in the |
| /// past. |
| /// |
| /// Input pipelines can read from output pipelines. This is commonly known as a |
| /// "loopback" capture. |
| /// |
| /// Input pipelines cannot write to output pipelines. This is not allowed |
| /// because it creates a timestamp paradox: When an input pipeline reads a |
| /// frame, it assigns the frame timestamp `T`, which represents the time at |
| /// which the frame was captured from an input device. Timestamp `T` occurred in |
| /// the past. When we forward that frame to an output pipeline, the frame will |
| /// underflow because time `T` is in the past. It can sometimes be useful to |
| /// connect pipelines in this way, but this must be done by the client, who is |
| /// responsible for re-timstamping captured frames in an appropriate way before |
| /// forwarding those frames to an output pipeline. |
| type PipelineDirection = strict enum { |
| OUTPUT = 1; |
| INPUT = 2; |
| }; |