1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2024 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize; 6*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize; 7*bb4ee6a4SAndroid Build Coastguard Worker 8*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Debug, Serialize, Deserialize, Default)] 9*bb4ee6a4SAndroid Build Coastguard Worker pub struct WaveFormatDetails { 10*bb4ee6a4SAndroid Build Coastguard Worker // Format requested by WASAPI `GetMixFormat` system call. 11*bb4ee6a4SAndroid Build Coastguard Worker pub requested: Option<WaveFormat>, 12*bb4ee6a4SAndroid Build Coastguard Worker // Originally the requested wave format that's modified by the emulator. Only 13*bb4ee6a4SAndroid Build Coastguard Worker // populated if the emulator decides the requested wave format should not be 14*bb4ee6a4SAndroid Build Coastguard Worker // used. 15*bb4ee6a4SAndroid Build Coastguard Worker pub modified: Option<WaveFormat>, 16*bb4ee6a4SAndroid Build Coastguard Worker // Format that is valid and closest matching to the modified format, if the 17*bb4ee6a4SAndroid Build Coastguard Worker // modified was rejected. Should only be populated if modified is also 18*bb4ee6a4SAndroid Build Coastguard Worker // non-null and was rejected by WASAPI `IsFormatSupported` system call. 19*bb4ee6a4SAndroid Build Coastguard Worker pub closest_matched: Option<WaveFormat>, 20*bb4ee6a4SAndroid Build Coastguard Worker } 21*bb4ee6a4SAndroid Build Coastguard Worker 22*bb4ee6a4SAndroid Build Coastguard Worker // Defines the format of waveformat audio data. This information is used by 23*bb4ee6a4SAndroid Build Coastguard Worker // WASAPI to determine how to process the audio playback data coming from the 24*bb4ee6a4SAndroid Build Coastguard Worker // emulator. 25*bb4ee6a4SAndroid Build Coastguard Worker // 26*bb4ee6a4SAndroid Build Coastguard Worker // The fields in the structure come from WAVEFORMATEXTENSIBLE of win32 api. 27*bb4ee6a4SAndroid Build Coastguard Worker // https://docs.microsoft.com/en-us/windows/win32/api/mmreg/ns-mmreg-waveformatextensible 28*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] 29*bb4ee6a4SAndroid Build Coastguard Worker pub struct WaveFormat { 30*bb4ee6a4SAndroid Build Coastguard Worker // Ex. 65534 (Maps to WAVE_FORMAT_EXTENSIBLE) 31*bb4ee6a4SAndroid Build Coastguard Worker pub format_tag: i32, 32*bb4ee6a4SAndroid Build Coastguard Worker // Number of channels. 33*bb4ee6a4SAndroid Build Coastguard Worker pub channels: i32, 34*bb4ee6a4SAndroid Build Coastguard Worker // Sample rate in Hz. Ex: 48000 35*bb4ee6a4SAndroid Build Coastguard Worker pub samples_per_sec: i32, 36*bb4ee6a4SAndroid Build Coastguard Worker // Required average data-transfer rate for the format tag. Usually this will 37*bb4ee6a4SAndroid Build Coastguard Worker // be samples_per_sec * block_align, since the format tag is usually 38*bb4ee6a4SAndroid Build Coastguard Worker // WAVE_FORMAT_IEEE_FLOAT or it's extensible and SubFormat is 39*bb4ee6a4SAndroid Build Coastguard Worker // KSDATAFORMAT_SUBTYPE_IEEE_FLOAT. 40*bb4ee6a4SAndroid Build Coastguard Worker pub avg_bytes_per_sec: i32, 41*bb4ee6a4SAndroid Build Coastguard Worker // Minimum atomic unit of data based on the format_tag. Usually this will 42*bb4ee6a4SAndroid Build Coastguard Worker // just be bits_per_samples * channels. 43*bb4ee6a4SAndroid Build Coastguard Worker pub block_align: i32, 44*bb4ee6a4SAndroid Build Coastguard Worker // Bits used per sample. Must be a multiple of 8. 45*bb4ee6a4SAndroid Build Coastguard Worker pub bits_per_sample: i32, 46*bb4ee6a4SAndroid Build Coastguard Worker // Size in bytes of extra information appended to WAVEFORMATEX struct. 47*bb4ee6a4SAndroid Build Coastguard Worker pub size_bytes: i32, 48*bb4ee6a4SAndroid Build Coastguard Worker 49*bb4ee6a4SAndroid Build Coastguard Worker // The next fields are part of the WAVEFORMATEXTENSIBLE struct. They will only 50*bb4ee6a4SAndroid Build Coastguard Worker // be non-null if format_tag is WAVE_FORMAT_EXTENSIBLE. 51*bb4ee6a4SAndroid Build Coastguard Worker 52*bb4ee6a4SAndroid Build Coastguard Worker // Bit depth. Can be any value. Ex. bits_per_sample is 24, 53*bb4ee6a4SAndroid Build Coastguard Worker // but samples is 20. Note: This value is a union, so it could mean something 54*bb4ee6a4SAndroid Build Coastguard Worker // slightly different, but most likely won't. Refer to doc for more info. 55*bb4ee6a4SAndroid Build Coastguard Worker pub samples: Option<i32>, 56*bb4ee6a4SAndroid Build Coastguard Worker // Bitmask mapping channels in stream to speaker positions. 57*bb4ee6a4SAndroid Build Coastguard Worker // Ex. 3 ( SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT ) 58*bb4ee6a4SAndroid Build Coastguard Worker pub channel_mask: Option<i64>, 59*bb4ee6a4SAndroid Build Coastguard Worker // Similar to format_tag, but for WAVEFORMATEXTENSIBLE structs. 60*bb4ee6a4SAndroid Build Coastguard Worker pub sub_format: Option<WaveFormatSubFormat>, 61*bb4ee6a4SAndroid Build Coastguard Worker } 62*bb4ee6a4SAndroid Build Coastguard Worker 63*bb4ee6a4SAndroid Build Coastguard Worker // Subformat GUID mapping: 64*bb4ee6a4SAndroid Build Coastguard Worker // https://github.com/retep998/winapi-rs/blob/2f76bdea3a79817ccfab496fbd1786d5a697387b/src/shared/ksmedia.rs 65*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)] 66*bb4ee6a4SAndroid Build Coastguard Worker pub enum WaveFormatSubFormat { 67*bb4ee6a4SAndroid Build Coastguard Worker Invalid, 68*bb4ee6a4SAndroid Build Coastguard Worker Analog, 69*bb4ee6a4SAndroid Build Coastguard Worker Pcm, 70*bb4ee6a4SAndroid Build Coastguard Worker IeeeFloat, 71*bb4ee6a4SAndroid Build Coastguard Worker Drm, 72*bb4ee6a4SAndroid Build Coastguard Worker ALaw, 73*bb4ee6a4SAndroid Build Coastguard Worker MuLaw, 74*bb4ee6a4SAndroid Build Coastguard Worker Adpcm, 75*bb4ee6a4SAndroid Build Coastguard Worker Mpeg, 76*bb4ee6a4SAndroid Build Coastguard Worker } 77