라면먹고 한숨 자고 일어났더니 힘이 생겼다. 다시 쫌 파보자.
audioCVT 형식 변환은 실패했다. 동일한 문제가 계속 발생한다.
noise 가득하게 느려진 상태의 audio 출력이 여전한 문제다.
아무래도 chatgpt만 믿을 수 없는듯하다.
그렇다면 copilot 에게도 한번 징징거려보기~
짧은 영어로 구차하게 질문해본다..
(나는 영어를 못한다. 토익도 620점이 최고점이고, 이걸로 취직했고, 지금까지 먹고 살아왔다.
해외 여행가서 굷거나 노숙한적 없다. 그러니 문법따위는 개나 줘버려라 시비걸지 마라..)

callback method니 audio buffer 니 Timing 등등 해결 방법을 제시해주시는 copilot 형님...
방법을 3가지나 제안해 주시는군... 하나씩 적용해서 확인해보겠다.
1. Ensure Proper Buffer Handling
impl AudioCallback for WavAudio {
type Channel = u8;
fn callback(&mut self, out: &mut [u8]) {
let len = out.len();
// if self.position + len <= self.data.len() {
// out.copy_from_slice(&self.data[self.position..self.position + len]);
// self.position += len;
// } else {
// let remaining = self.data.len() - self.position;
// out[..remaining].copy_from_slice(&self.data[self.position..]);
// out[remaining..].fill(0);
// self.position = self.data.len();
// }
if self.position < self.data.len() {
let remaining = self.data.len() - self.position;
let copy_len = len.min(remaining);
out[..copy_len].copy_from_slice(&self.data[self.position..self.position + copy_len]);
self.position += copy_len;
if copy_len < len {
out[copy_len..].fill(0); // Fill remaining buffer with silence
}
} else {
out.fill(0); // Fill entire buffer with silence if no data is left
}
}
}
버퍼를 정리하고 초기화하는 logic을 추가해주었다...
==> 실패~~~
2. Verify Audio Format
desired_spec 설정 재 확인.
let desired_spec = sdl2::audio::AudioSpecDesired {
freq: Some(wav.freq),
channels: Some(wav.channels as u8),
samples: Some(4096), // Adjust sample size for smoother playback
};
음..
desired_spec 의 값을 이리저리 바꿔보면서 테스트했으나 모조리 실패
==> 실패~~~
3. Optimize Playback Timing
u16 type의 range는 0 ~ 65535 까지.... 이것저것 바꿔봤으나
==> 실패~~~
4. wav 파일의 속성을 직접 바꾸고 해보기도 했으나

sample rate을 44100에서 48000 으로 바꿨으나 실패~
format을 S32LSB로도 바꾸고 해보니... 더 느려지고 noise가 심해졌다...!!
음.. 이번에는 다 바꿔볼까?

흠... 잘 안된다.
아무리봐도 sdl2 library 버그가 아닐까싶다. sdl2 api를 가져다가 사용하는 입장에서 더 해볼 수 있는게 없을듯하다.
audio library를 바꿔 보도록 하겠다.
5. rodio crate로 갈아타기
https://docs.rs/rodio/latest/rodio/index.html
rodio - Rust
Audio playback library. The main concept of this library is the Source trait, which represents a sound (streaming or not). In order to play a sound, there are three steps: Create an object that represents the streaming sound. It can be a sine wave, a buffe
docs.rs
현재 가장 안정적인 audio crate로 알려져있다고 한다.
<SDL2 오디오와 rodio 비교>
항목 | SDL2 audio | rodio |
음질/속도 문제 | 자주 발생 | 거의 없음 ✅ |
파일 포맷 지원 | WAV 한정 | WAV, MP3, FLAC 등 |
반복 재생 | 직접 구현 필요 | 기본 지원 ✅ |
음... 성공이다. rodio 0.20.1 로 audio manager를 교체하였고, 한방에 돌아가버렸다.
https://github.com/kchhero/suker_rust_project/commit/72ca9ece40e99e1215357f1db9673a2b89343122
Bugfix: audio issue fixed · kchhero/suker_rust_project@72ca9ec
Audio library changed to rodio 0.20.1 SDL2 audio manager cannot support in this game. Signed-off-by: choonghyun Jeon <kchhero@gmail.com>
github.com
뭐.. 잘 돌아가기만 하면되지만 찝찝한 마음이 흠...
'개발 > 게임' 카테고리의 다른 글
SDL2(5) - RUST 버전 (0) | 2025.05.30 |
---|---|
SDL2(4) - RUST 버전 (1) | 2025.05.30 |
SDL3(4) - CPP 버전1 (0) | 2025.04.28 |
SDL3(3) - C 버전 - 마지막 (2) | 2025.04.25 |
SDL3(2) - C 버전 (0) | 2025.04.24 |