Share via


DSSPEAKER_DIRECTOUT Speaker 구성

참고 이 정보는 Windows XP 및 이전 운영 체제에 적용됩니다. Windows Vista부터 IDirectSound::GetSpeakerConfigIDirectSound::SetSpeakerConfig 는 더 이상 사용되지 않습니다.

애플리케이션 프로그램은 speaker-configuration 매개 변수가 DSSPEAKER_DIRECTOUT 설정된 IDirectSound::SetSpeakerConfig 메서드를 호출하여 DirectSound 스피커 구성을 직접 출력 모드로 변경할 수 있습니다(Microsoft Windows SDK 설명서 참조). 이는 애플리케이션의 재생 스트림에 있는 채널이 스피커 위치로 해석되지 않고 오디오 어댑터로 직접 출력되는 스피커 없는 구성을 지정합니다. 그러나 입력 스트림은 샘플 속도 변환, 감쇠, 필터링 및 채널에 스피커 할당에 대한 가정이 필요하지 않은 기타 유형의 처리에 의해 수정할 수 있습니다.

적용되면 DSSPEAKER_DIRECTOUT 스피커 구성 설정은 전역이며 오디오 디바이스 전체에 영향을 줍니다. 이후에 실행되는 모든 오디오 애플리케이션에는 DirectSound가 설정을 다시 변경할 때까지 새 설정이 적용됩니다.

직접 출력 모드에서 오디오 디바이스는 디바이스의 첫 번째 출력 커넥터에 첫 번째 채널을 렌더링하고, 두 번째 채널은 디바이스의 두 번째 출력으로 렌더링합니다. 이를 통해 오디오 제작 애플리케이션은 외부 믹서 또는 오디오 스토리지 디바이스(하드 디스크, ADAT 등)와 같은 디바이스에 직접 다중 채널 데이터를 출력할 수 있습니다. 예를 들어 다음 표와 같이 48개 채널 스트림의 채널이 할당될 수 있습니다.

채널 번호 콘텐츠 0

보컬

1

드럼

2

기타

3

베이스

...

47

피아노

이러한 종류의 원시 오디오 데이터의 경우 화자 위치는 의미가 없으며, 스피커 위치를 입력 또는 출력 스트림에 할당하면 원치 않는 부작용이 발생할 수 있습니다. 예를 들어 KMixer와 같은 구성 요소는 3D 가상화 또는 Dolby Surround Pro 논리 인코딩과 같은 스피커별 효과를 스트림에 적용하여 부적절하게 개입할 수 있습니다. 원시 데이터 채널의 수는 채널 마스크의 비트 수로 제한되지 않습니다.

오디오 편집을 위해 특별히 설계되지 않은 디바이스도 일반적으로 KSPROPERTY_AUDIO_CHANNEL_CONFIG set-property 요청을 수락하여 스피커 구성을 KSAUDIO_SPEAKER_DIRECTOUT 변경해야 합니다. 일반적으로 디바이스는 출력이 스피커에 연결되어 있고 다른 용도(예: 외부 믹서에 대한 입력)를 위해 외부에서 사용할 수 없는 경우를 확인하지 않는 한 요청 실패를 방지해야 합니다.

직접 출력 모드를 사용하는 애플리케이션은 일반적으로 특정 하드웨어 디바이스에 대해 작성됩니다. 이를 통해 애플리케이션은 채널 수와 해당 채널의 데이터를 해석하는 방법을 포함하여 디바이스에서 지원하는 직접 출력 데이터 형식을 미리 알 수 있습니다. 이 지식은 애플리케이션이 직접 출력 모드로 구성된 디바이스에서 IDirectSound::GetSpeakerConfig 를 호출할 때 디바이스가 이 모드에 있음을 확인하는 것일 뿐이므로 필요합니다. 직접 출력 모드에서 지원하는 스트림 형식의 채널 수에 대한 추가 정보는 제공하지 않습니다. (그러나 이 정보는 디바이스의 믹서 핀에 있는 슈퍼믹서 노드에 KSPROPERTY_AUDIO_MIX_LEVEL_CAPS get-property 요청을 전송하여 가져올 수 있습니다. DirectSound Node-Ordering 요구 사항을 참조하세요.)

직접 출력 스트림에 대한 웨이브 형식을 지정할 때 애플리케이션은 WAVEFORMATEXTENSIBLE 구조체의 dwChannelMask 멤버를 KSAUDIO_SPEAKER_DIRECTOUT 값(0)으로 설정해야 합니다. 채널 마스크가 0이면 스피커 위치가 정의되지 않음을 나타냅니다. 언제나처럼 스트림의 채널 수는 Format.nChannels 멤버에 지정됩니다.

하드웨어 공급업체는 디바이스가 직접 출력 모드로 구성된 경우 DirectSound 하드웨어 가속을 지원할 수 있습니다. DirectSound 애플리케이션은 사용 가능한 경우 디바이스의 혼합 핀 중 하나를 통해 직접 출력 스트림을 재생할 수 있습니다. 사용 가능한 모든 하드웨어 핀 인스턴스가 모두 소진되면 모든 새 스트림이 대신 KMixer를 통과합니다.

직접 출력 모드로 구성된 디바이스에 대한 스트림을 혼합할 때 KMixer는 애플리케이션의 입력 스트림 채널과 디바이스에 출력하는 혼합 스트림의 채널 간에 일대일 매핑을 적용합니다. 즉, 애플리케이션이 동일한 수의 채널을 포함하는 여러 직접 출력 스트림을 생성하는 경우 출력 조합의 각 채널 N은 단순히 KMixer를 입력하는 모든 스트림의 채널 N의 합계입니다.

포함된 채널 수와 다른 여러 직접 출력 스트림을 혼합하는 경우 KMixer의 혼합 알고리즘은 약간 더 복잡합니다. 이 경우 혼합의 각 채널 N은 채널 N이 있는 모든 입력 스트림의 채널 N의 합계입니다. 예를 들어 KMixer가 쿼드 및 스테레오 입력 스트림을 혼합하여 쿼드 출력 혼합을 형성하는 경우 채널 0과 출력 조합 중 하나는 각각 입력 스테레오 및 쿼드 스트림의 채널 0과 1의 합계입니다. 스테레오 입력 스트림은 쿼드 입력 스트림의 마지막 두 채널에서만 가져온 혼합의 채널 2와 3에 아무 것도 기여하지 않습니다.

다음 중 하나를 수행하려고 하는 애플리케이션은 예측할 수 없는 동작을 초래할 수 있습니다.

  • 직접 출력 모드로 구성된 디바이스를 통해 직접 출력 형식이 아닌 스트림을 재생합니다.

  • 직접 출력 모드로 구성되지 않은 디바이스를 통해 직접 출력 스트림을 재생합니다.

이러한 경우 중 하나에 직면하면 KMixer는 단순히 스트림을 열려는 시도에 실패하지 않도록 방지합니다. 대신 위에서 설명한 일대일 매핑 알고리즘을 사용하여 명백한 비호환성을 처리하려고 합니다. 사용자가 결과에 만족할 수도, 그렇지 않을 수도 있습니다. 다른 오디오 구성 요소는 KMixer와 동일한 방식으로 이러한 경우를 처리할 수 없습니다. 예를 들어 직접 출력 모드로 구성된 디바이스의 드라이버는 직접 출력 형식이 아닌 출력 스트림에 대한 하드웨어 버퍼를 열려는 시도에 실패하고 그 반대의 경우도 마찬가지입니다.

오디오 제작 애플리케이션은 사용자가 출력 스트림의 처음 여러 채널에 혼합된 데이터를 수신 대기하도록 허용해야 하지만 스트림의 나머지 채널에 여전히 포함된 원시 데이터를 무시해야 할 수 있습니다. KMixer의 동작은 이 작업을 간단하게 만듭니다. 예를 들어 24개 채널 재생 스트림에 채널 0과 1의 스테레오 혼합과 채널 2~23의 원시 데이터가 포함된 경우 애플리케이션은 다음을 수행합니다.

  • DSSPEAKER_STEREO 함께 SetSpeakerConfig 를 호출하여 스테레오 모드에서 대상 오디오 디바이스(애플리케이션이 스트림을 편집하는 데 사용하는 디바이스일 필요는 없음)를 구성합니다.

  • 재생 스트림의 WAVEFORMATEXTENSIBLE 구조에서 dwChannelMask를 KSAUDIO_SPEAKER_STEREO 변경하지만 Format.nChannels는 스트림의 총 채널 수인 24로 설정됩니다.

KMixer는 채널 마스크에 설명된 재생 스트림의 스테레오 채널만 혼합하고 원시 데이터를 포함하는 나머지 22개 채널을 삭제합니다. DirectSound 스피커 구성 설정에 대한 변경 내용은 현재 DirectSound 개체가 제거되고 다른 개체가 생성될 때까지 적용되지 않습니다( Speaker-Configuration 설정 적용 참조).