스트림 라우팅 구현 고려 사항

Windows 7에서는 Media Foundation, DirectSound 및 Wave API와 같은 핵심 오디오 API를 사용하는 고급 플랫폼 API가 기존 디바이스에서 새 기본 오디오 엔드포인트로 스트림 전환을 처리하여 스트림 라우팅 기능을 구현합니다. 이러한 API를 사용하는 미디어 애플리케이션은 원본을 수정하지 않고 스트림 라우팅 동작을 사용합니다. 직접 WASAPI 클라이언트는 핵심 오디오 구성 요소에서 보낸 알림을 사용하고 스트림 라우팅 기능을 구현할 수 있습니다.

직접 WASAPI 클라이언트(WASAPI를 직접 사용하는 미디어 애플리케이션)는 핵심 오디오 구성 요소에서 보낸 새 디바이스 및 오디오 세션 알림을 받습니다. 스트림 라우팅 기능의 동작은 애플리케이션이 이러한 알림을 처리하는 방법에 의해 정의됩니다.

MMDevice API 및 오디오 세션은 디바이스 상태 변경 및 세션 변경에 대한 알림을 콜백 형식으로 WASAPI 클라이언트에 보냅니다. 이러한 알림을 받으려면 클라이언트가 IMMNotificationClientIAudioSessionEvents의 구현을 등록해야 합니다. 자세한 내용은 스트림 라우팅에 대한 관련 알림을 참조하세요.

스트림 라우팅에 설명된 USB 헤드셋 시나리오에서 애플리케이션은 오디오 스트림을 재생하고 MMDeviceAPI 및 WASAPI를 사용하여 기본 렌더링 디바이스인 Speaker에서 스트림을 렌더링합니다. 기본 디바이스가 변경되면 애플리케이션은 IMMNotificationClient 알림을 받습니다. 또한 애플리케이션은 사용자가 오디오 엔드포인트 디바이스를 제거했거나 오디오 세션이 연결된 디바이스에 대해 스트림 형식이 변경되었음을 나타내는 IAudioSessionEvents 알림을 받습니다. 알림을 받으면 애플리케이션은 스피커 엔드포인트로의 스트리밍을 중지하고 현재 기본 엔드포인트인 헤드셋에서 렌더링할 스트림을 다시 엽니다.

디바이스 알림에 대한 데이터 흐름 다이어그램

이러한 알림에 대한 응답으로 클라이언트는 사용자가 선택한 새 형식으로 새 기본 디바이스에서 스트림을 다시 열 수 있습니다.

스트림 관리

다음 목록에는 스트림 전환 기능을 제공하기 위해 WASAPI 클라이언트가 수행해야 하는 단계가 요약되어 있습니다.

  1. 관련 IMMNotificationClient 알림을 기다립니다. 디바이스가 기본 디바이스인 경우 IMMNotificationClient::OnDefaultDeviceChanged 알림이 수신됩니다.

  2. 새 디바이스를 사용할 수 있는 경우 새 디바이스의 엔드포인트에 대한 참조를 가져옵니다. 새 기본 디바이스 에 대해 IMMDeviceEnumerator::GetDefaultAudioEndpoint 를 호출합니다. 새 디바이스가 기본 디바이스가 아닌 경우 IMMDeviceEnumerator::GetDevice를 호출하여 디바이스를 검색할 수 있습니다. 자세한 내용은 스트림 라우팅을 위한 디바이스 엔드포인트 가져오기를 참조하세요.

  3. 이유 값과 함께 IAudioSessionEvents::OnSessionDisconnected 를 기다립니다.

    참고

    이러한 모든 작업은 비동기적이므로 애플리케이션이 디바이스 변경 및 세션 연결 끊기 알림을 받는 순서를 예측할 수 없습니다. 애플리케이션은 어떤 순서로든 이러한 알림을 받으려면 알림 처리를 구현해야 합니다. 그러나 일반적으로 애플리케이션은 기본 디바이스 변경 알림 전에 AudioSessionDisconnect 값을 받습니다.

     

  4. 이유 값을 평가하고 스트림을 다른 오디오 엔드포인트로 전송해야 하는지 아니면 스트림을 새 형식으로 다시 초기화해야 하는지 여부를 결정합니다.

  5. 스트림을 새 기본 디바이스로 다시 라우팅해야 한다는 이유가 표시되면 이전 기본 디바이스로 스트리밍을 중지합니다.

  6. 위치 매핑 계산을 수행합니다.

  7. 새 디바이스에서 스트림을 열고 모든 상태 정보를 전송합니다.

  8. 새 기본 디바이스에서 스트리밍을 다시 시작합니다.

  9. 이전 기본 디바이스의 출발을 처리합니다.

스트림 전환 작업이 원활하게 표시되도록 하려면 가능한 한 빨리 수행해야 합니다. 이는 새 디바이스에서 스트림을 다시 시작하는 데 관련된 구성 요소의 성능에 따라 달라집니다.

위치 매핑 고려 사항

애플리케이션이 IMMNotificationClientIAudioSessionEvents 알림을 받으면 기존 스트림을 새 기본 디바이스로 라우팅할 수 있습니다. 기존 오디오 스트림이 중단되어 새 디바이스에서 열리면 새 디바이스에서 렌더링이 이전 디바이스에서 스트림이 중지된 위치에서 시작해야 합니다. 이렇게 하려면 애플리케이션에 마지막으로 알려진 디바이스 위치가 있어야 새 디바이스의 시작 위치를 계산할 수 있습니다. 예를 들어 이 위치를 후속 위치 매핑의 델타 오프셋으로 사용할 수 있습니다. 스트림이 렌더링을 시작하면 새 디바이스 위치를 캐시된 디바이스 위치로 다시 매핑할 수 있습니다.

다음 단계에서는 원활한 스트림 전환을 수행하는 프로세스를 요약합니다.

  1. 이전 디바이스에서 스트림의 마지막 디바이스 위치를 캐시합니다.
  2. 이전 디바이스에서 스트림을 중지합니다.
  3. 다시 매핑 계산을 수행하여 새 위치를 가져옵니다.
  4. 새 디바이스에서 스트림 렌더링을 시작합니다.
  5. 이전 스트림을 해제합니다.

전환 중에 애플리케이션은 시계가 동기화되지 않아 동기화되지 않은 오디오 및 비디오 스트림이 발생하도록 해야 합니다. 오디오 스트림이 새 디바이스로 라우팅되는 동안 비디오 샘플이 계속 렌더링되는 경우에 발생할 수 있습니다. 애플리케이션은 다시 매핑 계산을 위해 클록 위치를 캐시하고 클립이 렌더링을 다시 시작할 때 오디오 및 비디오 스트림이 동기화되도록 새 디바이스에서 오디오 스트림이 다시 열릴 때까지 비디오 샘플이 렌더링되지 않도록 해야 합니다. 경우에 따라 비디오 프레임을 렌더링하기 위한 프레젠테이션 시간이 오디오 클록을 기반으로 하는 경우 스트림 전환이 완료될 때까지 오디오 스트림을 중지하기에 충분하며 오디오 비디오 동기화를 위해 비디오 스트림에 대한 다른 위치 매핑 구현이 필요하지 않습니다.

렌더링하는 동안 IAudioRenderClient::GetBuffer 는 이전 디바이스가 손실되어 오류를 반환합니다. 스트리밍 작업이 이미 종료되었으므로 애플리케이션에서 이전 스트림을 중지할 필요가 없습니다. 이 오류를 처리하는 방법에 대한 자세한 내용은 Invalid-Device 오류에서 복구를 참조하세요.

MMDevice API 정보

WASAPI 정보

스트림 라우팅