Revert "sound: reuse buffers (#336)"

This reverts commit c087f17054.
This commit is contained in:
alula
2025-10-07 04:38:10 +02:00
parent 37b70c3f4d
commit 52636fa296
4 changed files with 54 additions and 55 deletions
+14 -14
View File
@@ -84,16 +84,16 @@ impl SoundManager {
}
let bnk = wave_bank::SoundBank::load_from(filesystem::open(ctx, "/builtin/organya-wavetable-doukutsu.bin")?)?;
Ok(SoundManager::bootstrap(bnk, tx, rx)?)
Ok(SoundManager::bootstrap(&bnk, tx, rx)?)
}
fn bootstrap(
soundbank: SoundBank,
soundbank: &SoundBank,
tx: Sender<PlaybackMessage>,
rx: Receiver<PlaybackMessage>,
) -> GameResult<SoundManager> {
let mut sound_manager = SoundManager {
soundbank: Some(soundbank.clone()),
soundbank: Some(soundbank.to_owned()),
tx,
prev_song_id: 0,
current_song_id: 0,
@@ -126,16 +126,16 @@ impl SoundManager {
let config = config_result.unwrap();
let res = match config.sample_format() {
cpal::SampleFormat::I8 => run::<i8>(rx, soundbank, device, config.into()),
cpal::SampleFormat::I16 => run::<i16>(rx, soundbank, device, config.into()),
cpal::SampleFormat::I32 => run::<i32>(rx, soundbank, device, config.into()),
cpal::SampleFormat::I64 => run::<i64>(rx, soundbank, device, config.into()),
cpal::SampleFormat::U8 => run::<u8>(rx, soundbank, device, config.into()),
cpal::SampleFormat::U16 => run::<u16>(rx, soundbank, device, config.into()),
cpal::SampleFormat::U32 => run::<u32>(rx, soundbank, device, config.into()),
cpal::SampleFormat::U64 => run::<u64>(rx, soundbank, device, config.into()),
cpal::SampleFormat::F32 => run::<f32>(rx, soundbank, device, config.into()),
cpal::SampleFormat::F64 => run::<f64>(rx, soundbank, device, config.into()),
cpal::SampleFormat::I8 => run::<i8>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::I16 => run::<i16>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::I32 => run::<i32>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::I64 => run::<i64>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::U8 => run::<u8>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::U16 => run::<u16>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::U32 => run::<u32>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::U64 => run::<u64>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::F32 => run::<f32>(rx, soundbank.to_owned(), device, config.into()),
cpal::SampleFormat::F64 => run::<f64>(rx, soundbank.to_owned(), device, config.into()),
_ => Err(AudioError("Unsupported sample format.".to_owned())),
};
@@ -157,7 +157,7 @@ impl SoundManager {
let (tx, rx): (Sender<PlaybackMessage>, Receiver<PlaybackMessage>) = mpsc::channel();
let soundbank = self.soundbank.take().unwrap();
*self = SoundManager::bootstrap(soundbank, tx, rx)?;
*self = SoundManager::bootstrap(&soundbank, tx, rx)?;
Ok(())
}
+33 -33
View File
@@ -4,15 +4,14 @@
use std::cmp::min;
use std::hint::unreachable_unchecked;
use std::mem::MaybeUninit;
use std::sync::Arc;
use crate::sound::fir::FIR;
use crate::sound::fir::FIR_STEP;
use crate::sound::InterpolationMode;
use crate::sound::organya::{Song as Organya, Version};
use crate::sound::stuff::*;
use crate::sound::wav::*;
use crate::sound::wave_bank::SoundBank;
use crate::sound::InterpolationMode;
#[derive(Clone)]
pub struct FIRData {
@@ -111,7 +110,7 @@ impl OrgPlaybackEngine {
let format = WavFormat { channels: 1, sample_rate: 22050, bit_depth: 8 };
let rbuf = RenderBuffer::new_organya(format, sound);
let rbuf = RenderBuffer::new_organya(WavSample { format, data: sound });
for j in 0..8 {
for &k in &[0, 64] {
@@ -124,14 +123,10 @@ impl OrgPlaybackEngine {
for (idx, (track, buf)) in song.tracks[8..].iter().zip(self.track_buffers[128..].iter_mut()).enumerate() {
if song.version == Version::Extended {
// Check for OOB track count, instruments outside of the sample range will be set to the last valid sample
let index = if track.inst.inst as usize >= samples.samples.len() {
samples.samples.len() - 1
} else {
track.inst.inst as usize
};
let index = if track.inst.inst as usize >= samples.samples.len() {samples.samples.len() - 1} else {track.inst.inst as usize} ;
*buf = RenderBuffer::new(samples.samples[index].clone());
} else {
let index = if idx >= samples.samples.len() { samples.samples.len() - 1 } else { idx };
let index = if idx >= samples.samples.len() {samples.samples.len() - 1} else {idx};
*buf = RenderBuffer::new(samples.samples[index].clone());
}
}
@@ -364,21 +359,27 @@ impl OrgPlaybackEngine {
let (sl1, sr1, sl2, sr2) = match (is_16bit, is_stereo) {
(true, true) => unsafe {
let ps = pos << 2;
let sl1 = (*sample_data_ptr.add(ps) as u16 | (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
let sr1 = (*sample_data_ptr.add(ps + 2) as u16 | (*sample_data_ptr.add(ps + 3) as u16) << 8)
let sl1 = (*sample_data_ptr.add(ps) as u16
| (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
let sr1 =
(*sample_data_ptr.add(ps + 2) as u16
| (*sample_data_ptr.add(ps + 3) as u16) << 8)
as f32
/ 32768.0;
let ps = min(pos + 1, buf.base_pos + buf.len - 1) << 2;
let sl2 = (*sample_data_ptr.add(ps) as u16 | (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
let sr2 = (*sample_data_ptr.add(ps + 2) as u16 | (*sample_data_ptr.add(ps + 3) as u16) << 8)
let sl2 = (*sample_data_ptr.add(ps) as u16
| (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
let sr2 =
(*sample_data_ptr.add(ps + 2) as u16
| (*sample_data_ptr.add(ps + 3) as u16) << 8)
as f32
/ 32768.0;
(sl1, sr1, sl2, sr2)
},
}
(false, true) => unsafe {
let ps = pos << 1;
let sl1 = (*sample_data_ptr.add(ps) as f32 - 128.0) / 128.0;
@@ -387,24 +388,26 @@ impl OrgPlaybackEngine {
let sl2 = (*sample_data_ptr.add(ps) as f32 - 128.0) / 128.0;
let sr2 = (*sample_data_ptr.add(ps + 1) as f32 - 128.0) / 128.0;
(sl1, sr1, sl2, sr2)
},
}
(true, false) => unsafe {
let ps = pos << 1;
let s1 = (*sample_data_ptr.add(ps) as u16 | (*sample_data_ptr.add(ps + 1) as u16) << 8)
let s1 = (*sample_data_ptr.add(ps) as u16
| (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
let ps = min(pos + 1, buf.base_pos + buf.len - 1) << 1;
let s2 = (*sample_data_ptr.add(ps) as u16 | (*sample_data_ptr.add(ps + 1) as u16) << 8)
let s2 = (*sample_data_ptr.add(ps) as u16
| (*sample_data_ptr.add(ps + 1) as u16) << 8)
as f32
/ 32768.0;
(s1, s1, s2, s2)
},
}
(false, false) => unsafe {
let s1 = (*sample_data_ptr.add(pos) as f32 - 128.0) / 128.0;
let pos = min(pos + 1, buf.base_pos + buf.len - 1);
let s2 = (*sample_data_ptr.add(pos) as f32 - 128.0) / 128.0;
(s1, s1, s2, s2)
},
}
};
let r1 = buf.position.fract() as f32;
@@ -634,10 +637,7 @@ impl RenderBuffer {
volume: 0,
pan: 0,
len: 0,
sample: WavSample {
format: WavFormat { channels: 2, sample_rate: 22050, bit_depth: 16 },
data: Arc::new([]),
},
sample: WavSample { format: WavFormat { channels: 2, sample_rate: 22050, bit_depth: 16 }, data: vec![] },
playing: false,
looping: false,
base_pos: 0,
@@ -648,16 +648,16 @@ impl RenderBuffer {
}
}
pub fn new_organya(format: WavFormat, wave: Vec<u8>) -> RenderBuffer {
const SIZES: &[usize] = &[256, 256, 128, 128, 64, 32, 16, 8];
let mut sample_data = Vec::with_capacity(SIZES.iter().sum());
pub fn new_organya(mut sample: WavSample) -> RenderBuffer {
let wave = sample.data.clone();
sample.data.clear();
for size in SIZES {
for size in &[256_usize, 256, 128, 128, 64, 32, 16, 8] {
let step = 256 / size;
let mut acc = 0;
for _ in 0..*size {
sample_data.push(wave[acc]);
sample.data.push(wave[acc]);
acc += step;
if acc >= 256 {
@@ -666,7 +666,7 @@ impl RenderBuffer {
}
}
RenderBuffer::new(WavSample { format, data: sample_data.into() })
RenderBuffer::new(sample)
}
#[inline]
+2 -3
View File
@@ -4,7 +4,6 @@
use std::fmt;
use std::io;
use std::io::ErrorKind;
use std::sync::Arc;
use byteorder::{LE, ReadBytesExt};
@@ -46,7 +45,7 @@ impl fmt::Display for WavFormat {
#[derive(Clone)]
pub struct WavSample {
pub format: WavFormat,
pub data: Arc<[u8]>,
pub data: Vec<u8>,
}
impl fmt::Display for WavSample {
@@ -120,6 +119,6 @@ impl WavSample {
f.read_exact(&mut buf)?;
Ok(WavSample { format: WavFormat { channels, sample_rate: samples, bit_depth: bits }, data: buf.into() })
Ok(WavSample { format: WavFormat { channels, sample_rate: samples, bit_depth: bits }, data: buf })
}
}
+5 -5
View File
@@ -3,21 +3,21 @@
// Copyright (c) 2020 doukutsu-rs contributors (see AUTHORS.md)
use std::fmt;
use std::io;
use std::sync::Arc;
use crate::sound::wav;
#[derive(Clone)]
pub struct SoundBank {
pub wave100: Arc<[u8; 25600]>,
pub samples: Arc<[wav::WavSample]>,
pub wave100: Box<[u8; 25600]>,
pub samples: Vec<wav::WavSample>,
}
impl fmt::Display for SoundBank {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
writeln!(f, "WAVE100: {:2X?}...", &self.wave100[..8])?;
for sample in self.samples.iter() {
for sample in &self.samples {
writeln!(f, "{}", sample)?;
}
@@ -41,7 +41,7 @@ impl SoundBank {
}
Err(err) => {
log::error!("Failed to read next sample: {}", err);
return Ok(SoundBank { wave100: wave100.into(), samples: samples.into() });
return Ok(SoundBank { wave100, samples });
}
}
}