|  | // 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. |