=================================
=================================
=================================
출처 : 데브피아
오역이 있을 수 있으니 원문을 참조하세요
DSBUFFERDESC 구조체는 새로운 버퍼 개체의 특징(characteristics)을 기술한다. IDirectSound8::CreateSoundBuffer와 DirectSoundFullDuplexCreate8 함수에 의해 사용된다.
이 구조체의 이전 버전인 DSBUFFERDESC1은 DirectX7 및 이전버전과의 호환성을 위해 Dsound.h에 유지되고 있다.
Syntax
typedef struct { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; GUID guid3DAlgorithm; } DSBUFFERDESC, *LPDSBUFFERDESC; typedef const DSBUFFERDESC *LPCDSBUFFERDESC;
Members
dwSize
구조체의 바이트 단위 크기. 이 멤버는 구조체가 사용되기 전에 반드시 초기화되어야 한다.
dwFlags
버퍼의 기능을 지정하는 플래그. 다음 값들이 정의되어 있다.
Value | Description |
DSBCAPS_CTRL3D | 버퍼는 3-D 제어 기능을 가진다. DSBCAPS_CTRLPAN과 혼용되거나 lpwfxFormat에서 스테레오 포맷을 가진 버퍼를 위해 설정될 수 없다. |
DSBCAPS_CTRLFREQUENCY | 버퍼는 주파수 제어 기능을 가진다. |
DSBCAPS_CTRLFX | 버퍼는 이펙트 처리를 지원한다. lpwfxFormat에서 WAV 포맷은 두 채널 이상을 가지지 않는 8비트나 16비트 PCM 포맷이어야만 한다. 그리고 버퍼는 적어도 DSBSIZE_FX_MIN 밀리세컨드의 데이터를 저장할 수 있도록 충분히 커야 한다. |
DSBCAPS_CTRLPAN | 버퍼는 팬 제어 기능을 가진다. DSBCAPS_CTRL3D와 혼용될 수 없다. |
DSBCAPS_CTRLPOSITIONNOTIFY | 버퍼는 위치 통지(position notification)기능을 가진다. Remarks를 참조하라. |
DSBCAPS_CTRLVOLUME | 버퍼는 볼륨 제어 기능을 가진다. |
DSBCAPS_GETCURRENTPOSITION2 | IDirectSoundBuffer8::GetCurrentPositioin 메서드는 재생 커서의 새로운 동작을 사용한다. DirectX1의 DirectSound에서는 재생 커서가 에뮬레이트된(emulated) 사운드 카드에서 실제 사운드 재생의 앞에 있었다; 기록 커서의 바로 다음에 있었다. 이제는 DSBCAPS_GETCURRENTPOSITION2 플래그가 지정되어 있을때, 응용프로그램은 더욱 정확한 재생 커서를 얻을 수 있다. 만약 이 플래그가 지정되어 있지 않는다면, 예전의 동작이 호환성을 위해서 유지될 것이다. 이 플래그는 단지 에뮬레이트된 사운드 카드에만 영향을 미친다는 점에 주의하자. DirectSound 드라이버가 제출되면, 재생 커서는 모든 버전의 DirectX에서 DirectSound에 대해 정확하다.(원문 : The IDirectSoundBuffer8::GetCurrentPosition method uses the new behavior of the play cursor. In DirectSound in DirectX 1, the play cursor was significantly ahead of the actual playing sound on emulated sound cards; it was directly behind the write cursor. Now, if the DSBCAPS_GETCURRENTPOSITION2 flag is specified, the application can get a more accurate play cursor. If this flag is not specified, the old behavior is preserved for compatibility. Note that this flag affects only emulated sound cards. If a DirectSound driver is present, the play cursor is accurate for DirectSound in all versions of DirectX.) |
DSBCAPS_GLOBALFOCUS | 버퍼는 전역 사운드 버퍼이다. 이 플래그가 설정되어 있으면, 사용자가 다른 응용프로그램으로 포커스를 이동시켰다고 해도, 심지어는 새로운 응용프로그램이 DirectSound를 사용한다고 해도, Directsound를 사용하는 응용프로그램은 그 버퍼를 계속해서 재생할 수 있다. 하나의 예외는 DSSCL_WRITEPRIMATRY 플래그를 협력레벨로 사용하는 DirectSound 응용프로그램으로 포커스를 옮기는 경우이다. 이러한 경우에 다른 응용프로그램으로부터의 전역 사운드는 들리지 않을 것이다. |
DSBCAPS_LOCDEFER | 버퍼가 재생 시간에 하드웨어나 소프트웨어 리소스에 할당될 수 있다. 이 플래그는 voice 관리를 사용하는 버퍼를 위해 설정되어야만 한다. |
DSBCAPS_LOCHARDWARE | 버퍼는 하드웨어 믹싱을 사용해야만 한다. 만약 장치가 하드웨어 믹식을 지원하지 않거나 요청된 하드웨어 메모리가 사용 불가능하다면, IDirectSound8::CreateSoundBuffer 메서드 호출이 실패할 것이다. 응용프로그램은 이 버퍼에 대한 믹싱 채널이 사용가능함을 보장해야만 한다; this condition is not guaranteed. 만약 이 플래그나 DSBCAPS_LOCSOFTWARE가 모두 지정되어 있지 않다면, 버퍼는 리소스가 사용가능할 때는 하드웨어에, 리소스가 사용 불가능할 때는 소프트웨어에 위치하게 된다. |
DSBCAPS_LOCSOFTWARE | DSBCAPS_STATIC이 지정되어 있고 하드웨어 리소스가 사용가능하더라도, 버퍼는 소프트웨어 메모리에 위치해야 하며 소프트웨어 믹싱을 사용해야만 한다. |
DSBCAPS_MUTE3DATMAXDISTANCE | 사운드는 최대 거리에서 무음이 된다. 최대 거리를 초과할 때 사운드 재생이 멈춘다. 그렇게 함으로써 실행 시간이 낭비되지 않는다. 소프트웨어 버퍼에만 적용된다. |
DSBCAPS_PRIMARYBUFFER | 버퍼가 주 버퍼이다. 만약 이 값이 지정되어 있지 않다면, 보조 사운드 버퍼가 생성된다. DXBCAPS_CTRLFX와 혼용할 수 없다. |
DSBCAPS_STATIC | 버퍼는 보드 기반 하드웨어 메모리에 위치한다. 그러한 메모리가 사용가능하지 않다면 아무런 에러도 나지 않는다. 이 플래그는 PCI 버스를 사용하는 카드에 아무런 영향도 미치지 않는다. DSBCAPS_CTRLFX와 혼용될 수 없다. |
DSBCAPS_STICKYFOCUS | 버퍼는 sticky focus(끈적끈적한 포커스 ?)를 가진다. 만약 사용자가 DirectSound를 사용하지 않는 다른 응용프로그램을 사용한다면, 응용프로그램의 일반적인 버퍼는 소리가 나지 않는다. 그러나 sticky foucs 버퍼는 계속 소리가 난다. |
dwBufferBytes
새로운 버퍼의 바이트 단위 크기. 이 값은 DSBCCAPS_PRIMARYBUFFER 프래그로 버퍼가 생성되었을 때는 0이어야만 한다. 보조 버퍼에 대해서 최소와 최대 사이즈는 DSBSIZE_MIN 과 DSBSIZE_MAX 에 의해 허용되며, Dsound.h에 정의되어 있다.
dwReserved
예약됨. 0이어야만 한다.
lpwfxFormat
버퍼를 위해 waveform 데이터를 지정하는 WAVEFORMATEX나 WAVEFORMATEXTENSIBLE 구조체의 주소이다. 이 값은 주 버퍼에 대해서는 NULL이어야만 한다. 응용프로그램은 주 버퍼의 포맷을 설정하기 위해서 IDirectSoundBuffer8::SEtFormat을 사용할 수 있다.
guid3DAlgorithm
DirectSound3D 하드웨어 에뮬레이션에 의해 사용될 two-speaker virtualization 알고리즘의 단일 식별자. dwFlags에 DSBCAPS_CTRL3D가 설정되어 있지 않다면, 이 멤버는 GUID_NULL(DS3DALG_DEFAULT)여야만 한다.
다음 알고리즘 식별자가 정의되어 있다.
Value | Description | Availability |
DS3DALG_DEFAULT | DirectSound가 기본 알고리즘을 사용한다. 대부분의 경우에 이것은 DS3DALG_NO_VIRTUALIZATION이다. WDM 드라이버에서 사용자가 환경 사운드 스피커 설정을 Control 패널에서 사용한다면, 사운드는 가능한 직접 스피커 사이에서 패닝(panned)될 것이다. | 소프트웨어 믹싱만을 적용한다. WDM이나 Vxd 드라이버에서 이용가능하다. |
DS3DALG_NO_VIRTUALIZATION | 3-D 출력이 일반적인 왼쪽과 오른쪽의 스테레오 패닝에 매핑된다. 왼쪽으로 90 도가 되면 사운드는 왼쪽 스피커에서만 소리가 난다; 오른쪽으로 90도 이면 사운드는 오른쪽 스피커에서만 소리난다. 수직축은 거리를 위해서 볼륨의 크기를 조절하기 위한 경우를 제외하고는 무시된다. 도플러(doppler) 효과가 시프트(shift)되며, 볼륨 크기 조절이 아직도 적용된다. 그러나 3-D 필터링은 이 버퍼에 수행되지 않는다. 이것은 소프트웨어 수행에 있어서 대부분 효과적이지만, 가상 3-D 효과를 지원하지 않는다. DS3DAlg_NO_VIRTUALIZATION 알고리즘이 지정될 때는 HRTF 처리가 수행되지 않을 것이다.DS3DALG_NO_VIRTUALIZATIon은 단지 일반적인 스테레오 패닝만을 사용하기 때문에, 이 알고리즘으로 생성된 버퍼는 3-D 하드웨어 voice가 사용가능하지 않아야만 2-D 하드웨어 voice에 의해 가속될 것이다. | 소프트웨어 믹싱만을 지원한다. WDM이나 Vxd 드라이버에서 이용가능하다. |
DS3DALG_HRTF_FULL | 3-D API는 고수준 퀄러티 3-D 오디오 알고리즘으로 처리된다. 이 알고리즘은 최상의 3-D 오디오 이펙트 퀄러티를 제공하지만, CPU 사이클을 많이 필요로 한다. Remarks를 참조하라. | 소프트웨어 믹싱만을 지원한다. WDM 드라이버를 사용하는 Microsoft Windows 98 Second Edition 과 그 이후의 운영체제에서 가능하다. |
DS3DALG_HRTF_LIGHT | 3-D API는 효율적인 3-D 오디오 알고리즘으로 처리된다. 이 알고리즘은 좋은 3-D 오디오 효과를 제공하지만, DS3DALG_HRtF_FULL 보다 더 적은 CPU 사이클을 사용한다. | 소프트웨어 믹싱만을 사용한다. WDM 드라이버를 사용하는 Microsoft Windows 98 Second Edition 과 그 이후의 운영체제에서 가능하다. |
Remarks
주 버퍼를 생성할 때, 응용프로그램은 반드시 dwBufferBytes 멤버를 0으로 설정해야만 한다. DirectSound 는 사용중인 개별 사운드 장치에 대한 최적의 버퍼 사이즈를 결정할 것이다. 생성된 주 버퍼의 크기를 결정하고자 한다면, IDirectSoudnBuffer8::GetCaps를 호출하라.
DSBCAPS_CTRLDEFULAT 태그틑 더 이상 제공되지 않는다. 이 플래그는 DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLFREQUENCY로 정의되어 있다. 필요로 하는 플래그만을 지정함으로써, 불필요한 리소스 사용을 배제할 수 있다.
VXD 드라이버에서 DSBCAPS_CTRLPOSTIONNOTIFY 로 생성된 사운드 버퍼는 항상 소프트웨어 버퍼이다. 왜냐하면 VXD 드라이버 모델은 통지(notification)를 지원하지 않기 때문이다. WMD 드라이버를 사용하면 하드웨어 리소스가 이용가능하다면 통지 가능한 버퍼는 하드웨어에 존재할 수 있다.
DSBCAPS_LOCHARDWARE 와 DSBCAPS_LOCSOFTWARE 플래그는 선택적이며, 상호 배타적이다. DSBCAPS_LOCHARDWARE는 버퍼가 하드웨어에 위치하게 하는데, 이는 사운드 카드에 의해 믹스된다는 것을 의미한다. DSBCAPS_LOCSOFTWARE는 버퍼가 소프트웨어에 위치하게 하는데, 이는 CPU에 의해 믹스됨을 의미한다. 이러한 플래그들은 dwFlags를 위해 DSBCAPS 구조체의 멤버로 정의되어 있다.
3-D 알고리즘은 소프트웨어 에뮬레이션 레이어의 선택만을 제출한다. 즉, 가속을 위한 하드웨어가 제출되지 않았을 때 사용되는 소프트웨어 알고리즘이다. 하드웨어 활용의 극대화를 위해서 DS3DALG_NO_VIRTUALIZATION은 특별한 케이스로 취급된다. 만약 3-D 하드웨어 voice가 이용 불가능하면, 버퍼는 2-d 버퍼로서 취급되지만, 3-D 제어를 가진다. 특별하게 사운드 버퍼가 DS3DALG_NO_VIRTUALICATION으로 생성되거나, 버퍼가 DSBPLY_LOCDEFER로 생성되었을 때 재생되는 버퍼라면 다음과 같은 절차를 밟는다.
- 하드웨어 3-D voice가 이용가능하면, 그 3-D 하드웨어 voice가 사용된다.
- 만약 하드웨어 3-D voice 가 이용가능하고 2-D 하드웨어 voice도 이용가능하면, 그 2-D 하드웨어 voice가 사용될 것이다. 이것은 DS3DALG_NO_VIRTUALIZATION 알고리즘이 간단한 스테레오 팬 알고리즘이기 때문이다.
- 만약 2-D 하드웨어나 3-D 하드웨어 voice가 불가능하다면, voice는 DS3DALG_NO_VIRTUALIZATION 알고리즘을 사용하여 소프트웨어에서 재생될 것이다.
사실 DSSPEAKER_HEADPHONE 이나 DSSPEAKER_STEROEO가 아닌 스피커 환경이라도, 마치 2개의 스피커 환경을 위한 것과 같은 처리가 수행될 것이다.
버퍼가 HRTF 알고리즘 중의 하나를 사용하여 생성되고, HRTF 알고리즘이 시스템에서 불가능하다면(예를 들어 non-WDM 시스템), 성공 코드인 DS_NO_VIRTUALIZATIOn이 반화된다. 대신에 생성된 사운드 버퍼는 DS3DALG_NO_VIRTUALIZATION을 사용할 것이다. 이러한 이유로 응용프로그램은 CreateSoundBuffer를 사용할 때 DS_OK를 명시적으로 검사하기 보다는 SUCCEEDED 나 FAILED 매크로를 사용할 것이다.
Requirements
Header: Declared in Dsound.h.
=================================
=================================
=================================
'프로그래밍 관련 > 사운드' 카테고리의 다른 글
박한규님 사운드 프로그래밍 강좌 (0) | 2011.01.05 |
---|---|
다이렉트 사운드 녹음,재생 (0) | 2011.01.05 |
Direct Sound 란? (wiki 자료) (0) | 2011.01.05 |
게임 사운드 믹싱 관련 (0) | 2011.01.05 |
이준곤님 Direct Sound 설명 (사운드 믹싱 검색) (0) | 2011.01.05 |