다중 채널 노드 노출

Windows XP 이전 버전의 Microsoft Windows에서는 WDM 오디오 드라이버가 다음과 같은 유형의 다중 채널 노드를 노출하는 간소화된 방법이 없습니다.

KSNODETYPE_VOLUME

KSNODETYPE_MUTE

KSNODETYPE_TONE

특히 노드가 지원하는 채널 수에 대해 노드를 명시적으로 쿼리하는 메커니즘이 없습니다. 이 문제에 대한 해결 방법이 있지만 단점이 있습니다. 예를 들어 클라이언트는 KSPROPERTY_AUDIO_VOLUMELEVEL 속성을 사용하여 요청이 더 이상 채널이 없음을 나타내는 오류를 반환할 때까지 각 채널의 볼륨 수준(0, 1 등)에 대해 볼륨 노드(KSNODETYPE_VOLUME)를 반복적으로 쿼리할 수 있습니다. 그러나 이 기술은 여러 쿼리가 필요하며 최신 다중 채널 오디오 디바이스를 처리하기에는 너무 비효율적입니다. Windows XP 이상 운영 체제에서 이 제한 사항은 속성 처리기가 기본 지원 쿼리에 대한 응답으로 출력하는 KSPROPERTY_MEMBERSHEADER 구조의 Flags 멤버에서 두 개의 추가 플래그 비트를 정의하여 해결됩니다.

  • KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL

    노드에서 기본 지원 속성 요청 중에 처리기는 이 플래그 비트를 설정하여 KSPROPERTY_MEMBERSHEADER MembersCount 멤버에 노드가 지원하는 채널 수가 포함되어 있음을 나타냅니다. Windows Vista 이상 Windows 운영 체제의 경우 모든 채널 속성에 대해 이 플래그를 설정해야 합니다.

  • KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM

    처리기는 이 플래그 비트와 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 플래그 비트 간에 비트 OR를 수행하여 단일 속성 값이 노드의 모든 채널에 균일하게 적용됨을 나타냅니다. 예를 들어 하드웨어가 모든 채널에 대해 단일 볼륨 수준 컨트롤만 제공하는 경우 볼륨 노드의 기본 지원 처리기는 이 제한을 나타내도록 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그를 설정합니다. 이 플래그를 설정하지 않으면 각 채널의 볼륨 수준을 다른 채널의 볼륨 수준과 독립적으로 제어할 수 있습니다.

    참고 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그는 Windows Vista 운영 체제에서 사용되지 않습니다.

Windows XP 이상용 미니포트 드라이버에서 다중 채널 볼륨 노드의 속성 처리기는 KSPROPERTY_AUDIO_VOLUMELEVEL 기본 지원 쿼리에 대한 응답으로 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 비트를 설정해야 합니다. 처리기는 노드에서 노출하는 각 채널에 대해 하나씩 KSPROPERTY_STEPPING_LONG 구조의 배열을 반환하고 MembersSizesizeof(KSPROPERTY_STEPPING_LONG)로 설정합니다. 각 배열 요소는 채널의 최소 및 최대 볼륨 수준과 범위의 연속 값 사이의 델타를 설명합니다. 균일하지 않은 범위의 채널이 올바르게 노출될 수 있도록 각 개별 채널에 대해 다른 범위를 지정할 수 있습니다. 예를 들어 하위 우퍼 채널에는 다른 채널과 다른 범위가 있을 수 있습니다.

다음 코드 예제에서는 비일관 속성 값을 사용 하 고 오디오 속성에 대 한 기본 지원 쿼리를 처리 하는 방법을 보여 주세요. 아래 코드의 첫 번째 줄에 있는 변수 pDescription은 처리기가 기본 지원 정보를 작성하는 데이터 버퍼의 시작 부분에 있는 KSPROPERTY_DESCRIPTION 구조를 가리킵니다.

  //
  // Fill in the members header.
  //
  PKSPROPERTY_MEMBERSHEADER pMembers = PKSPROPERTY_MEMBERSHEADER(pDescription + 1);

  pMembers->MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES;
  pMembers->MembersSize = sizeof(KSPROPERTY_STEPPING_LONG);
  pMembers->MembersCount = ulNumChannels;
  pMembers->Flags = KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL;

  //
  // Fill in the stepped range with the driver default.
  //
  PKSPROPERTY_STEPPING_LONG pRange = PKSPROPERTY_STEPPING_LONG(pMembers + 1);
  pRange->Reserved = 0;

  for (ULONG i=0; i<ulNumChannels; i++)
  {
      pRange[i].Bounds.SignedMinimum = ulChannelMin[i];
      pRange[i].Bounds.SignedMaximum = ulChannelMax[i];
      pRange[i].SteppingDelta = ChannelStepping[i];
  }

  pPropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION) +
                                sizeof(KSPROPERTY_MEMBERSHEADER) + 
                                ulNumChannels * sizeof(KSPROPERTY_STEPPING_LONG);

다음 그림에서는 이 예제에 대한 데이터 버퍼의 레이아웃을 보여줍니다. pDescription, pMembers 및 pRange 포인터는 버퍼 내의 해당 오프셋을 가리키는 것으로 표시됩니다.

pDescription, pMembers 및 pRange 포인터를 사용하여 기본 지원 쿼리에 대한 데이터 버퍼의 레이아웃을 보여 주는 다이어그램

이 예제에서 처리기는 MembersCount 를 채널 수인 ulNumChannels로 설정합니다. 범위 배열의 크기(바이트)는 입니다.

MembersSize * MembersCount

이 예제에서 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그를 설정한 경우 처리기는 배열의 모든 KSPROPERTY_STEPPING_LONG 구조를 동일한 범위로 설정합니다.

톤 노드의 KSPROPERTY_AUDIO_BASS, KSPROPERTY_AUDIO_TREBLE 또는 KSPROPERTY_AUDIO_MID 속성에 대한 기본 지원 처리기는 비슷한 방식으로 작동합니다.

다중 채널 노드에 BOOL 형식의 채널별 속성 값이 있는 속성이 있는 경우 기본 지원 처리기는 단계별 배열에 대한 값을 입력해야 합니다. 이 경우 처리기는 멤버를 다음 코드 예제에 표시된 값으로 설정합니다. 이 유형의 속성의 두 가지 예는 음소거 노드의 KSPROPERTY_AUDIO_MUTE 속성과 톤 노드의 KSPROPERTY_AUDIO_BASS_BOOST 속성입니다.

다음 코드 예제에서는 BOOL 형식의 채널별 속성 값이 있는 속성의 경우 다중 채널 노드에 대한 기본 지원 요청을 처리하는 방법을 보여 줍니다.

  //
  // Fill in the members header.
  //
  PKSPROPERTY_MEMBERSHEADER pMembers = PKSPROPERTY_MEMBERSHEADER(pDescription + 1);

  pMembers->MembersFlags = KSPROPERTY_MEMBER_STEPPEDRANGES;
  pMembers->MembersSize = sizeof (KSPROPERTY_STEPPING_LONG);
  pMembers->MembersCount = ulNumChannels;
  pMembers->Flags = KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL;

  pPropertyRequest->ValueSize = sizeof(KSPROPERTY_DESCRIPTION) +
                                sizeof(KSPROPERTY_MEMBERSHEADER) + 
                                ulNumChannels * sizeof(KSPROPERTY_STEPPING_LONG);

  //
  // Fill in the stepped range with values in FOR loop.
  //
  PKSPROPERTY_STEPPING_LONG pRange = PKSPROPERTY_STEPPING_LONG(pMembers + 1);
  pRange->Reserved = 0;

  for (ULONG i=0; i<ulNumChannels; i++)
  {
      pRange[i].Bounds.SignedMinimum = 0;
      pRange[i].Bounds.SignedMaximum = 1;
      pRange[i].SteppingDelta = 1;
  }

앞의 코드 예제에서 FOR 루프는 0(0) 및 1(1)을 사용하여 채널별 범위에 대한 최소값과 최대값을 설정합니다. BOOL 형식의 채널별 속성 값을 사용하여 다중 채널 노드를 구성하기 때문입니다.

채널 속성이 균일하면 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그와 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 플래그와 pMembers-Flags> 멤버에 할당된 결과 간에 비트 OR 작업을 수행할 수 있습니다. 이 값은 하드웨어가 노드의 모든 채널에 동일한 속성 값을 균일하게 적용함을 나타내는 데 사용됩니다.

KSPROPERTY_MEMBER_FLAG_UNIFORM 및 KSPROPERTY_MEMBER_FLAG_MULTICHANNEL 플래그를 사용하면 WDK(Windows 드라이버 키트)의 Ac97 샘플 드라이버에서와 같이 채널을 쌍으로 그룹화하고 각 채널 쌍에 대해 별도의 스테레오 볼륨 노드를 노출할 필요가 없습니다. Windows XP 이전의 Windows 버전은 이러한 플래그를 지원하지 않으므로 드라이버의 기본 지원 처리기는 IPortClsVersion 인터페이스를 사용하여 이러한 플래그를 사용할지 여부를 결정하기 위해 Portcls.sys 버전을 쿼리해야 합니다.

토폴로지 파서(커널 모드 WDMAud 시스템 드라이버에서 Wdmaud.sys)는 WDM 오디오 드라이버에서 오디오 디바이스의 토폴로지를 가져옵니다. 파서는 레거시 Windows 멀티미디어 믹서 API를 통해 해당 디바이스를 기존 믹서 디바이스로 노출합니다. Windows XP 이상에서 WDMAud는 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_MULTICHANNEL 플래그를 사용하여 MIXERLINE 구조체의 cChannels 멤버에서 보고할 채널 수를 결정합니다. 또한 노드의 기본 지원 처리기가 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그를 지정하는 경우 WDMAud는 해당 MIXERCONTROL 구조에서 MIXERCONTROL_CONTROLF_UNIFORM 플래그를 설정합니다. 이 플래그를 통해 애플리케이션은 master 컨트롤을 통해 각 채널을 개별적으로 조정할 수 있는지 또는 모든 채널을 균일하게 조정할 수 있는지 여부를 결정할 수 있습니다. MIXERCONTROL, MIXERLINE 및 믹서 API에 대한 자세한 내용은 Microsoft Windows SDK 설명서를 참조하세요.

Windows XP 이상에서 SndVol32 볼륨 제어 프로그램( SysTray 및 SndVol32 참조)은 다음 그림과 같이 다중 채널 디바이스에 대한 컨트롤을 표시합니다.

다중 채널 디바이스에 대한 컨트롤을 표시하는 SndVol32 볼륨 제어 대화 상자의 스크린샷

SndVol32에서 채널이 두 개 이상 있는 선을 감지하면 일반 팬 컨트롤을 앞 그림의 기본 볼륨 슬라이더 위에 나타나는 스피커 볼륨이라는 레이블이 지정된 단추로 바꿉니다. 스피커 볼륨 단추를 클릭하면 다음 그림과 같이 특정 줄의 모든 채널에 대한 컨트롤을 표시하는 대화 상자가 표시됩니다.

모든 채널 및 고급 오디오 속성에 대한 컨트롤을 표시하는 스피커 볼륨 대화 상자의 스크린샷.

믹서 API는 채널을 숫자로 노출하므로 windows 멀티미디어 제어판(Mmsys.cpl)의 고급 오디오 속성 대화 상자에서 현재 선택된 스피커 구성의 채널 이름을 유추합니다.

예를 들어 디바이스가 한 줄에 4개의 채널을 노출하고 사용자가 "Quadraphonic 스피커"를 선택한 경우 채널 이름은 앞 그림과 같이 "왼쪽"(채널 0), "오른쪽"(채널 1), "왼쪽 뒤로"(채널 2) 및 "오른쪽 뒤로"(채널 3)가 됩니다. 스피커 구성을 "서라운드 사운드 스피커"로 변경하면 "왼쪽"(채널 0), "오른쪽"(채널 1), "프런트 센터"(채널 2) 및 "백 센터"(채널 3)의 채널 매핑이 발생합니다.

드라이버 수준에서 KSPROPERTY_AUDIO_CHANNEL_CONFIG 속성은 각각 쿼드라포닉 또는 서라운드 스피커 구성을 나타내기 위해 KSAUDIO_SPEAKER_QUAD 또는 KSAUDIO_SPEAKER_SURROUND 마스크 값을 사용합니다. 헤더 파일 Ksmedia.h는 다음과 같이 이러한 값을 정의합니다.

  #define KSAUDIO_SPEAKER_QUAD      (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
                                     SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)

  #define KSAUDIO_SPEAKER_SURROUND  (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | \
                                     SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)

두 마스크 모두 4개 채널의 화자 위치를 지정하는 4비트입니다. 두 경우 모두 KSPROPERTY_AUDIO_VOLUMELEVEL 속성은 각각 채널 0, 1, 2 및 3과 동일한 4개의 채널을 식별합니다.

노드의 기본 지원 처리기가 KSPROPERTY_MEMBER_FLAG_BASICSUPPORT_UNIFORM 플래그 비트를 설정하는 경우 스피커 볼륨 대화 상자에 표시된 슬라이더가 단일 슬라이더에 대한 변경 내용과 함께 함께 이동합니다.