sapi_lite/audio/
format.rs

1use windows as Windows;
2use Windows::Win32::Media::Audio::{WAVEFORMATEX, WAVE_FORMAT_PCM};
3
4/// Sample rate, in samples per second, at which to play or record.
5#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
6#[allow(missing_docs)]
7pub enum SampleRate {
8    Hz8000 = 8000,
9    Hz11025 = 11025,
10    Hz12000 = 12000,
11    Hz16000 = 16000,
12    Hz22050 = 22050,
13    Hz24000 = 24000,
14    Hz32000 = 32000,
15    Hz44100 = 44100,
16    Hz48000 = 48000,
17}
18
19/// How many bits each sample should have.
20#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
21#[allow(missing_docs)]
22pub enum BitRate {
23    Bits8 = 8,
24    Bits16 = 16,
25}
26
27/// Number of audio channels.
28#[derive(Debug, Hash, PartialEq, Eq, PartialOrd, Ord, Clone, Copy)]
29#[allow(missing_docs)]
30pub enum Channels {
31    Mono = 1,
32    Stereo = 2,
33}
34
35/// Specifies the format of the audio data in a stream.
36#[derive(Debug, Hash, PartialEq, Eq, Clone)]
37pub struct AudioFormat {
38    /// Sample rate at which to play or record.
39    pub sample_rate: SampleRate,
40    /// How many bits each sample should have.
41    pub bit_rate: BitRate,
42    /// Number of channels.
43    pub channels: Channels,
44}
45
46impl AudioFormat {
47    pub(super) fn to_sapi(&self) -> WAVEFORMATEX {
48        let block_align = (self.channels as u32) * (self.bit_rate as u32) / 8;
49        WAVEFORMATEX {
50            wFormatTag: WAVE_FORMAT_PCM as _,
51            nChannels: self.channels as u16,
52            nSamplesPerSec: self.sample_rate as u32,
53            nAvgBytesPerSec: (self.sample_rate as u32) * block_align,
54            nBlockAlign: block_align as u16,
55            wBitsPerSample: self.bit_rate as u16,
56            cbSize: 0,
57        }
58    }
59}