오디오 엔드포인트 작성기 알고리즘

Windows Vista 이상 버전의 Windows에서 AudioEndpointBuilder는 시스템의 오디오 엔드포인트를 열거, 초기화 및 활성화하는 시스템 서비스입니다. 이 항목에서는 AudioEndpointBuilder 서비스에서 사용하는 알고리즘에 대한 개요를 제공합니다.

AudioEndpointBuilder 서비스는 알고리즘을 사용하여 엔드포인트를 검색하고 열거합니다. 이 알고리즘은 MUXed(멀티플렉싱) 캡처 디바이스에 대한 시스템 액세스를 간소화하고 여러 호스트 핀과 여러 브리지 핀 또는 둘 다를 포함하는 토폴로지 작업을 지원하도록 설계되었습니다.

Windows XP에서 오디오 모델은 오디오 디바이스라는 용어를 사용하여 플러그 앤 플레이(PnP) 트리의 개념적 디바이스를 참조했습니다. Windows Vista 이상 버전의 Windows에서는 사용자가 물리적으로 상호 작용하는 디바이스를 더 잘 나타내기 위해 오디오 디바이스의 개념이 다시 디자인되었습니다.

Windows Vista의 두 가지 새 API인 MMDevice APIWASAPI를 사용하면 이러한 새 오디오 디바이스에 액세스하고 조작할 수 있습니다. MMDevice API는 새 오디오 디바이스를 엔드포인트로 참조합니다.

AudioEndpointBuilder 서비스는 디바이스 인터페이스 도착 및 제거에 대한 KSCATEGORY_AUDIO 클래스를 모니터링합니다. 오디오 디바이스 드라이버가 KSCATEGORY_AUDIO 디바이스 인터페이스 클래스의 새 instance 등록하면 AudioEndpointBuilder 서비스는 디바이스 인터페이스 알림을 검색하고 알고리즘을 사용하여 시스템에서 오디오 디바이스의 토폴로지를 검사하고 적절한 조치를 취합니다.

다음 목록에서는 AudioEndpointBuilder에서 사용하는 알고리즘의 작동 방식을 요약합니다.

  1. 연결되지 않은 브리지 핀을 찾습니다.

  2. 연결되지 않은 브리지 핀에 대한 엔드포인트를 만듭니다. 예를 들어 AudioEndpointBuilder가 KSNODETYPE_SPEAKER 핀 범주 GUID가 있는 연결되지 않은 브리지 핀을 찾으면 이 브리지 핀에 대한 스피커 엔드포인트를 만듭니다. KSNODETYPE_SPEAKER 및 기타 핀 범주 GUID에 대한 자세한 내용은 WinDDK\build number>\<inc\api의 Ksmedia.h를 참조하세요.

  3. 엔드포인트의 기본 속성을 설정합니다. 예를 들어 AudioEndpointBuilder는 이름, 아이콘 및 폼 팩터를 설정합니다.

  4. 엔드포인트에서 PCM(펄스 코드 변조), AC3(오디오 코덱-3) 또는 WMV(Windows 미디어 비디오)를 지원하는 호스트 핀에 대한 경로가 있는지 여부를 결정합니다. 호스트 핀은 Communication 멤버가 KSPIN_COMMUNICATION_SINK 또는 KSPIN_COMMUNICATION_BOTH 설정된 KSPIN 구조체입니다. KSPIN 구조에 대한 자세한 내용은 KSPIN을 참조하세요.

  5. 오디오 디바이스 인터페이스의 레지스트리 키에서 속성 정보로 엔드포인트 PropertyStore를 채웁니다.

  6. 엔드포인트의 상태를 설정합니다. 엔드포인트의 상태는 다음 세 가지 값 중 하나일 수 있습니다.

    • 활성 이는 4단계에서 설명한 대로 경로가 있음을 나타냅니다.

    • 분리. 오디오 디바이스가 잭 검색을 지원하는 경우 이 상태는 엔드포인트에 대한 경로가 있고 오디오 어댑터의 물리적 커넥터에서 잭이 분리되었음을 나타냅니다.

    • 존재하지 않습니다. 이 상태는 4단계에서 경로를 찾을 수 없으며 잭 검색이 이 엔드포인트에서 지원되지 않음을 나타냅니다.

  7. 연결된 INF 파일에 지정된 경우 이 엔드포인트를 기본 엔드포인트로 설정합니다.

엔드포인트가 열거된 후 오디오 시스템의 클라이언트는 새 Windows Vista API(앞에서 설명한 대로)를 사용하거나 웨이브, DirectShow 또는 DirectSound 와 같은 친숙한 API를 사용하여 간접적으로 조작할 수 있습니다. 오디오 클라이언트가 엔드포인트의 MMDevice ID로 시작하고 동일한 엔드포인트에 대한 Wave 또는 DirectSound ID에 액세스할 수 있도록 새 API 메서드가 제공되었습니다.

엔드포인트를 사용하는 경우 다음을 활용할 수 있습니다.

  • 컴퓨터를 다시 시작하는 빈도에 관계없이 동일한 GUID(Globally Unique ID)를 사용할 수 있습니다. 이 영구 GUID는 waveOut ID 또는 엔드포인트에 대한 식별 이름을 저장하는 것보다 더 안정적입니다.

  • 컴퓨터를 다시 시작하는 빈도에 관계없이 동일한 PropertyStore를 사용할 수 있습니다. 오디오 디바이스 관련 메타데이터는 엔드포인트 PropertyStore에 저장됩니다.

  • MUX(멀티플렉싱) 및 DEMUX(de-multiplexed) 핀은 AudioEndpointBuilder 서비스에 의해 자동으로 관리되고 열거됩니다.

오디오 장치와 함께 작동하도록 고유한 오디오 장치 드라이버 및 INF 파일을 개발하고 오디오 애플리케이션 또는 둘 다를 개발하는 경우 다음 문제와 모범 사례를 인식하는 것이 가장 좋습니다. 이러한 권장 사항을 염두에 두고 드라이버 및 애플리케이션을 개발할 때 AudioEndpointBuilder에서 보다 효과적으로 작동하는 드라이버, INF 파일 및 오디오 클라이언트를 생성합니다.

  • 명명 규칙. 엔드포인트에 사용되는 명명 규칙은 브리지 핀의 이름을 기반으로 합니다. 그러나 스피커 엔드포인트의 경우 이름은 "Speaker"로 하드 코딩되었으며 드라이버 또는 타사 애플리케이션에서 변경할 수 없습니다.

  • 최적이 아닙니다. 특정 토폴로지는 AudioEndpointBuilder가 엔드포인트를 열거하는 데 사용하는 알고리즘 때문에 최적이 아닐 것으로 간주됩니다. 예를 들어 이러한 최적이 아닐 토폴로지 중 하나를 만들 때는 숨겨진 엔드포인트가 있고 AudioEndpointBuilder 또는 AudioEndpointBuilder가 연결된 호스트 핀에 연결할 수 없는 분할 엔드포인트(분할 엔드포인트)에서 볼 수 없는 호스트 핀을 만듭니다.

    • 숨겨진 엔드포인트

      다음 다이어그램에서 KS 필터에는 단일 브리지 핀(Speaker)에 연결된 두 개의 호스트 핀이 있는 것으로 표시됩니다.

      왼쪽, 개별 PCM 및 AC-3 공유 단일 필터에 AC-3 호스트 핀 및 숨겨진 엔드포인트가 있는 문제가 있는 토폴로지를 보여 주는 다이어그램

      AudioEndpointBuilder는 이 브리지 핀을 검색하면 호스트 핀 중 하나에 대한 경로를 다시 추적하고, 브리지 핀의 기본값을 설정하고, 스피커 엔드포인트를 만들고 활성화하며, 다른 브리지 핀을 계속 검색합니다. 따라서 다른 호스트 핀은 AudioEndpointBuilder에서 숨겨집니다.

      호스트 핀과 엔드포인트 간에 추적 가능한 경로가 있는 권장 토폴로지를 보여 주는 다이어그램

      이전 다이어그램에서 문제가 있는 토폴로지를 다시 디자인하여 AudioEndpointBuilder가 이제 두 개의 브리지 핀(Speaker 및 SPDIF)을 볼 수 있으므로 두 개의 호스트 핀(PCM 및 AC-3/PCM)을 검색할 수 있습니다.

    • 스플리터

      다른 유형의 최적이 아닌 토폴로지는 하나의 호스트 핀이 둘 이상의 브리지 핀에 연결할 때 만들어집니다. 다음 다이어그램은 PCM 호스트 핀이 스피커 브리지 핀 및 SPDIF 브리지 핀에 연결하는 토폴로지를 보여 줍니다.

      하나의 호스트 핀과 단일 PCM에 연결된 두 개의 엔드포인트가 있는 문제가 있는 토폴로지를 보여 주는 다이어그램

      이 경우 AudioEndpointBuilder는 하나의 브리지 핀을 검색하고 PCM 호스트 핀으로 돌아가는 경로를 추적하고 기본값을 설정한 다음 스피커 엔드포인트를 만들고 활성화합니다. AudioEndpointBuilder는 다음 브리지 핀을 검색하면 동일한 PCM 호스트 핀으로 다시 경로를 추적하고 기본값을 설정한 다음 SPDIF 엔드포인트를 만들고 활성화합니다. 그러나 두 엔드포인트가 모두 초기화되고 활성화되었지만 그 중 하나로 스트리밍하면 동시에 다른 엔드포인트로 스트리밍할 수 없습니다. 즉, 상호 배타적인 엔드포인트입니다.

      다음 다이어그램에서는 별도의 연결이 있는 이 토폴로지의 재설계를 보여 줍니다. 이 설계를 통해 AudioEndpointBuilder는 두 브리지 핀 각각에 대한 PCM 호스트 핀에 대한 경로를 추적할 수 있습니다.

      왼쪽에 두 개의 PCM이 있는 호스트 핀과 엔드포인트 간에 추적 가능한 경로가 있는 권장 토폴로지를 보여 주는 다이어그램.

  • 엔드포인트 형식입니다. 오디오 엔진이 공유 모드로 실행되는 경우 엔드포인트의 형식은 설치 시 INF 파일에서 지시하는 특정 설정을 가정합니다. 예를 들어 오디오 디바이스의 오디오 드라이버는 연결된 INF 파일을 사용하여 기본 엔드포인트를 44.1kHz, 16비트 스테레오 PCM 형식으로 설정합니다. 설치 후 제어판 또는 타사 애플리케이션을 사용하여 엔드포인트 형식을 변경해야 합니다.

  • 기본 디바이스. 기본 디바이스로 설정된 엔드포인트는 설치 시 INF 파일의 정보를 사용하여 선택됩니다. 설치가 완료되면 제어판 또는 타사 애플리케이션을 사용하여 다른 엔드포인트를 기본 엔드포인트로 선택해야 합니다.

참고 INF 파일이 설치 중에 기본값으로 설정할 엔드포인트를 선택하지 않는 경우 클라이언트 애플리케이션은 MMDevice API를 사용하여 엔드포인트를 선택할 수 있습니다. API는 폼 팩터 순위 및 엔드포인트가 렌더링 또는 캡처 엔드포인트인지 여부에 따라 선택됩니다. 다음 표에는 선택 순서가 표시됩니다.

렌더링 순위 순위 캡처
스피커 마이크
줄 바꿈 줄 바꿈
Spdif Spdif

MMDevice API를 사용하여 기본 엔드포인트를 선택하고 사용 가능한 엔드포인트의 순위가 동일한 경우 MMDevice API는 엔드포인트 ID를 사전순으로 정렬하여 기본값으로 선택할 엔드포인트를 결정합니다. 예를 들어 오디오 어댑터에 라인아웃 및 라인인 커넥터가 둘 다 있고 연결된 INF 파일이 설치 시 기본값으로 선택되지 않는 경우 MMDevice API는 사전순으로 첫 번째 엔드포인트 ID를 식별하고 해당 커넥터를 기본값으로 설정합니다. 이 선택은 엔드포인트 ID가 영구적이므로 시스템을 다시 시작한 후에도 유지됩니다. 그러나 순위가 높은 엔드포인트(예: 마이크 커넥터가 있는 두 번째 어댑터)가 시스템에 표시되면 선택 영역이 유지되지 않습니다.