본문 바로가기

Programming/DirectX

[DirectSound] 10. 재생 관련 추가 기능 DirectSound로 재생할 때 추가적으로 사용이 가능한 기능입니다.재생 도중 버퍼의 정보를 가져올 수 있는 메소드는 다음과 같습니다. IDirectSoundBuffer8::GetVolume() IDirectSoundBuffer8::GetFrequency() IDirectSoundBuffer8::GetPan() 먼저 GetVolume()은 재생되는 소리나 음원의 크기를 가져올 수 있습니다.이 값이 작아질수록 원래 크기에서 음소거(Mute)로 변경됩니다.GetFrequency()는 소리의 속도를 가져옵니다.Frequency를 조절하면 실제 소리보다 빠르게, 혹은 느리게 재생이 가능합니다.Pan은 소리의 위치를 지정합니다.2채널 스피커를 기준으로 Pan 값이 가운데면 양쪽 스피커, 오른쪽이나 왼쪽이면 해당.. 더보기
[DirectSound] 9. 스트리밍 재생 예제 스트리밍 재생은 크기가 큰 파일이나 네트워크에서 전송되는 데이터를 재생하는 것이 가능합니다.스트리밍 재생을 좀 더 보면 다음과 같습니다.동일한 크기의 5개의 구간으로 나눠진 버퍼입니다. (1)~(5)까지의 각 구간은 동일한 크기입니다.화살표가 표시된 지점이 재생이 완료됐을 때 통지를 받을 지점입니다.스트리밍 재생을 다시 설명하면 다음과 같습니다.1. (1)~(5)까지의 구간에 PCM데이터를 입력2. 재생을 시작3. (1) 구간의 재생이 끝나고 통지가 전달되면 새로운 데이터(1~5까지의 데이터를 입력했으면 6)를 입력4. 3번과 동일하게 다음 통지 구간 이후에 계속 반복(1)~(5)까지 데이터를 채우고 재생한 이후에 각 통지 지점에서 통지를 받습니다.재생이 완료된 부분을 Lock()으로 잠그고 새로운 데이.. 더보기
[DirectSound] 8. 버퍼의 통지와 스트리밍 재생 DirectSound의 버퍼는 논리적으로 원형(순환) 버퍼로 되어 있습니다.한정된 버퍼의 크기를 계속 사용하기 위해서 이런 구조를 사용합니다.IDirectSoundBuffer8 인터페이스의 Lock() 메소드는 2개의 주소와 크기를 리턴합니다. HRESULT Lock( DWORD dwOffset, DWORD dwBytes, LPVOID * ppvAudioPtr1, LPDWORD pdwAudioBytes1, LPVOID * ppvAudioPtr2, LPDWORD pdwAudioBytes2, DWORD dwFlags ) 보통 하나의 주소와 크기를 반환하지만 다음과 같은 경우에는 두 개를 리턴합니다.주소가 0~39999까지인 40000바이트 크기의 버퍼를 생성했다고 가정합니다.20000 바이트의 위치에서 30.. 더보기
[DirectSound] 7. 기본 재생 관련 소스 실제로 재생을 하기 위한 전체 소스입니다.기존의 소스 코드를 취합하면 소리를 재생하는 것이 가능합니다.먼저 MFC Application으로 프로젝트를 생성합니다.프로젝트는 Dialog Based로 선택해서 생성합니다.프로젝트 메뉴의 하위에 있는 Add Class를 선택합니다.그리고 C++ Class를 선택하고 Add를 누릅니다.Class name에 이름을 입력하면 파일명이 자동으로 생성됩니다. 원하는 클래스 이름으로 설정하고 Finish를 누르면 클래스 파일이 생성됩니다.이제 재생을 위한 소스를 해당 클래스에 작성하면 됩니다. 기존의 내용을 토대로 작성하면 됩니다.헤더의 내용은 다음과 같이 해서 재생과 중지를 추가하고 통지를 추가합니다. #pragma once #include #include #inclu.. 더보기
[DirectSound] 6. DirectSound 버퍼의 재생 버퍼의 생성까지 완료되면 이제 버퍼에 실제 데이터를 입력해서 재생하면 됩니다.버퍼를 생성하면 약간의 코드만 추가하면 기본적인 재생이 가능합니다.이번에 사용하는 방법은 비교적 짧은 길이의 소리를 한 번에 재생하는 방법입니다.이후에 긴 길이의 소리나 스트리밍을 재생하는 방법인 버퍼의 통지를 구현할 예정입니다.재생은 IDirectSoundBuffer8의 Play() 메소드를 통해서 합니다.각각의 소리는 Secondary Buffer로 표현이 됩니다.이 소리들을 Primary Buffer에서 섞어주기 때문에 동시에 다양한 소리를 듣는 것이 가능합니다.Primary Buffer는 각 응용프로그램에 하나씩 자동으로 생성되기 때문에 따로 생성하지 않아도 됩니다.재생은 다음과 같은 순서로 진행됩니다.먼저 IDirect.. 더보기
[DirectSound] 5. DirectSound 버퍼의 생성 DirectSound의 장치 생성이 완료된 이후에 버퍼를 생성합니다.버퍼는 DirectSound의 실제 소리를 담당합니다.각 소리(배경음, 효과음 등)는 하나의 Secondary Buffer를 가집니다.Secondary Buffer는 IDirectSound8이 제공하는 메소드인 CreateSoundBuffer()를 통해서 생성할 수 있습니다.여기에서 다음과 같이 정의된 DSBUFFERDSEC라는 구조체가 사용됩니다. typedef struct _DSBUFFERDESC { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; #if DIRECTSOUND_VERSION >= 0x0700 GU.. 더보기
[DirectSound] 4. DirectSound Device 생성 DirectSound를 통해서 재생하기 위해서는 장치 생성을 먼저 해야 합니다.DirectX는 COM(Component Object Model)을 기반으로 되어 있습니다.COM은 ActiveX 등에도 사용되는 기반 기술로 그 내용이 상당히 방대한 편입니다.간단하게 COM은 인터페이스를 사용하며 순수 가상 함수만을 갖는 클래스로 표현됩니다.관련 내용은 아래의 링크를 참조하면 확인이 가능합니다.2014/12/03 - [Programming/C&C++] - 다형성과 가상함수vptr이라는 포인터가 동적으로 실제 호출해야 하는 함수의 테이블을 가리키고 사용하게 합니다. COM은 3 종류로 구분되며 DirectSound는 DLL(Inproc-server) 형태로 제공됩니다.그리고 참조 카운팅을 통해서 해제 시점을 .. 더보기
[DirectSound] 3. DirectSound의 사운드 카드 열거 이전 글에서 DirectSound가 재생할 재료가 되는 Wave의 전체적인 구조를 확인했습니다.DirectSound는 DirectX를 구성하는 기술 중 한 가지입니다.소리의 재생과 녹음을 담당하는 기능을 포함하고 있습니다.사운드를 재생하는데는 사운드 카드가 필요합니다.최근에는 대부분 메인보드에서 기본으로 제공되는 내장 사운드 카드를 사용합니다.기본적으로 사운드 카드는 한 개를 주로 사용하기 때문에 장치 열거가 필요없는 경우가 다수입니다.다만 여러 개의 사운드 카드가 설치되어 있고 특정 장치를 통해서 재생을 하고 싶은 경우에 장치 열거가 필요합니다.장치 열거를 위해서 다음과 같은 형태의 콜백 함수(Callback Function)이 필요합니다. BOOL CALLBACK DSEnumCallback(LPGUI.. 더보기