프로그래밍 관련/사운드

게임 사운드 믹싱 관련

AlrepondTech 2011. 1. 5. 12:17
반응형

 

 

=================================

=================================

=================================

 

 

출처 :

http://cafe.naver.com/prostudy12/62

안녕하세요~~^^

오늘 우리가 이번시간부터 배울 DirectSound와 DirectMusic은 정말 놀라운 사운드 라이브러리입니다.

사운드 라이브러리를 배우기에 앞서 가장 필수적으로 알아야 하는 점은 이전 시간에도 언급한 적 있지만,

컴퓨터에겐 "동시"라는 개념이 없다는 것입니다.


흔히 윈도우에서 멀티 태스킹을 처리하고 멀티 쓰레딩을 처리하고 한다고들 하지만,

결국 하드웨어 내부적으로 알고보면 Multi-Programming 이라는 기법을 이용해서 CPU의 내부 작업을 조각 조각 나눠서 Idle 타임을 줄여주는 단순한 방법일 뿐이라는 것이죠.

멀티 태스킹은 절대로 "동시"에 여러 작업을 처리하는 것이 아니라는 것입니다.

단지, 이 작업 저 작업을 조금 조금씩 번갈아 가며 수행하고 있을 뿐...


이것은 사운드에서도 마찬가지입니다.

게임을 만들때 초보 프로그래머들이 가장 큰 난관에 부딪히게 되는 것이, 사운드의 재생인데,

사운드를 재생할때, 이상하게 게임들은 여러가지 소리가 한꺼번에 나오는 것을 볼 수 있습니다.

예를 들어 스타크래프트라는 게임을 할때, 게임에서 배경음악이 나오는 도중에도, 마린을 선택하면, 전혀 배경음악이 끊기지 않은 채로, 마린의 목소리가 흘러 나옵니다("Go, Go, Go!")

만약 윈도우 API의 기본 wav 재생 함수를 사용하게 되면, 배경음악이 재생되다가, 배경음악이 멈추고, 마린의 음성이 나오게 됩니다.


그렇다면 어떻게 해서 DirectSound는 여러개의 사운드를 동시에 출력하는 것일까요?

이것에 대한 가장 간단한 해결책은, 배경음과 효과음을 서로 다른 확장자를 사용해 출력을 하는 것입니다.

예를 들어 배경음악은 MP3나 Midi파일을 이용해 출력하고, 효과음은 wav를 이용해서 출력을 하는 방식이죠.

그렇게 되면, midi가 사용하는 버퍼와 wav가 사용하는 버퍼가 다르므로, 소리가 끊기질 않게 됩니다.


그러나 이것도 완벽한 것은 아닙니다. 왜냐면, 효과음이 반드시 하나만 나온다는 보장이 없으니까요.

위의 방법을 사용하게 되면 midi파일과 wav 파일은 각각 따로 재생이 가능하지만, wav 파일 두개를 동시에 재생한 다는 것은 불가능 하죠.

마린을 선택했다가 바로 SCV를 선택하면 스타 크래프트에서는 마린의 음성과 SCV의 음성이 겹쳐서 나오게 됩니다.


도대체 DirectSound는 어떤 방법을 쓰길래 이런 것이 가능 한 것일까요?

아래 그림을 봅시다^^

 




 

 

반응형

 

728x90

 

 


나름 대로 그림을 작게 그리고 싶었는데... 하다보니 너무 큰 이미지가 나왔네요.

좀 줄이니까 이미지가 쪼그라 들고, 다시 그리자니 귀찮고;;; 이해를 좀 해주시길^^;

어쨋든 위 그림을 보시면, 사운드 3개가 동시에 출력이 되어야 하는 상황이라는걸 단번에 눈치 채셨을 겁니다.

이걸 컴퓨터는 동시에 처리하는 것이 아니라, Sound Mixing 또는 Wave Mixing이라는 기법을 이용해서,

여러개의 사운드를 하나로 합친후 그 사운드를 출력하게 됩니다.


이러한 작업을 하기 위해서 DirectSound는 DirectDraw 처럼, Primary buffer와 Secondary buffer로 나누어서 처리 합니다.

즉, Secondary buffer에 여러개의 사운드 파일들을 미리 불러다 놓고, 필요할때마다 Primary buffer에 불러와 믹싱을 시켜 출력을 하게 되는 것이죠.

어렵게 느껴질 수 있지만, 하다보면 DirectDraw의 과정과 흡사하기 때문에 쉽게 적응 할 수 있으리라 생각 됩니다.

  









우리 여태까지 매번 봐오던 DirectX 개체의 구조와 다를 것이 없습니다.

단 한가지 명심하실 것은 이것은 DirectX의 구조가 아니라, COM Object의 기본 구조라는 사실을 잊어서는 안될것입니다.

어쨋든, DirectSound는 위 그림 처럼 5개의 개체로 이루어져 있습니다.

IUnknown

개체는 모든 COM Object의 기본 개체이며, 중요하긴 하지만, 아직까지 우리에겐 알 필요 없는 개념입니다.

IDirectSound

개체는 DirectSound의 메인 개체이며, IDirectSound 개체 자체는 사운드 카드 하나를 의미하기도 합니다. 즉, 사운드 카드가 두개 인 PC에서는 IDirectSound가 두개 생성 될수 있다는 의미가 되겠지요.

IDirectSoundBuffer 개체는 실제 사운드가 저장되는 사운드 보관소가 되며, 앞서 말씀 드린 대로 두종류의 사운드 버퍼, 주 사운드 버퍼와 보조 사운드 버퍼(Primary Sound Buffer and Secondary Sound Buffers)가 있습니다.
주 버퍼와 보조 버퍼 모두 SRAM(Sound 카드에서 제공하는 RAM) 상에 존재하며 SRAM이 허용하는 한 무한정 보조 버퍼를 만들 수 있습니다.

IDirectSoundCapture

개체는 개체의 이름 처럼 사운드를 캡쳐 하는데 사용 됩니다. 예를 들면, 윈도우의 기본 유틸리티인 "녹음기" 와 같이 사운드를 녹음하는 등에 사용이 되는 개체 입니다.

IDirectSoundNotify

개체는 IDirectSound로 부터 메시지를 받고 다시 IDirectSound에게 우리가 원하는 메시지를 전송할 때 사용됩니다. 그러나 이 방법은 전문 사운드 편집/재생 도구 처럼 복잡한 사운드 구조를 가지지 않은 이상 잘 사용되진 않는 인터페이스입니다.


흠...  이것으로 Direct Sound에 대한 전체 적인 구조는 다 살펴 본 것 같네요.

사실 DirectSound를 사용하는 것은 그렇게 어렵지 않습니다.

몇번이나 말씀드리고 있지만, DirectDraw와 거의 동일 하니까요.


그러나... DirctSound에서 가장 큰 난관이 있다면, DirectSound에서 특정 파일 출력을 전혀 지원하지 않는 다는 의미입니다.

즉, wav 파일이건 midi 파일이건 mp3 파일이건, 특정 확장자를 호출해서 재생하는 기능은 없다는 의미죠.

결국 wav 파일을 출력하기 위해서는 최소한 wav 파일의 구조를 어느 정도는 알고 그것을 메모리상에 적재시킬줄 알아야 한다는 의미가 되겠지요.

메모리상에 사운드의 내용만 적재 시키면 플레이는 DirectSound가 알아서 해주니까요^^


그럼, 다음시간에 뵙죠^^;

 

 

 

=================================

=================================

=================================

 

 

반응형