다음을 통해 공유


ACX 다중 회로 컴퍼지션

이 항목에서는 ACX 다중 회로 컴퍼지션에 대해 설명합니다. ACX에 대한 일반적인 개요 및 ACX 용어 목록은 ACX 오디오 클래스 확장 개요를 참조하세요.

ACX 개체 요약에 설명된 대로 AcxCircuit은 사용자가 인식한 오디오 디바이스(스피커, 마이크 등)에 대한 부분 또는 전체 오디오 경로를 나타냅니다. AcxCircuit에는 하나 이상의 입력 핀과 하나의 출력 핀(ACXPIN)이 있으며 하나 이상의 AcxElements와 유사한 개체를 집계할 수 있습니다. 일반적인 내용은 ACX 회로를 참조 하세요.

ACX 회로 컴퍼지션

ACX는 완전한 오디오 경로를 형성할 때까지 회로를 함께 바인딩합니다. ACX는 오디오 바인딩을 사용하여 오디오 회로를 함께 연결합니다. 동시에 각 ACX 회로는 KS 필터로 변환되고, 이러한 KS 필터는 사용자 모드 서비스로 실행되는 AEB(오디오 엔드포인트 작성기)에 의해 검색됩니다. AEB는 검색된 KS 필터 그래프를 검색하고 전체 오디오 경로를 감지할 때 밑줄 오디오 인프라를 나타내는 소프트웨어 오디오 엔드포인트를 만듭니다.

다음 다이어그램에서는 복합 오디오 엔드포인트를 구성하는 회로를 감지, 빌드 및 모니터링하기 위해 ACX에서 사용하는 ACX 개체를 보여 줍니다.

ACXCIRCUITTEMPLATE, ACXCOMPOSITEMANAGER, ACXMANAGER, ACXCIRCUITFACTORY 및 ACXCIRCUIT을 사용한 ACX 대상 아키텍처를 보여 주는 다이어그램.

Important

파란색으로 표시된 형식만 공용입니다. ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE(표시되지 않음), ACXMANAGER, ACXCIRCUITFACTORY 및 ACXCIRCUIT. 바이올렛에 표시된 모든 형식은 내부 형식이며 여기에 설명용으로만 나열됩니다. 내부 형식은 동일하게 유지되거나 다른 ACX 릴리스에서 사용할 수 있도록 보장되지 않으며 직접 호출하거나 사용해서는 안 됩니다.

ACX 관리자는 ACX 드라이버가 ACX 관리자에 등록할 때 드라이버 초기화 시간에 회로 템플릿을 구문 분석합니다. ACX 드라이버는 ACXCIRCUTTEMPLATES(#1)를 사용하여 복합 템플릿/바인딩을 등록합니다.

ACX 관리자가 회로 템플릿을 받으면 인스턴스 템플릿 또는 제네릭 클래스 템플릿인 경우 검사.

인스턴스 템플릿의 경우 ACX는 ACXCOMPOSITEMANAGER(#4)을 만듭니다. 제네릭 클래스 템플릿의 경우 ACX는 복합의 '코어' 회로를 감지할 때 ACXCOMPOSITEFACTORY 항목(#3)을 만드는 데 책임이 있는 ACXCOMPOSITEFACTORY(#2)를 만듭니다. 코어 회로는 복합 오디오 엔드포인트에 ID를 제공하는 회로입니다.

ACXCOMPOSITEMANAGER은 차례로 ACXCOMPOSITE(#5)를 만들어 밑줄 복합 오디오 엔드포인트를 나타냅니다. 복합 관리자는 복합을 만들거나 초기화한 후에 발생할 수 있는 선택적 회로 세그먼트를 모니터링합니다.

ACXCOMPOSITE는 복합 회로의 일부인 각 회로에 대해 ACXCIRCUITMANAGER(#6)을 만듭니다. ACXCIRCUITMANAGER은 단일 회로(#7)를 만들고, 모니터링하고, 제어합니다.

회로에 '주문형' 태그가 지정될 수 있습니다. 이러한 경우 ACXCIRCUITMANAGER은 회로 팩터리를 찾아 복합(#8)에 대한 새 회로를 요청합니다. ACXCIRCUITFACTORY는 ACXCIRCUIT을 요청으로 만듭니다(#9).

모든 ACXCIRCUIT가 감지되고 활성화되면 ACXCOMPOSITE도 활성화되고 ACXCIRCUITMANAGERS에 회로에 대한 '오디오' 인터페이스를 켜도록 지시합니다.

다음 시퀀스 다이어그램에서는 두 개의 ACX 회로(회로 A와 B)를 함께 바인딩하여 소프트웨어 오디오 디바이스를 사용하여 AEB(오디오 엔드포인트 작성기)가 나타내는 전체 오디오 경로를 만드는 방법을 보여 줍니다.

드라이버 A, 드라이버 B, ACX 인터페이스 B, 회로 관리자 A 및 B, ACX 복합 및 ACX 관리자라는 레이블이 지정된 열이 있는 다이어그램은 열 사이에 흐름 화살표가 있는 호출 시퀀스를 보여 줍니다.

다중 회로 형식 협상

이 섹션에서는 오디오 엔드포인트가 둘 이상의 회로로 구성될 때 발생하는 형식 협상에 대해 설명합니다. ACX 회로에 대한 일반적인 내용은 ACX 다중 스택 크로스 드라이버 통신을 참조 하세요.

아래쪽 브리지 핀

다운레벨 브리지 핀은 물리적 오디오 디바이스에서 직접 또는 간접적으로 데이터를 보내거나(캡처) 데이터를 받는 핀입니다. 이러한 유형의 핀에는 ACXMODEFORMATLIST가 연결되어 있거나 연결되지 않을 수 있습니다. 이러한 브리지 핀에는 'AcxPinQualifierBridgeB' 또는 'AcxPinQualifierBridgeDevice' 유형이 있습니다. ACXMODEFORMATLIST에 대한 자세한 내용은 acxdataformat.h 헤더를 참조 하세요.

스트리밍 핀, 두 회로 및 디바이스 간의 렌더링 및 캡처 데이터 흐름을 보여 주는 다이어그램

이 다이어그램 및 문서에서는 위쪽 또는 아래쪽 스트림 흐름의 방향이 핀이 데이터를 전송(렌더링)하거나 데이터(캡처)를 받는지 여부에 따라 달라지기 때문에 흐름 방향을 설명하는 데 업레벨 및 다운레벨이 사용됩니다.

ACXMODEFORMATLIST가 없는 하위 수준 브리지 핀

드라이버는 하위 수준 핀에 모드 형식 목록을 노출하지 않도록 선택할 수 있습니다. 모드 형식 목록을 하위 수준 브리지 핀에서 사용할 수 없는 경우 사용자(사운드 제어 패널을 통해) 또는 다른 소프트웨어 엔터티는 이 핀 및 연결된 스트림의 오디오 형식을 직접 제어/지정할 수 없습니다. 이러한 목록이 필요하지 않은 몇 가지 시나리오는 다음과 같습니다.

  • DSP 회로, CODEC 회로 또는 오디오 디바이스에 직접 연결할 수 있는 스트리밍 전용 회로입니다. 이러한 회로는 데이터를 수정하지 않고 A 지점에서 B 지점으로 이동하기만 하면 됩니다. 이러한 회로는 들어오는/나가는 스트림의 데이터 샘플 속도를 변경하지 않습니다. 이 경우 모드 형식 목록은 고급 핀과 연결됩니다.

  • 들어오는/나가는 샘플 속도를 수정하는 요소가 없는 단일 스트림 회로입니다. 예를 들어 USB 오디오 디바이스 회로가 있습니다. 이 시나리오에서 모드 형식 목록은 고급 핀과 연결됩니다.

데이터 형식 목록이 없으면 이 핀에서 시작된 스트림의 데이터 형식이 연결된 회로의 업레벨 핀의 데이터 형식 중 하나와 호환된다는 것을 의미합니다.

ACXMODEFORMATLIST를 사용하는 하위 수준 브리지 핀

드라이버는 하위 수준 핀에 모드 형식 목록을 노출하도록 선택할 수 있습니다. 모드 형식 목록을 하위 브리지 핀에서 사용할 수 있는 경우 사용자(사운드 제어판) 또는 기타 소프트웨어 엔터티가 이 핀 및 연결된 스트림의 오디오 형식을 직접 제어/지정할 수 있습니다.

이러한 모드 형식 목록이 사용되는 몇 가지 유효한 시나리오는 다음과 같습니다.

  • DSP 회로 - 일반적으로 이 유형의 회로는 서로 다른 샘플 속도로 실행되는 여러 스트림을 지원하며, 이러한 스트림은 내부적으로 공통 샘플 속도로 변환되고 데이터가 다음 회로로 이동하기 전에 혼합됩니다. 데이터 형식 목록은 최종(이 회로의 경우) 샘플 속도를 제어/지정합니다.

데이터 형식 목록이 있는 경우 이러한 데이터 형식은 다음 회로 핀의 고급 핀에 있는 데이터 형식 샘플과 일치해야 합니다. 모드는 일치할 필요가 없습니다. 아래 섹션에서 모드에 대한 설명을 참조하세요.

하위 수준 서식 목록은 사용자/상층이 결과 스트림의 형식을 제어할 수 있는 기회를 제공합니다. 이 경우 목록의 기본값은 이 핀의 형식을 변경하기 위해 명시적 작업을 수행할 때까지 사용되는 샘플 속도입니다.

서식 목록에 대한 자세한 내용은 acxdataformat.h 헤더를 참조 하세요.

위쪽 브리지 핀

업레벨 브리지 핀은 소프트웨어 모듈에서 직접 또는 간접적으로 데이터를 받거나(렌더링) 데이터를 전송(캡처)하는 핀입니다. 이 유형의 핀에는 ACXMODEFORMATLIST가 연결되어 있어야 합니다. 이러한 브리지 핀에는 'AcxPinQualifierBridgeA' 유형이 있습니다.

여기에 다시 표시된 이전 다이어그램을 사용하여 스트리밍 핀, 두 회로 및 디바이스 간의 렌더링 및 캡처 데이터 흐름을 표시할 수도 있습니다.

스트리밍 핀, 두 회로 및 디바이스 간의 렌더링 및 캡처 데이터 흐름을 보여 주는 다이어그램 화살표는 오른쪽으로 이동하는 렌더링 데이터 흐름을 표시하고 오른쪽에 캡처합니다.

ACXMODEFORMATLIST가 없는 위쪽 [브리지] 핀

모드 형식 목록이 없는 고급 핀은 유효한 조합이 아니며 이로 인해 엔드포인트가 잘못 구성됩니다. 엔드포인트는 사용자 관점에서 볼 수 없습니다.

ACXMODEFORMQATLIST가 있는 위쪽 [브리지] 핀

상류 핀에는 항상 하나 이상의 ACXMODEFORMATLIST가 있어야 합니다. mode-format-lists는 모드에 대해 가능한 모든 샘플 속도와 기본 샘플 속도를 지정합니다. 모드가 다르면 샘플 속도 집합이 다를 수 있습니다. 기본 샘플 속도는 해당 모드에 대한 기본 샘플 속도입니다.

모드 및 회로

단일 스트림 회로 또는 다중 스트림 회로의 업레벨 핀은 하나 이상의 모드 형식 목록을 지원할 수 있습니다. 단일 스트림 회로는 한 번에 하나의 모드로 활성 상태인 반면 다중 스트림 회로는 서로 다른 모드를 사용하여 두 개 이상의 스트림을 동시에 실행할 수 있습니다.

모드 매핑

이 섹션에서는 표준 모드를 간략하게 소개하고 '모드' 매핑이 사용되는 이유를 설명합니다.

RAW 모드: 스트림/회로는 스트림에 영향을 주지 않습니다(스피커 보호와 같은 볼륨, 음소거 및 안전 제약 조건 제외).

기본 모드: 스트림/회로는 몇 가지 기본 효과를 수행합니다.

<mode_name> mode: 스트림/회로는 선택한 mode_name> 모드와 <관련된 효과를 적용합니다.

스트리밍 핀은 원시 및/또는 기본 모드를 지원해야 합니다. 스트리밍 핀이 다른 <mode_name> modes모든 핀을 지원하는 것은 선택 사항입니다.

복합 엔드포인트에서는 상류 회로가 여러 모드를 지원하고, 다운레벨 회로가 RAW 및/또는 DEFAULT만 지원할 수 있습니다.

두 회로 엔드포인트의 예:

  • 업레벨 회로의 아래쪽 핀은 m1{f1,f2} 및 m2{f3,f4} 모드 및 관련 형식을 지원합니다. 즉, m1을 사용할 때 핀의 스트림에 f1 또는 f2 형식이 있거나 m2를 사용할 때 f3 또는 f4 형식이 있습니다. 이는 업레벨 회로가 단일 스트림 회로라고 가정합니다.

  • 하위 수준 회로의 고급 핀은 기본 모드{f1,f2,f3}를 지원합니다.

이 경우 스트림 모드는 동일한 샘플 속도를 유지하면서 mode_name> 모드에서 <기본 모드로 변환됩니다.

m1/f1에서 default/f1로 >

m1/f2에서 default/f2로 >

m2/f3에서 default/f3으로 >

잘못된 항목: m2/f4에서 없음으로 >

모드 매핑은 ACX의 도움으로 드라이버에 의해 수행됩니다. 위의 표에서 마지막 항목은 유효하지 않습니다. 업레벨 회로의 아래쪽 핀은 지원되는 형식에 대한 옵션으로 m2/f4를 제거해야 합니다. 이 문제는 반대로 발생할 수 있습니다. 즉, 다운레벨 회로의 경사 핀도 f4 및 f5를 지원했을 수 있습니다. 이 경우 default-f4가 지원되었지만 default-f5는 지원되지 않았습니다. 이러한 경우 목록에서 m?/f5를 옵션으로 나열하지 않는 것이 다운레벨 회로의 고급 핀입니다. 아래의 추가 섹션에서는 이 프로세스를 설명합니다.

형식 협상

ACX는 복합 디바이스를 구성하는 회로의 오디오 인터페이스를 사용하도록 설정하기 전에 회로가 오디오 데이터의 모드/형식을 협상할 수 있도록 합니다. ACX는 복합의 모든 회로에서 복합 초기화 콜백을 호출하여 이 회로 알림을 수행합니다. 시퀀스는 다운레벨(디바이스 쪽)에서 업레벨(시스템 쪽)까지입니다. 회로는 이 단계에서 해당 형식을 업데이트할 수 있습니다.

디바이스 형식 제어판 표시

현재 사운드 제어판 논리는 다음과 같이 디바이스 형식 목록을 표시합니다.

  • 오디오 디바이스가 오디오 엔진 요소를 지원하는 경우 제어판에 표시되는 데이터 형식 목록은 디바이스 데이터 형식 목록(예: 하위 수준 핀에 연결된 데이터 형식 목록)입니다(오디오 엔진 요소 출력 핀에 연결됨).
  • 오디오 디바이스가 오디오 엔진 요소를 지원하지 않는 경우 제어판에 표시되는 데이터 형식 목록은 스트리밍 핀 데이터 형식 목록(예: 업레벨 핀에 대한 공격된 데이터 형식 목록)입니다.

다중 회로 자동 다운레벨 스트림 만들기

ACX는 하위 수준 브리지 핀과 연결된 ACXSTREAMBRIDGE 개체를 사용하여 원격 회로에 create-stream(s) 요청을 자동으로 전파합니다.

클라이언트 앱이 스트림을 만들 때 해당 요청은 스트리밍 핀에 의해 먼저 수신됩니다. ACX는 회로 생성 시 지정된 제공된 콜백을 통해 스트림 만들기 요청에 대한 스트리밍 핀으로 인해 드라이버에 알릴 수 있습니다. 콜백에서 드라이버는 스트림을 나타내는 ACXSTREAM 개체를 만든 다음 컨트롤을 다시 ACX로 반환합니다. ACX가 컨트롤을 다시 받으면 이 만들기 요청을 다음(하위 수준) 회로로 전달해야 하는 경우 검사. 필요에 따라 드라이버는 만들기-스트림 콜백에서 반환하기 전에 다음(하위 수준) 회로로 만들기 요청을 전달할 수 있습니다. 후자의 옵션을 사용하면 하위 회로에서 만들기 요청을 처리할 수 있는 기회가 있었던 후 드라이버가 사후 작업을 수행할 수 있습니다.

ACX는 스트림 생성에 다음과 같은 기본 논리를 사용합니다.

  • 다운레벨 브리지 핀이 없으면 모두 완료됩니다.
  • 드라이버가 이미 수동으로 스트림을 ACXSTREAMBRIDGE와 연결한 경우 모두 완료됩니다.
  • 다운레벨 브리지 핀에 지정된 MODE에 대한 ACXSTREAMBRIDGE가 없으면 요청에 실패합니다.
  • ACX는 드라이버가 검색된 ACXSTREAMBRIDGE를 사용하여 만든 새 스트림을 추가합니다.

ACXSTREAMBRIDGE는 멀티인/싱글아웃으로 작동합니다. 인스트림이 있는 한 ACXSTREAMBRIDGE는 아웃 스트림을 유지합니다. 아웃 스트림은 마지막 스트림이 제거된 경우에만 삭제됩니다. ACXSTREAMBRIDGE는 원격 회로에 사용할 모드 및 형식을 결정할 때 하위 브리지 핀과 연결된 ACXDATAFORMATLIST를 사용합니다.

ACXSTREAMBRIDGE는 아웃 스트림의 모드 및 데이터 형식을 선택하기 위해 다음 논리를 사용합니다.

  • 아웃 스트림에 대한 MODE를 지정하지 않으면 '기본' 형식 목록이 있으면 검사.

  • 아웃 스트림에 대한 MODE를 지정하지 않고 '기본' 서식 목록이 없으면 '원시' 서식 목록이 있는지 검사.

  • MODE가 NULL_GUID 경우 첫 번째 스트림 내 MODE와 연결된 형식 목록이 있는지 검사.

  • MODE가 지정된 경우 이 MODE에 대한 형식 목록이 있는지 검사.

  • 서식 목록이 있으면 서식 목록에서 기본 형식을 가져옵니다.

  • 형식을 찾을 수 없는 경우 ACXSTREAMBRIDGE는 첫 번째 스트림 내 형식을 사용합니다.

  • ACXSTREAMBRIDGE는 다음과 같이 검색된 MODE 및 데이터 형식을 사용하여 ACXTARGETSTREAM을 사용하여 스트림 만들기 요청을 빌드합니다.

    • MODE를 지정한 경우 해당 MODE가 사용됩니다.
    • MODE가 NULL_GUID 경우 첫 번째 스트림 내 MODE가 사용됩니다.
    • 그렇지 않으면 모드가 사용되지 않습니다.

ACX는 마지막 스트림에서 제거될 때 대상 스트림을 삭제/닫습니다.

ACXSTREAMCIRCUIT의 또 다른 작업은 스트리밍 체인을 따라 스트림 상태를 자동으로 전파하는 것입니다.

드라이버는 AcxCircuitInitDisableDefaultStreamBridgeHandling을 호출하거나 ACXSTREAM 개체를 ACXSTREAMBRIDGE와 수동으로 연결한 후 ACX로 제어를 반환하여 기본 회로의 원격 스트림 브리지 생성을 해제할 수 있습니다. 후자의 경우 드라이버가 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM 콜백 함수에서 반환되기 전에 원격 스트림이 만들어집니다.

호스트/오프로드/루프백/kws와 같은 여러 캡처/렌더링 핀을 사용하는 회로의 경우, 즉 오디오 엔진 요소가 지원되는 경우 드라이버는 모드 내 없이 스트림 브리지를 만들고 스트림 콜백을 처리할 때 들어오는 ACXSTREAM 개체를 스트림 브리지에 수동으로 추가해야 합니다.

스트림 브리지 만들기에 대한 자세한 내용은 다음을 참조하세요.

다중 회로 자동 스트림 상태가 다운레벨 스트림으로 전파

ACXSTREAMBRIDGE는 스트림 상태 요청을 하위 수준으로 원격 회로로 자동으로 전파합니다. 스트림 상태가 변경되면 ACXSTREAMBRIDGE는 아웃 스트림의 혼합 상태를 계산하고 ACXTARGETSTREAM을 사용하여 해당 새 '스트림 상태' 요청을 원격 스트림으로 보냅니다.

ACXSTREAM과 ACXSTREAMBRIDGE는 다음 논리를 사용합니다.

  • 다음 시나리오에서 먼저 업레벨 스트림의 상태를 변경합니다.

    • 중지 실행에서 렌더링(&S)>
    • 실행> 중지에서 캡처(&S)
    • Run-Stop>에서 기타 이동(&C)
  • 다음 시나리오에서 마지막으로 업레벨 스트림의 상태를 변경합니다.

    • Run-Stop에서 렌더링(&S)>
    • 중지> 실행에서 캡처(&S)
    • 중지 실행에서 기타(&C)>

드라이버에는 구성 설정을 통해 이 순서를 되돌릴 수 있는 옵션이 있습니다.

참고 항목

드라이버/회로/스트림이 항상 실행에서 중지로의 스트림 전환을 성공하기 위한 요구 사항입니다. 반면에 드라이버가 중지에서 실행까지 역방향으로 실패할 수 있습니다.

참고 항목

ACX 회로

ACX 오디오 클래스 확장 개요

ACX 다중 스택 교차 드라이버 통신

ACX 개체 요약