WinAPI 76 Sound

CJB_ny·2022년 10월 17일
0

WinAPI

목록 보기
79/79
post-thumbnail

오늘 배운거 👍👍👍


소리를 다룰려면

컴퓨터 장치안에 사운드 처리해주는 장치가 있다.

=> "사운드 카드"

메인보드 안에 기본으로 내장되어있다. 아니면 GPU에 내장되어있거나

그런데 '소리'라는 것도 결국에는 데이터이다.

노래가 1분이라면은

1분 분량에 해당하는 메모리 바이트를 가지고있을 뿐이다.

소리도 데이터의 집합체인데

어떻게 해석되느냐에 따라서 의도에 맞게 사용이 되는 것이다.

그래서 용량이 꽤 크다.

윈도우에서 사운드 제어

윈도우에서 사운드를 재생을 하려면은

프로그램상의 코드를 통해서 PC에 부착되있는 '사운드 카드'에 접근을 해야한다.

그래서 내가 메모리 상에 로딩해놓은 데이터를 '사운드 카드'로 전송을 해놓아야한다.

(사운드 카드도 자체적인 메모리를 가지고있다)

메모리 이론

지금 시스템 메모리 RAM에 우리의 프로그램이 올라와있다.

논리적으로 분류한

스택/힙/데이터/전역이니 어쨋든 RAM안에 있는 영역이다.

우리 SSD에 있는 파일을 읽어들여서 사운드 카드에다가 전달을 해주어야한다.

만약 사운드 카드의 메모리가 부족을 하면은 RAM 영역과 소통하면서 막 사용한다.

(메모리 걱정 ㄴㄴ)

API

그러면 사운드 카드에다가 이런 메모리를 보내고 이럴려면

API가 필요한데 윈도우에서 제공을 해준다.

Direct Sound라는 라이브러리를 사용해서 사운드카드 조작이 가능하다.

준비

아름다운 pch에다가

이부분 전처리기로 ㄱㄱ 해야함.

우리는 Wave사운드만 로딩이 가능하다.

SSD의 음악파일

다른 사운드 포맷들은 그거에 맞는 해제하는 알고리즘이 필요하다.

왜냐하면 사운드 파일들은 원본 그대로 저장되어있는게 아니라

원본 용량을 줄이기 위해서 해당 포맷의 알고리즘대로 압축이 되어있다.

이것을 RAM으로 불러들일때 압축된것을 알고리즘대로 풀어서 읽어 들여아한다.

음악 메모리

1분짜리의 음악파일이 1000바이트라고하면은

500바이트 지점쯤 왔다는 것은 30초 지났다라는 말이다.

뭐 이런식으로

SetPosition이라는 함수도 별게 없다.

내가 지정한 백분율 위치로 바이트를 옮겨 줄 뿐인 함수이다.

Decibel 개념

데시벨이 10올리면은 2배 올라간게 아니라

10배 올라간것이다.

사운드 카드 인터페이스

밑줄 녀석이 사운드카드를 대표하는 객체 이다.

문제점 ❗

같은 소리가 연속 재생이 안된다.

몬스터 3마리가 동시다발적으로 뛰어서 소리가 재생이 된다고 요청을 해도

메모리 버퍼는 하나라서 끊기듯이 재생되면서 재생된다.

그래서 같은 사운드이지만 동시에 재생할려면

버퍼가 여러개 있어야 한다.

해결방법 ❗

현재 _soundBuffer 이녀석이 play요청되면은

뭐 이런데서 재생이 되는데 혹시 지금 재생중이라면은

그때 _soundBuffer를 하나 더 만들어서

즉, 사운드 카드 메모리 하나 더 만들어서 복사 시키고

따로 또 Play를 시켜준다.

그러다가 만들어준 애가 필요없으면은 메모리를 해제하던가 그러면은 된다.

이런 개념을 Channel이라고한다.

채널 ❗❗❗

32개의 채널을 만들어준다.

한순간에 재생될 수 있는 버퍼를 미리 32개를 만들어놓고

특정 사운드 재생할 때

채널에다가 메모리를 복사시켜서 재생을 시키는 것이다.

만약 이펙트 여러개 재생 시키고 싶다면은

채널 시스템구현을 못하겠으면은

여기서 막 여러개를 로딩을 미리 시켜놓아라.

내가 로딩시킨 사운드들은 ResourceManager가 다 관리를 하고

재생을 할려면 사운드카드 Device가 필요하기 때문에

SoundManager에서 Device를 얻어다가 사용하는 것이다.

profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글