| // Copyright 2021 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.mediastreams; | 
 |  | 
 | /// Describes a format used for audio elementary streams without | 
 | /// reference to compression. Where compression is supported, this | 
 | /// type should be combined with a `Compression` struct. | 
 | type AudioFormat = struct { | 
 |     /// The type of individual samples. | 
 |     sample_format AudioSampleFormat; | 
 |  | 
 |     /// The number of samples per frame. | 
 |     channel_count uint32; | 
 |  | 
 |     /// The number of frames per second. | 
 |     frames_per_second uint32; | 
 |  | 
 |     /// The spatial assignment of each channel. | 
 |     channel_layout AudioChannelLayout; | 
 |  | 
 |     // TODO: Maybe add bytes_per_frame for convenience. It’s | 
 |     // a function of sample_format and channel_count. | 
 | }; | 
 |  | 
 | /// Expresses the format of individual audio samples. | 
 | type AudioSampleFormat = strict enum { | 
 |     UNSIGNED_8 = 1; | 
 |     SIGNED_16 = 2; | 
 |     SIGNED_24_IN_32 = 3; | 
 |     SIGNED_32 = 4; | 
 |     FLOAT = 5; | 
 | }; | 
 |  | 
 | type AudioChannelLayout = strict union { | 
 |     1: placeholder uint8; | 
 | }; | 
 |  | 
 | // TODO: Define AudioChannelLayout | 
 | // There are essentially four ways to do this: | 
 | // 1) an enum of layouts, which restricts layouts to those represented | 
 | //    in the enum, | 
 | // 2) a ‘bits’ type of individual channel assignments, which allows | 
 | //    any combination of the represented channel assignments but | 
 | //    restricts their permutation, | 
 | // 3) a vector of enum values of individual channel assignments, which | 
 | //    allows any permutation of the represented channel assignments, | 
 | //    or | 
 | // 4) a collection of fold-down tables that indicate how the channels | 
 | //    should be mixed to produce other channel configurations. | 
 | // These are listed in increasing order of expressiveness and | 
 | // decreasing order of ergonomics. We need to decide which | 
 | // representation(s) we want to support. |