다음을 통해 공유


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

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 디바이스 인터페이스 클래스의 새 인스턴스를 등록하면 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 미디어 비디오)를 지원하는 호스트 핀으로의 경로가 있는지 여부를 결정합니다. 호스트 핀은 통신 멤버가 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는 웨이브아웃 ID 또는 엔드포인트에 대한 친숙한 이름을 저장하는 것보다 더 안정적입니다.

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

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

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

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

  • 비최적의 토폴로지. 특정 토폴로지는 AudioEndpointBuilder가 엔드포인트를 열거하는 데 사용하는 알고리즘 때문에 최적이 아닐 것으로 간주됩니다. 예를 들어, 최적이 아닌 토폴로지 중 하나를 만들면, 숨겨진 엔드포인트가 있는 호스트 핀을 생성하게 되며, 이 핀들은 AudioEndpointBuilder나 스플리터(분할 엔드포인트)에서 관련된 호스트 핀과 연결될 수 없습니다.

    • 숨겨진 엔드포인트

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

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

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

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

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

    • 스플리터

      한 호스트 핀이 둘 이상의 브리지 핀에 연결할 때 또 다른 유형의 최적이 아닌 토폴로지가 만들어집니다. 다음 다이어그램은 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가 영구적이므로 시스템을 다시 시작한 후에도 유지됩니다. 그러나 순위가 높은 엔드포인트(예: 마이크 커넥터가 있는 두 번째 어댑터)가 시스템에 표시되면 선택 영역이 유지되지 않습니다.