From 9c35d670faac28380752192d0f864ecea14b78b0 Mon Sep 17 00:00:00 2001 From: gered Date: Sun, 29 May 2022 11:19:57 -0400 Subject: [PATCH] some AudioSpec usage cleanups and minor improvements --- libretrogd/src/audio/mod.rs | 48 ++++++++++++++++++++++-------------- libretrogd/src/audio/wav.rs | 6 +++-- libretrogd/src/system/mod.rs | 10 +++----- 3 files changed, 37 insertions(+), 27 deletions(-) diff --git a/libretrogd/src/audio/mod.rs b/libretrogd/src/audio/mod.rs index e08a515..df8c58a 100644 --- a/libretrogd/src/audio/mod.rs +++ b/libretrogd/src/audio/mod.rs @@ -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 { - if self.spec.frequency == frequency && self.spec.channels == channels { + pub fn convert(self, to_spec: &AudioSpec) -> Result { + 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) } diff --git a/libretrogd/src/audio/wav.rs b/libretrogd/src/audio/wav.rs index 031d637..b096a52 100644 --- a/libretrogd/src/audio/wav.rs +++ b/libretrogd/src/audio/wav.rs @@ -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"))); } diff --git a/libretrogd/src/system/mod.rs b/libretrogd/src/system/mod.rs index 28d5390..f32670b 100644 --- a/libretrogd/src/system/mod.rs +++ b/libretrogd/src/system/mod.rs @@ -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,