루프백 기록
루프백 모드에서 WASAPI의 클라이언트는 렌더링 엔드포인트 디바이스에서 재생 중인 오디오 스트림을 캡처할 수 있습니다. 루프백 모드에서 스트림을 열려면 클라이언트는 다음을 수행해야 합니다.
- 렌더링 엔드포인트 디바이스에 대한 IMMDevice 인터페이스를 가져옵니다.
- 렌더링 엔드포인트 디바이스에서 루프백 모드로 캡처 스트림을 초기화합니다.
이러한 단계를 수행한 후 클라이언트는 IAudioClient::GetService 메서드를 호출하여 렌더링 엔드포인트 디바이스에서 IAudioCaptureClient 인터페이스를 가져올 수 있습니다.
WASAPI는 주로 AEC(음향 에코 취소)를 지원하는 루프백 모드를 제공합니다. 그러나 다른 유형의 오디오 애플리케이션은 오디오 엔진에서 재생되는 시스템 믹스를 캡처하는 데 유용한 루프백 모드를 찾을 수 있습니다.
Stream 캡처의 코드 예제에서 RecordAudioStream 함수를 쉽게 수정하여 루프백 모드 캡처 스트림을 구성할 수 있습니다. 필요한 수정 사항은 다음과 같습니다.
- IMMDeviceEnumerator::GetDefaultAudioEndpoint 메서드에 대한 호출에서 첫 번째 매개 변수(dataFlow)를 eCapture에서 eRender로 변경합니다.
- IAudioClient::Initialize 메서드 호출에서 두 번째 매개 변수(StreamFlags)의 값을 0에서 AUDCLNT_STREAMFLAGS_LOOPBACK 변경합니다.
Windows 10 1703 이전 버전의 Windows에서 풀 모드 캡처 클라이언트는 스트림이 이벤트 기반 버퍼링으로 초기화되고 루프백을 사용하는 경우 이벤트를 수신하지 않습니다. 이 작업을 수행하려면 이벤트 기반 모드에서 렌더링 스트림을 초기화합니다. 클라이언트가 렌더링 스트림에 대한 이벤트를 수신할 때마다 캡처 클라이언트가 캡처 엔드포인트 버퍼에서 다음 샘플 집합을 읽는 캡처 스레드를 실행하도록 신호를 받아야 합니다. Windows 10 버전 1703 이상에서는 이벤트 기반 루프백 클라이언트가 지원되며 더 이상 렌더링 스트림과 관련된 해결 방법이 필요하지 않습니다.
클라이언트는 공유 모드 스트림(AUDCLNT_SHAREMODE_SHARED)에 대해서만 루프백 모드를 사용하도록 설정할 수 있습니다. 단독 모드 스트림은 루프백 모드에서 작동할 수 없습니다.
WASAPI의 루프백 구현은 하드웨어의 기능에 따라 달라집니다. 하드웨어가 렌더링 엔드포인트에서 루프백 핀을 지원하는 경우 WASAPI는 루프백 스트림에 이 핀에 제공된 오디오를 사용합니다. 하드웨어에서 루프백 핀을 지원하지 않는 경우 WASAPI는 오디오 데이터를 하드웨어의 렌더링 핀에 복사하는 것 외에도 오디오 엔진의 출력 스트림을 루프백 애플리케이션의 캡처 버퍼로 복사합니다.
일부 하드웨어 공급업체는 오디오 어댑터에서 루프백 디바이스(렌더링 디바이스의 인스턴스 고정과 반대)를 구현합니다. 하드웨어 루프백 디바이스는 WASAPI 루프백 모드와 유사하지만 사용하기가 더 어려울 수 있습니다.
하드웨어 루프백 디바이스는 오디오 애플리케이션에 다음과 같은 단점이 있습니다.
- 모든 오디오 어댑터에 루프백 디바이스가 있는 것은 아닙니다. 따라서 해당 애플리케이션에 의존하는 애플리케이션은 모든 시스템에서 작동하지 않습니다.
- 애플리케이션이 루프백 디바이스에서 기록하려면 먼저 사용자가 루프백 디바이스를 식별하고 사용하도록 설정해야 합니다.
다른 공급업체는 하드웨어 루프백 디바이스에 서로 다른 이름을 할당합니다. 다음 이름은 예제입니다.
- 스테레오 믹스
- 웨이브아웃 믹스
- 혼합 출력
- 듣는 내용
표준화된 이름이 없으면 사용자가 디바이스 이름 목록에서 루프백 디바이스를 식별하는 데 어려움을 겪을 수 있습니다.
하드웨어 루프백 디바이스는 캡처 디바이스입니다. 따라서 어댑터가 루프백 디바이스를 지원하는 경우 오디오 애플리케이션은 다른 캡처 디바이스에서 기록하는 것과 동일한 방식으로 디바이스에서 기록할 수 있습니다.
예를 들어 기본 캡처 디바이스로 하드웨어 루프백 디바이스를 선택하는 경우 스트림 캡처의 코드 예제에서 RecordAudioStream 함수를 수정하지 않고 사용하여 디바이스에서 스트림을 캡처할 수 있습니다. (Windows 멀티미디어 waveInXxx 함수와 같은 레거시 오디오 API를 사용하여 디바이스에서 스트림을 캡처할 수도 있습니다.)
오디오 어댑터에 하드웨어 루프백 디바이스가 포함된 경우 Windows 멀티미디어 제어판 Mmsys.cpl 사용하여 디바이스를 기본 캡처 디바이스로 지정할 수 있습니다. 절차는 다음과 같습니다.
Mmsys.cpl 실행하려면 명령 프롬프트 창을 열고 다음 명령을 입력합니다.
control mmsys.cpl
또는 작업 표시줄 오른쪽에 있는 알림 영역에서 스피커 아이콘을 마우스 오른쪽 단추로 클릭하고 기록 장치를 선택하여 Mmsys.cpl 실행할 수 있습니다.
Mmsys.cpl 창이 열리면 기록 장치 목록에서 아무 곳이나 마우스 오른쪽 단추로 클릭하고 비활성화된 디바이스 표시 옵션이 선택되어 있는지 확인합니다 . (그렇지 않으면 루프백 디바이스를 사용하지 않도록 설정하면 목록에 표시되지 않습니다.)
기록 디바이스 목록을 찾아 루프백 디바이스(있는 경우)를 찾습니다. 루프백 디바이스를 사용하지 않도록 설정한 경우 디바이스를 마우스 오른쪽 단추로 클릭하고 [사용]을 클릭하여 사용하도록 설정합니다.
마지막으로 루프백 디바이스를 기본 캡처 디바이스로 선택하려면 디바이스를 마우스 오른쪽 단추로 클릭하고 기본 디바이스로 설정을 클릭합니다.
WASAPI는 오디오 하드웨어에 루프백 디바이스가 포함되어 있는지 또는 사용자가 디바이스를 사용하도록 설정했는지 여부에 관계없이 루프백 녹음을 지원합니다.
Windows Vista는 DRM(디지털 권한 관리)을 제공합니다. 콘텐츠 공급자는 DRM을 사용하여 독점 음악 또는 기타 콘텐츠를 무단 복사 및 기타 불법 사용으로부터 보호합니다. 마찬가지로 신뢰할 수 있는 오디오 드라이버는 루프백 디바이스가 보호된 콘텐츠를 포함하는 디지털 스트림을 캡처하는 것을 허용하지 않습니다. Windows Vista를 사용하면 신뢰할 수 있는 드라이버만 보호된 콘텐츠를 재생할 수 있습니다. 신뢰할 수 있는 드라이버 및 DRM에 대한 자세한 내용은 Windows DDK 설명서를 참조하세요.
WASAPI 루프백은 기본적으로 오디오가 시작된 터미널 서비스 세션에 관계없이 재생 중인 모든 오디오의 혼합을 포함합니다. 예를 들어 세션 0에서 실행되는 서비스에서 루프백 클라이언트를 실행하고 모든 사용자 세션에서 오디오를 캡처하고 세션 0에서 재생되는 오디오를 캡처할 수 있습니다.
Windows 10 빌드 20348부터 IMMDevice::Activate 호출에서 AUDIOCLIENT_ACTIVATION_PARAMS 전달하여 특정 프로세스와 해당 자식을 루프백 캡처에서 포함하거나 제외할 수 있습니다. 애플리케이션 루프백 오디오 캡처 샘플을 참조하세요.
원격 데스크톱을 사용하면 오디오를 클라이언트로 리디렉션할 수 있습니다. 이는 해당 세션에만 표시되는 새 오디오 디바이스를 만들어 구현됩니다.
관련 항목