사용자 지정 및 Windows API 결합
API(오디오 처리 개체)는 Windows 오디오 스트림에 대한 사용자 지정 가능한 소프트웨어 기반 디지털 신호 처리를 제공합니다. Microsoft 제공 API를 파트너 개발 코드와 결합하고 기존 기능을 래핑 및 사용자 지정할 수 있습니다.
API에 대한 일반적인 정보는 이러한 topics 참조하세요.
API는 Windows Vista에서 처음 도입되었으며 이전 시스템 API인 sAPO에 대한 참조가 표시될 수 있습니다. 자세한 내용은 Windows Vista의 사용자 지정 오디오 효과 백서를 참조하세요. 이 백서는 이전 COM 및 UI 개발 topics 참조할 수 있습니다.
사용자 지정 API와 Windows API를 결합하는 방법
이 섹션에는 해당 APO 주위에 얇은 래퍼를 만들어 사용자 지정 오디오 시스템 효과 APO를 구현하기 위한 지침이 포함되어 있습니다. 주문 APO는 IHV의 APO 구현을 나타냅니다.
API에는 SFX(Stream) 및 MFX(모드)의 두 가지 유형이 있습니다. Windows 8.1 SFX를 LFX(로컬)라고 하며 MFX는 GFX(글로벌) API로 심판되었습니다.
IHV는 사용자 지정 오디오 시스템 효과 API를 구현하여 Windows SFX 및 MFX 사용자 지정 오디오 시스템 효과 API 중 하나 또는 모두를 대체할 수 있습니다. 일반적으로 IHV 또는 OEM에는 사용자 지정 오디오 시스템 효과 API와 Windows에서 제공하는 API를 결합하기 위한 두 가지 기본 전략이 있습니다. 이러한 전략은 IHV가 사용자 지정 효과를 Windows와 통합하는 방법에 대한 유연성을 제공합니다.
바꾸기
대체하려는 Windows APO 및 해당 기능에 대한 자세한 이해를 개발합니다. 이러한 이해를 사용하여 대상 사용자 환경의 관점에서 IHV에 가장 적합한 방식으로 Windows APO를 호출하는 사용자 지정 APO를 구현합니다. 이 전략은 다음을 수행하려는 IHV 또는 OEM에 가장 적합합니다.
- 사용자 지정 효과를 Windows 효과와 원활하게 통합합니다.
- 자체 UI를 구현하여 Windows API에서 구현한 효과와 효과를 제어합니다.
APO 작성에 대한 자세한 내용은 Windows 오디오 처리 개체를 참조하세요.
얇은 래퍼
사용자 지정 APO를 Windows APO 주위에 얇은 래퍼로 작성합니다. 이 전략은 다음을 수행하려는 IHV 또는 OEM에 가장 적합합니다.
- 가능한 가장 간단한 방법으로 사용자 지정 효과를 추가합니다.
- Windows UI에서 효과를 계속 제어하도록 합니다.
씬 래퍼 전략 옵션을 선택하는 IHV 또는 OEM은 Windows 오디오 처리 개체 를 검토하여 Windows 사용자 지정 오디오 시스템 효과를 철저히 이해해야 합니다.
참고: 씬 래퍼 전략을 사용하면 IHV가 Windows 향상 탭에 추가된 사용자 지정 오디오 시스템 효과를 제어하는 UI를 추가할 수 없습니다. 향상된 기능 탭은 하나만 있으며 Windows API의 속성 페이지와 연결되어 있어야 합니다. IHV의 UI는 별도의 제어판 애플리케이션과 같은 다른 방법으로 구현되어야 합니다.
프로그래밍 정보
이 섹션에서는 사용자 지정 API 구현을 해결해야 하는 일반적인 프로그래밍 문제에 대해 설명합니다.
SFX(Stream) 및 MFX(모드) 사용자 지정 오디오 시스템 효과 API에는 다음과 같은 일반적인 특성이 있습니다.
- CoCreateInstance를 사용하여 인스턴스화할 수 있는 COM In-Process 서버 개체로 등록해야 합니다.
- CLSID는 각각 SFX 및 MFX API에 대한 및
CLSID_CWMAudioGFXAPO
입니다CLSID_CWMAudioLFXAPO
. CLSID는 wmcodecdsp.h에서 선언되고 wmcodecdspuuid.lib에 정의됩니다. - COM 집계를 지원해야 합니다. 그러나 집계는 사용자 지정 오디오 시스템 효과 시나리오에서 사용되지 않으므로 큰 문제가 발생하지 않아야 합니다.
초기화
사용자 지정 APO는 IAudioSystemEffects::Initialize 메서드를 호출하여 Window APO를 초기화해야 합니다. 이 작업은 일반적으로 사용자 지정 APO의 Initialize 메서드에서 수행됩니다. 사용자 지정 APO의 Initialize 메서드에 전달되는 모든 인수는 Windows APO의 Initialize에 직접 전달되어야 합니다. 이렇게 하면 APO가 APOInitSystemEffects 구조의 엔드포인트 및 Fx 속성 저장소에서 해당 설정을 가져올 수 있습니다. 사용자 지정 APO가 설정을 가져오고 선택적으로 APO에 전달할 수 있지만 이는 본질적으로 전략 A입니다.
사용자 지정 APO가 기능을 대체하는 경우 일반적으로 APO에서 해당 기능을 해제하는 것이 좋습니다. 그러나 기능의 작동 방식에 따라 기능을 해제하는 것이 엄격하게 필요하지 않을 수 있습니다. 기능을 해제하려면 해당 IPropertyStore 인터페이스에 대해 APO를 쿼리하고 IPropertyStore::SetValue를 호출합니다. APO의 속성 저장소에서 지원되는 속성은 이 항목의 뒷부분에 있는 "지원되는 IPropertyStore 속성"에 설명되어 있습니다.
Windows 사용자 지정 오디오 시스템 효과 APO 속성 저장소와 통신하는 방법에 대한 예제는 GitHub의 다음 샘플을 참조하세요. https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO
APO의 기능 상태 쿼리
사용자 지정 APO가 Windows 오디오 효과 기능을 대체하고 자체 구성 UI 또는 설정 저장소가 없는 경우 해당 APO에서 사용하도록 설정된 기능을 결정해야 할 수 있습니다.
이 정보를 가져오는 방법은 두 가지 이상입니다.
옵션 A: Fx 속성 저장소를 직접 쿼리합니다.
옵션 B: 간접적으로 APO를 인스턴스화하고 IPropertyStore 인터페이스를 사용하여 속성 저장소를 쿼리합니다.
옵션 A
이 옵션은 APO를 인스턴스화하지 않고 수행할 수 있다는 장점이 있습니다. 또한 사용자 지정 APO가 Fx 속성 저장소를 모니터링하려는 경우 옵션 A는 즉석 속성 변경 알림을 받을 수 있는 유일한 방법입니다. 옵션 A의 예제는 "압축" 샘플을 참조하세요.
옵션 A를 사용하면 사용자 지정 APO가 fx가 아닌 기본 엔드포인트 속성 저장소를 PKEY_AudioEngine_DeviceFormat 쿼리합니다. 그런 다음 해당 형식의 채널 마스크를 Fx 속성 저장소를 쿼리하는 데 사용되는 속성 키에 대한 PID로 사용합니다. Fx 속성 저장소를 쿼리하는 데 사용되는 속성 키의 GUID(fmtid)는 wmcodecdsp.h의 XXX_XXX_KEY_GUID 값 중 하나입니다. KEY_GUID 이름은 이 항목의 앞부 분에서 설명한 MFPKEY 이름에 대한 명확한 방법에 해당 합니다.
옵션 B
이 옵션은 Fx 속성 저장소에 해당 속성이 없는 경우 Windows APO가 기본적으로 일부 기능을 사용하도록 설정할 수 있는 가능성을 올바르게 처리할 수 있다는 장점이 있습니다.
옵션 B를 사용하면 사용자 지정 APO가 해당 IPropertyStore 인터페이스에 대해 APO를 쿼리하고 이 항목의 앞부분에서 설명한 MFPKEY_XXX 키 중 하나를 사용하여 IPropertyStore::GetValue 를 호출합니다.
형식 협상
SFX APO를 래핑하는 사용자 지정 SFX APO를 구현하는 경우 사용자 지정 APO의 등록 속성에서 를 지정 APO_FLAG_FRAMESPERSECOND_MUST_MATCH
하지 마세요. 이 규칙은 사용자 지정 APO가 채널 형식을 변경할 수 있는지 여부를 따라야 합니다. 사용자 지정 SFX APO가 이 플래그를 지정하는 경우 해당 SFX가 스피커 채우기, 헤드폰 가상화 또는 가상 서라운드를 수행하지 못하게 됩니다.
사용자 지정 SFX APO 구현은 IAudioProcessingObject::IsInputFormatSupported를 구현하거나 재정의해야 합니다. 기본 클래스 IsInputFormatSupported 구현은 사용자 지정 SFX APO 및 SFX APO에 의해 구현된 가능한 채널 변환 집합을 정확하게 반영하지 않을 수 있습니다.
사용자 지정 SFX APO의 IsInputFormatSupported 메서드는 해당 APO의 IsInputFormatSupported를 호출해야 합니다. 이렇게 하면 SFX APO가 사용자 지정 SFX APO에서 처리되지 않는 모든 채널 변환을 처리합니다. 이후 Windows 릴리스에서 더 많은 변환을 지원하도록 SFX APO가 업데이트될 수 있습니다. APO의 IsInputFormatSupported 메서드를 호출하는 것은 사용자 지정 APO에서 지원하는 채널 변환 집합에 SFX APO에서 지원하는 채널 변환 집합이 완전히 포함되도록 하는 한 가지 방법입니다.
사용자 지정 APO가 SFX APO의 IsInputFormatSupported 메서드의 반환 값으로 수행해야 하는 작업은 사용자 지정 SFX APO가 지원하는 채널 변환(있는 경우)에 따라 달라집니다.
사용자 지정 SFX APO가 자체 채널 변환을 지원하지 않는 경우 해당 IsInputFormatSupported 메서드는 SFX APO의 IsInputFormatSupported 메서드에서 반환한 값을 호출자에게 직접 반환할 수 있습니다. 예를 들어 "swap" 및 "compress" 샘플을 참조하세요.
사용자 지정 SFX APO가 자체 채널 변환을 지원하는 경우 SFX APO의 IsInputFormatSupported 메서드에서 S_FALSE 포함한 음수 반환 값이 반드시 호출자에게 음수 반환 값으로 변환되는 것은 아닙니다. 예를 들어 사용자 지정 SFX APO는 해당 APO에서 지원되지 않는 채널 변환을 지원할 수 있습니다. 이 경우 사용자 지정 SFX APO는 지원되는 입력을 결정하기 위한 자체 논리와 SFX APO의 IsInputFormatSupported 메서드의 반환 값을 결합해야 합니다. "결합"의 최적 의미는 우선해야 하는 채널 변환 유형에 따라 달라집니다. 가장 좋은 방법은 사용자 지정 구현의 정확한 디자인에 따라 달라집니다.
SFX APO의 출력 형식이 디바이스의 혼합 형식이므로 SFX APO의 IsOutputFormatSupported 메서드는 관심이 없습니다. 이 형식은 외부 고려 사항을 기반으로 하며 SFX APO 또는 해당 입력 형식의 영향을 받을 수 없습니다. 이러한 이유로 샘플은 IsOutputFormatSupported에 대한 올바른 논리를 구현하려고 시도하지 않습니다.
MFX APO는 채널 형식을 변경해야 하거나 변경하는 기능을 구현하지 않으므로 위의 고려 사항은 MFX APO에 적용되지 않습니다. 이러한 이유로 MFX 샘플은 IsInputFormatSupported 또는 IsOutputFormatSupported에 대해 특별한 작업을 수행하지 않습니다. 사용자 지정 MFX APO의 형식 협상 논리는 MFX APO를 래핑한다는 사실에 영향을 받지 않습니다.
LockForProcess/UnlockForProcess
사용자 지정 APO의 IAudioProcessingObjectConfiguration::LockForProcess 메서드는 APO에서 해당 메서드를 호출해야 합니다. LockForProcess()는 다양한 처리 단계가 수행되어야 하는 순서에 대한 결정을 내리는 데 적합합니다. 예를 들어 사용자 지정 APO 처리 또는 APO의 처리를 먼저 적용할지 여부를 결정할 수 있습니다. 세 가지 샘플 모두 이러한 의사 결정 논리의 예를 제공하며 샘플의 주석은 몇 가지 배경을 제공합니다. 그러나 사용자 지정 APO의 특정 기능과 APO 기능과 상호 작용하는 방법에 대한 지식이 필요하기 때문에 이 문서에서 해당 주제에 대한 완전히 일반적인 지침을 제공하는 것은 불가능합니다.
GetLatency
사용자 지정 APO의 IAudioProcessingObject::GetLatency 구현은 래핑되는 APO에서 GetLatency를 호출해야 합니다. 사용자 지정 APO 처리에 대기 시간이 발생하는 경우 호출자에게 값을 반환하기 전에 APO에서 반환한 결과에 추가해야 합니다.
APOProcess
사용자 지정 APO의 IAudioProcessingObjectRT::APOProcess 메서드는 처리 전, 후 또는 처리 중에 APO의 APOProcess 메서드를 호출해야 합니다. 필요한 중간 버퍼를 할당할 수 있도록 LockForProcess에서 APOProcess를 호출할 시기를 결정해야 합니다. API는 입력 및 출력 형식이 동일할 때마다 현재 위치 처리를 지원합니다. 이 경우 사용자 지정 APO는 Windows APO에 대한 입력 및 출력 연결 속성과 동일한 APO_CONNECTION_PROPERTY 전달할 수 있습니다. 그러나 사용자 지정 APO는 사용자 지정 APO의 입력 연결 속성을 APO의 출력 연결 속성으로 사용하지 않아야 합니다. 일반적으로 API는 입력 버퍼를 수정해서는 안 됩니다.
APO 오류 처리
APO가 해당 사용자 지정 APO에 오류를 반환하는 경우 사용자 지정 APO는 APO가 없는 것처럼 해당 지점에서 작동해야 합니다. 샘플은 모든 APO 오류를 APO를 만들지 못하는 CoCreateInstance와 동일하게 처리합니다. 필요에 따라 사용자 지정 APO는 APO의 LockForProcess 메서드에서 현재 세션으로 오류의 영향을 제한할 수 있습니다. 즉, 사용자 지정 APO는 APOProcess 메서드에 대한 후속 호출 중에 APO를 사용하지 않습니다. 그러나 나중에 다른 LockForProcess 호출이 있는 경우 다른 형식으로 APO를 다시 사용할 수 있습니다.
컴파일 및 연결
APO CLSID 및 속성 키 정의를 사용하려면 wmcodecdsp.h를 포함하고 wmcodecdspuuid.lib와 연결합니다. 자세한 내용은 wmcodecdsp.h 헤더를 참조하세요.
APO 샘플
네 가지 샘플 오디오 시스템 효과 샘플이 있습니다. APO 샘플은 다음의 GitHub에서 사용할 수 있습니다. https://github.com/Microsoft/Windows-driver-samples/tree/main/audio/sysvad/APO
사용자 지정 오디오 시스템 효과에 대한 일반적인 지침
다음은 사용자 지정 오디오 시스템 효과 API를 구현할 때 IHV가 따라야 하는 몇 가지 지침입니다.
- 모든 오디오 시스템 효과는 켜기/끄기 옵션을 제공해야 합니다. 사용자는 오디오 시스템 효과를 사용하도록 강요해서는 안 됩니다.
- SFX와 MFX APO의 기능 간의 상호 작용은 APO 및 관련 UI에서 중재해야 합니다.
- 여기에서 SFX 또는 MFX로 지정된 기능은 사용자 지정 구현에서 SFX와 MFX 간에 이동할 수 있습니다. 그러나 이 작업은 켜기/끄기 옵션이 있어야 하며 옵션의 접근성과 적합성이 손상되어서는 안 된다는 점을 이해하여 수행해야 합니다.
- 구현자는 SFX에 다른 입력 및 출력 채널 마스크가 있을 수 있음을 기억해야 합니다. MFX APO에는 동일한 입력 및 출력 채널 마스크가 있어야 합니다.
Windows 제공 API
다른 Windows 제공 API에 대한 자세한 내용은 이러한 topics 참조하세요.
특정 APO 사용자 지정 정보
음량 이퀄라이제이션(SFX APO)
음량 균등화는 지각 음량 메트릭에 의해 구동되는 압축된(역학) 처리입니다. 회의실 수정(MFX APO)
회의실 보정은 룸 보정 마법사가 생성한 프로필을 사용합니다. 이 프로필은 이진 Blob으로 저장됩니다. Blob의 형식이 현재 게시되지 않았습니다.
채널 변환(SFX APO)
채널 변환 APO는 여러 작업을 처리합니다.
Headphone 가상화
이 효과는 재생 중인 콘텐츠의 채널 형식(N.x)이 2.0 이상인 경우 활성화됩니다. 여기서 x는 0 또는 1일 수 있습니다. 출력 마스크는 스테레오(0x3)여야 합니다. 입력 마스크는 아래 표에 나열된 지원되는 몇 가지 조합으로 제한됩니다.
헤드폰 가상화 채널 마스크
Name | 값 |
---|---|
MASK_STEREO MASK_FRONTLR | 0x3 |
MASK_3_FRONT(SPEAKER_FRONT_CENTER | MASK_FRONTLR) | 0x7 |
MASK_4_SQUARE(MASK_FRONTLR | MASK_BACKLR) | 0x33 |
MASK_4_DIAMOND(MASK_FRONTLR | MASK_FBCENTERS) | 0x107 |
MASK_5_BACK(MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) | 0x3F |
MASK_5_SIDE(MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) | 0x60F |
가상 서라운드
이 효과를 LTRT(왼쪽/오른쪽) 접기 또는 왼쪽/오른쪽 행렬 인코딩이라고도 합니다. 재생 중인 콘텐츠의 채널 형식(N.x)이 2.0 이상인 경우 사용됩니다. 여기서 x는 0 또는 1일 수 있습니다. LTRT 접기는 일반적으로 4.0 ~ 2.0입니다. 다른 모든 입력 형식은 일반적으로 N.x를 4.0 제네릭 폴드다운에 먼저 적용하여 처리됩니다. 그러나 구현에서 LTRT 접기는 기본적으로 5.1~2.0입니다. 다른 모든 입력은 먼저 N.x를 5.1 제네릭 폴드다운에 먼저 적용하여 처리됩니다.
출력 채널 마스크는 0x3(스테레오)이어야 하며, 있는 경우 서브우퍼를 포함한 입력 채널 수는 8개를 넘지 않아야 합니다.
스피커 채우기
이 효과는 입력 채널 수(N)가 출력 채널 수(M)보다 작은 경우에 사용됩니다. 효과는 N.x 채널을 M.x 채널로 채웁니다. 여기서 x는 0 또는 1일 수 있습니다.
LFE 채널을 무시하는 표 4의 채널 마스크는 스피커 채우기에 대해 지원됩니다. 스피커 채우기는 입력 또는 출력 서브우퍼 채널 존재의 조합을 지원하므로 왼쪽의 숫자는 예제일 뿐입니다. 실제 구성에는 하위 우퍼가 있을 수도 있고 없을 수도 있습니다.
스피커 채우기 채널 마스크
Name | 값 |
---|---|
MASK_STEREO MASK_FRONTLR | 0x3 |
MASK_3_FRONT(SPEAKER_FRONT_CENTER | MASK_FRONTLR) | 0x7 |
MASK_4_SQUARE(MASK_FRONTLR | MASK_BACKLR) \ | 0x33 |
MASK_4_DIAMOND(MASK_FRONTLR | MASK_FBCENTERS) | 0x107 |
MASK_5_BACK(MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER) | 0x3F |
MASK_5_SIDE(MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER) | 0x60F |
MASK_7_SIDE_BACK(MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_SIDELR) | 0x63F |
MASK_7_FRONT_SIDE(MASK_FRONTLR | MASK_SIDELR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) | 0x6CF |
MASK_7_FRONT_BACK(MASK_FRONTLR | MASK_BACKLR | SPEAKER_FRONT_CENTER | MASK_CENTERLR) | 0xFF |
다음 중 어느 것이라도 true이면 화자 채우기가 지원되지 않습니다.
- 입력 마스크는 출력 마스크와 같습니다.
- 입력과 출력의 유일한 차이점은 왼쪽/오른쪽 채널이 있다는 것입니다. 다른 채널에는 왼쪽/오른쪽 채널이 있습니다.
- 입력에는 출력보다 더 많은 기본 채널이 있습니다.
- 출력 마스크는 가운데 왼쪽/오른쪽 스피커를 포함하지만 입력 마스크는 포함하지 않습니다.
- 출력에 있지만 입력에 없는 채널 집합에는 프런트 센터, 후방 왼쪽/오른쪽 또는 왼쪽/오른쪽 중 하나 이상이 포함되지 않습니다.
목록의 두 번째 항목에는 한 가지 예외가 있습니다. 입력과 출력의 유일한 차이점은 한 쪽에 왼쪽/오른쪽 채널이 있고 다른 하나는 왼쪽/오른쪽 채널이 있는 경우 두 형식 중 하나에 채널 마스크 비트 순서에서 sideLR과 backLR 사이에 속하는 채널이 포함된 경우 스피커 채우기가 지원됩니다. 다음과 같은 세 가지 채널이 있습니다.
- SPEAKER_FRONT_LEFT_OF_CENTER
- SPEAKER_FRONT_RIGHT_OF_CENTER
- SPEAKER_BACK_CENTER
입력 또는 출력 마스크에 이러한 세 채널이 포함된 경우 목록의 두 번째 조건을 충족하지 않지만 다른 조건이 충족되는 경우에만 스피커 채우기가 지원될 수 있습니다. 예를 들어 MASK_7_FRONT_BACK 또는 MASK_7_FRONT_SIDE 스피커 채우기는 이러한 이유로 스피커 채우기에서 지원됩니다.
다음 표에는 채널 값의 전체 목록이 있습니다.
Name | 값 |
---|---|
SPEAKER_FRONT_LEFT | 0x1 |
SPEAKER_FRONT_RIGHT | 0x2 |
SPEAKER_FRONT_CENTER | 0x4 |
SPEAKER_LOW_FREQUENCY | 0x8 |
SPEAKER_BACK_LEFT | 0x10 |
SPEAKER_BACK_RIGHT | 0x20 |
SPEAKER_FRONT_LEFT_OF_CENTER | 0x40 |
SPEAKER_FRONT_RIGHT_OF_CENTER | 0x80 |
SPEAKER_BACK_CENTER | 0x100 |
SPEAKER_SIDE_LEFT | 0x200 |
SPEAKER_SIDE_RIGHT | 0x400 |
지연은 입력 구성의 프런트 백 범위에서 "외부"인 출력 구성의 채널에 사용됩니다. 반대로 출력 구성의 스피커가 입력 구성의 일부 스피커를 프런트백 센스로 "사이"하는 경우 해당 스피커의 출력은 출력 채널의 양쪽에 있는 일부 입력 채널을 혼합하여 생성됩니다.
Windows API를 다시 사용할 때 Run-Time 고려 사항
이 섹션에는 IHV 및 OEM이 사용자 지정 오디오 시스템 효과를 구현할 때 유용할 수 있는 몇 가지 추가 정보가 포함되어 있습니다.
사용자 지정 APO 구현:
- CoCreateInstance를 사용하여 하나 이상의 Windows 사용자 지정 오디오 시스템 효과 API 인스턴스를 인스턴스화합니다.
- 각 instance 구성하여 원하는 기능 집합을 사용하도록 설정합니다.
- 사용자 지정 APO의 내부 파이프라인 내에서 적절한 위치에 각 instance 삽입합니다.
하나 이상의 인스턴스가 있는 이유는 무엇인가요?
바람직하지 않은 상호 작용을 방지하려면 대부분의 기능에 특정 상대 순서가 필요합니다. Windows APO는 단일 APO 내에서 여러 기능을 구현하기 때문에 올바른 순서를 보장하기 위해 해당 APO의 여러 인스턴스가 필요할 수 있습니다. 예를 들어 A, B 및 C라는 세 가지 기능의 순서를 ABC로 지정해야 한다고 가정합니다. 사용자 지정 구현은 B를 처리하지만 A와 C를 Windows APO에 위임합니다. 그런 다음, B의 사용자 지정 구현이 둘 사이에 발생할 수 있도록 A와 C는 Microsoft APO의 별도 인스턴스에 있어야 합니다.
Windows는 MFX APO에서 회의실 수정을 구현합니다. 즉, SFX APO와 별도의 COM 개체입니다. 사용자 지정 구현은 Windows 구현에 회의실 수정을 위임하지만 사용자 지정 SFX APO에 배치하도록 선택할 수 있습니다. 그런 다음 사용자 지정 SFX 구현은 일부 처리를 Windows SFX APO 구현 및 기타 처리에 Windows MFX APO 구현에 위임해야 할 수 있습니다.
다양한 입력 출력 형식 조합의 제한 사항 처리
많은 기능( 특히 베이스 관리)은 특정 경우에 작동하지 않습니다. 예를 들어 베이스 스피커 구성 속성이 "AllSmall" 또는 "AllLarge"이고 출력 형식에 하위 우퍼 채널이 포함되지 않거나 NoSub 플래그가 설정된 경우 정방향 베이스 관리는 정의되지 않습니다. IPropertyStore::SetValue 호출 중에 오류를 항상 검색할 수 있는 것은 아닙니다. 메서드는 기능을 사용하도록 설정하려고 시도하지만 모든 속성 조작 후에 LockForProcess가 발생해야 하므로 입력 및 출력 형식을 알 수 없습니다. 즉, 기능을 사용하도록 설정하고, 분명히 성공하지만, 해당 처리가 수행되지 않는 것을 볼 수 있습니다.
이러한 상황을 처리하기 위해 다음 두 가지 전략을 사용할 수 있습니다.
- 지정된 기능이 성공하거나 성공하지 못할 시기를 정확하게 예측할 수 있도록 이 문서의 기능별 섹션을 주의 깊게 연구합니다.
- LockForProcess가 호출된 후 IPropertyStore::GetValue를 호출하여 중요한 속성의 상태를 검사.
LockForProcess가 입력 및 출력 형식 또는 다른 속성의 값으로 인해 특정 기능을 사용하도록 설정할 수 없다고 결정하면 LockForProcess는 속성 저장소에 있는 해당 속성의 값을 업데이트합니다.
스피커 채우기와 베이스 관리 간의 상호 작용
스피커 채우기가 켜져 있고 서브우퍼가 연결된 경우 스피커 채우기의 서라운드 지연에 의한 저주파 신호의 빗 필터링을 방지하기 위해 스피커 채우기 전에 전방 베이스 관리가 발생해야 합니다.
스피커 채우기를 사용하도록 설정하고 서브우퍼가 연결되지 않은 경우 다음 두 가지 유형의 전방 베이스 관리를 수행할 수 있습니다.
- 앞면 왼쪽/오른쪽 스피커가 큰 경우 앞으로 베이스 관리는 서라운드 및 중앙 채널의 저주파 부분을 전면 왼쪽/오른쪽 스피커로 라우팅합니다. 앞으로베이스 관리는 스피커가이 경우에 입력 한 후 와야합니다.
- 모든 스피커가 작으면 모든 기본 스피커에 대해 전방향 저음 관리가 저주파 보호가 됩니다.
이 문제는 스피커 채우기 전이나 후에 발생할 수 있습니다. 그러나 성능상의 이유로 스피커 채우기 전에 앞으로 베이스 관리를 하는 것이 좋습니다.
Windows APO는 2.0 => 5.1과 같은 특정 일반 스피커 채우기 구성을 구현하며, 스피커 채우기와 동일한 단계에서 역방향 베이스 관리를 처리하는 특수한 최적화 코드를 사용합니다.
Folddown과 Bass Management 간의 상호 작용
Headphone 가상화는 역방향 베이스 관리만 지원합니다.
- 앞으로베이스 관리는 헤드폰 가상화에 의미가 없습니다.
- 구현 편의를 위해 저주파 보호 및 베이스 부스트는 지원되지 않습니다.
헤드폰 가상화, 가상 서라운드 인코딩 또는 스피커 채우기 효과가 켜지면 해당 단계에서 역방향 베이스 관리가 처리됩니다. 역방향 베이스 관리는 API 리버스베이스 관리 속성을 통해 별도의 기능인 것처럼 계속 제어됩니다. 이러한 경우 역방향 베이스 관리는 .1 입력 채널에 대한 폴드다운 계수를 제어하기만 하면 됩니다. 한 가지 열려 있는 문제는 LTRT가 켜져 있을 때 역방향 베이스 관리를 사용하지 않도록 설정할 수 없다는 것입니다. 이 경우 역방향 베이스 관리는 비전통적인 서브우퍼 채널 게인을 사용합니다.
Windows 오디오 시스템 효과 API는 기능이 활성화되지 않은 경우에도 약간의 처리(게인 및 지연)를 적용합니다. 이러한 처리의 목표는 즉시 기능을 사용할 때 게인 및 지연 매개 변수가 변경되지 않도록 하는 것입니다. 그 이유는 지연이 일부 기능의 구현에 내재되어 있고, 특정 상황에서 너무 높은 출력을 방지하기 위해 일부 기능에서 게인 <1을 적용하기 때문입니다. 사용 가능한 기능 집합은 입력 출력 형식 및 특정 속성에 따라 달라 지고 누적 정규화 게인 및 지연도 마찬가지입니다.
기능을 즉시 켜거나 끌 수 없는 경우 IPropertyStore::SetValue를 호출하여 속성을 FALSE로 설정 MFPKEY_CORR_NORMALIZATION_GAIN
하여 정규화 게인을 사용하지 않도록 설정할 수 있습니다. 속성은 기본적으로 TRUE일 수 있습니다.
정규화 지연을 사용하지 않도록 설정하는 메커니즘은 정규화 이득보다 불쾌할 가능성이 낮을 것으로 추정되기 때문입니다. 정규화 지연이 불쾌한 경우 해당 APO를 무시하기만 하면 됩니다.