본문 바로가기
개발/게임

SDL2(6) - RUST 버전

by 슈케르 2025. 5. 31.
반응형

라면먹고 한숨 자고 일어났더니 힘이 생겼다. 다시 쫌 파보자.

 

audioCVT 형식 변환은 실패했다. 동일한 문제가 계속 발생한다.

noise 가득하게 느려진 상태의 audio 출력이 여전한 문제다.

 

아무래도 chatgpt만 믿을 수 없는듯하다. 

그렇다면 copilot 에게도 한번 징징거려보기~

 

짧은 영어로 구차하게 질문해본다.. 

(나는 영어를 못한다. 토익도 620점이 최고점이고, 이걸로 취직했고, 지금까지 먹고 살아왔다.

해외 여행가서 굷거나 노숙한적 없다.  그러니 문법따위는 개나 줘버려라 시비걸지 마라..)

vscode에서 github copilot과의 토론...

 

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 파일의 속성을 직접 바꾸고 해보기도 했으나

https://cloudconvert.com/wav-converter

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