xref: /aosp_15_r20/external/crosvm/metrics_events/src/sys/windows.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
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