자동 스트림 라우팅

이 문서에서는 자동 스트림 라우팅을 활용하도록 WASAPI 구현을 업데이트하는 방법을 설명합니다.

Windows 7부터 기본 오디오 디바이스가 변경될 때마다 앱의 오디오 재생 스트림이 이전 기본 오디오 디바이스에서 새 기본 오디오 장치 로 원활하게 전송됩니다. 이 전송은 추가 애플리케이션 코드 없이 자동으로 발생합니다. 그러나 Windows 10 버전 1607 이전에는 WASAPI(하위 수준 Windows 오디오 세션 API)를 사용한 앱이 이 자동화된 스트림 라우팅 기능에 참여할 수 없었습니다. WASAPI를 사용하는 앱은 오디오 디바이스의 도착 및 제거를 감지하고 스트림을 해당 디바이스로 적절하게 전환하는 코드를 추가하여 자체 형태의 스트림 라우팅을 구현해야 했습니다. 디바이스 도착 또는 제거 시 자체 스트림 라우팅 메커니즘을 구현하지 않은 WASAPI를 사용하는 애플리케이션은 이상적인 사용자 환경을 제공하지 못할 위험이 있습니다.

Windows 10 버전 1607부터 WASAPI를 사용하는 앱은 자동 스트림 라우팅을 활용할 수 있습니다. 애플리케이션에서 WASAPI를 사용하는 경우 다음 단계를 사용하여 이 새로운 기능을 활용하도록 애플리케이션을 업데이트하는 것이 좋습니다.

  1. Windows 10 버전 1607은 자동 스트림 라우팅, DEVINTERFACE_AUDIO_RENDERDEVINTERFACE_AUDIO_CAPTURE 오디오 렌더링 또는 캡처 인터페이스를 활성화하는 데 사용할 수 있는 두 개의 새 GUID를 정의합니다. StringFromIID를 호출하여 이러한 GUID의 문자열 표현을 가져옵니다. 다음 예제에서는 오디오 렌더링 GUID에 대한 이 호출을 보여줍니다.

    PWSTR audioRenderGuidString;
    StringFromIID(DEVINTERFACE_AUDIO_RENDER, &audioRenderGuidString);
    
  2. 식별자 문자열을 WASAPI ActivateAudioInterfaceAsync 함수에 전달하여 오디오 엔드포인트를 활성화합니다. 다음 예제에서는 1단계에서 얻은 오디오 렌더링 식별자를 전달합니다.

    //Activate the default audio interface
    ActivateAudioInterfaceAsync(audioRenderGuidString
                                __uuidof(IAudioClient),
                                NULL,
                                completionHandler.Get(),
                                operation.GetAddressOf()));
    
  3. 엔드포인트 식별자를 보유하기 위해 할당된 메모리를 해제합니다.

    CoTaskMemFree(audioRenderGuidString);  //free the string memory
    

위에서 설명한 방식으로 오디오 인터페이스를 활성화하도록 앱을 수정한 후에는 자동 스트림 라우팅 기능에 참여합니다.

자동 스트림 라우팅을 시연하려면 내부 스피커가 장착된 노트북 또는 태블릿을 사용하여 오디오를 재생합니다. 장치의 내부 스피커를 통해 오디오가 재생됩니다. 오디오가 재생되는 동안 헤드폰을 연결합니다. 이제 헤드폰을 통해 오디오 재생이 들립니다. 그런 다음 헤드폰과 오디오의 플러그를 뽑으면 자동으로 내부 스피커로 다시 라우팅됩니다.

스트림 라우팅

MediaDevice.GetDefaultAudioRenderId

MediaDevice.GetDefaultAudioCaptureId

ActivateAudioInterfaceAsync