상세 컨텐츠

본문 제목

DX 사운드 옵션 설명

프로그래밍 관련/사운드

by AlrepondTech 2011. 1. 5. 12:23

본문

반응형

 

 

 

 

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

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

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

 

 

 

 

 

 

출처 : 데브피아

오역이 있을 수 있으니 원문을 참조하세요

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이어야만 한다.

 

 

 

반응형

 

728x90

 

 

 

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로 생성되었을 때 재생되는 버퍼라면 다음과 같은 절차를 밟는다.

  1. 하드웨어 3-D voice가 이용가능하면, 그  3-D 하드웨어 voice가 사용된다.
  2. 만약 하드웨어 3-D voice 가 이용가능하고 2-D 하드웨어 voice도 이용가능하면, 그 2-D 하드웨어 voice가 사용될 것이다. 이것은 DS3DALG_NO_VIRTUALIZATION 알고리즘이 간단한 스테레오 팬 알고리즘이기 때문이다.
  3. 만약 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.

 

 

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

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

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

 

 

반응형


관련글 더보기

댓글 영역