some AudioSpec usage cleanups and minor improvements
This commit is contained in:
parent
e4a90e7f10
commit
9c35d670fa
|
@ -1,6 +1,6 @@
|
|||
use std::ops::{Index, IndexMut};
|
||||
|
||||
use sdl2::audio::AudioCallback;
|
||||
use sdl2::audio::{AudioCallback, AudioFormat};
|
||||
use thiserror::Error;
|
||||
|
||||
pub use self::wav::*;
|
||||
|
@ -15,13 +15,24 @@ pub const AUDIO_FREQUENCY_11KHZ: u32 = 11025;
|
|||
|
||||
pub const SILENCE: u8 = sdl2::audio::AudioFormatNum::SILENCE;
|
||||
|
||||
pub const TARGET_AUDIO_SPEC: AudioSpec = AudioSpec { frequency: AUDIO_FREQUENCY_22KHZ, channels: 1, format: AudioFormat::U8 };
|
||||
|
||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct AudioSpec {
|
||||
pub frequency: u32,
|
||||
pub channels: u8,
|
||||
frequency: u32,
|
||||
channels: u8,
|
||||
format: AudioFormat,
|
||||
}
|
||||
|
||||
impl AudioSpec {
|
||||
pub fn new(frequency: u32, channels: u8, format: AudioFormat) -> Self {
|
||||
AudioSpec {
|
||||
frequency,
|
||||
channels,
|
||||
format
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn frequency(&self) -> u32 {
|
||||
self.frequency
|
||||
|
@ -31,6 +42,11 @@ impl AudioSpec {
|
|||
pub fn channels(&self) -> u8 {
|
||||
self.channels
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn format(&self) -> AudioFormat {
|
||||
self.format
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
|
@ -264,12 +280,9 @@ pub struct AudioBuffer {
|
|||
}
|
||||
|
||||
impl AudioBuffer {
|
||||
pub fn new(frequency: u32, channels: u8) -> Self {
|
||||
pub fn new(spec: AudioSpec) -> Self {
|
||||
AudioBuffer {
|
||||
spec: AudioSpec {
|
||||
frequency,
|
||||
channels,
|
||||
},
|
||||
spec,
|
||||
data: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
@ -279,22 +292,21 @@ impl AudioBuffer {
|
|||
&self.spec
|
||||
}
|
||||
|
||||
pub fn convert(self, frequency: u32, channels: u8) -> Result<Self, AudioBufferError> {
|
||||
if self.spec.frequency == frequency && self.spec.channels == channels {
|
||||
pub fn convert(self, to_spec: &AudioSpec) -> Result<Self, AudioBufferError> {
|
||||
if self.spec == *to_spec {
|
||||
Ok(self)
|
||||
} else {
|
||||
use sdl2::audio::AudioFormat;
|
||||
let converter = sdl2::audio::AudioCVT::new(
|
||||
AudioFormat::U8,
|
||||
self.spec.channels,
|
||||
self.spec.frequency as i32,
|
||||
AudioFormat::U8,
|
||||
channels,
|
||||
frequency as i32,
|
||||
self.spec.format(),
|
||||
self.spec.channels(),
|
||||
self.spec.frequency() as i32,
|
||||
to_spec.format(),
|
||||
to_spec.channels(),
|
||||
to_spec.frequency() as i32,
|
||||
);
|
||||
match converter {
|
||||
Ok(converter) => {
|
||||
let mut result = AudioBuffer::new(frequency, channels);
|
||||
let mut result = AudioBuffer::new(*to_spec);
|
||||
result.data = converter.convert(self.data);
|
||||
Ok(result)
|
||||
}
|
||||
|
|
|
@ -4,9 +4,10 @@ use std::io::{BufReader, Read, Seek, SeekFrom, Write};
|
|||
use std::path::Path;
|
||||
|
||||
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
||||
use sdl2::audio::AudioFormat;
|
||||
use thiserror::Error;
|
||||
|
||||
use crate::audio::AudioBuffer;
|
||||
use crate::audio::{AudioBuffer, AudioSpec};
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
pub enum WavError {
|
||||
|
@ -234,7 +235,8 @@ impl AudioBuffer {
|
|||
let mut audio_buffer;
|
||||
|
||||
if let Some(format) = format {
|
||||
audio_buffer = AudioBuffer::new(format.frequency, format.channels as u8);
|
||||
let spec = AudioSpec::new(format.frequency, format.channels as u8, AudioFormat::U8);
|
||||
audio_buffer = AudioBuffer::new(spec);
|
||||
} else {
|
||||
return Err(WavError::BadFile(String::from("No 'fmt ' chunk was found")));
|
||||
}
|
||||
|
|
|
@ -243,17 +243,13 @@ impl SystemBuilder {
|
|||
};
|
||||
|
||||
let audio_spec = AudioSpecDesired {
|
||||
freq: Some(AUDIO_FREQUENCY_22KHZ as i32),
|
||||
channels: Some(1),
|
||||
freq: Some(TARGET_AUDIO_SPEC.frequency() as i32),
|
||||
channels: Some(TARGET_AUDIO_SPEC.channels()),
|
||||
samples: None,
|
||||
};
|
||||
|
||||
let audio = match sdl_audio_subsystem.open_playback(None, &audio_spec, |spec| {
|
||||
let our_spec = AudioSpec {
|
||||
frequency: spec.freq as u32,
|
||||
channels: spec.channels,
|
||||
};
|
||||
|
||||
let our_spec = AudioSpec::new(spec.freq as u32, spec.channels, spec.format);
|
||||
AudioDevice::new(our_spec)
|
||||
}) {
|
||||
Ok(audio_device) => audio_device,
|
||||
|
|
Loading…
Reference in a new issue