Invalid-Device 오류에서 복구

WASAPI의 많은 메서드는 클라이언트 애플리케이션에서 사용 중인 오디오 엔드포인트 디바이스가 유효하지 않은 경우 AUDCLNT_E_DEVICE_INVALIDATED 오류 코드를 반환합니다. 이 오류 코드는 엔드포인트 디바이스가 분리되었거나 오디오 하드웨어 또는 관련 하드웨어 리소스가 다시 구성, 비활성화, 제거 또는 사용할 수 없게 되었음을 나타냅니다. 애플리케이션이 이 오류에서 복구할 수 있는 경우가 자주 있습니다.

참고

ISAC(공간 오디오 API)를 사용할 때 잘못된 디바이스 오류로부터 복구하는 방법에 대한 자세한 내용은 Invalid-Device 오류에서 복구(공간 소리)를 참조하세요.

애플리케이션이 AUDCLNT_E_DEVICE_INVALIDATED 오류로부터 복구하는 데 사용해야 하는 전략은 애플리케이션이 오디오 엔드포인트 디바이스를 선택하는 데 사용하는 다음 기술 중 어느 것이냐에 따라 달라집니다.

  • 항상 기본 오디오 렌더링 또는 캡처 디바이스를 선택합니다.
  • 특정 오디오 엔드포인트 디바이스를 선택합니다.

후자의 경우 애플리케이션이 내부 요구 사항에 따라 특정 디바이스를 자동으로 선택하거나 사용자가 사용 가능한 디바이스 목록에서 디바이스를 명시적으로 선택할 수 있습니다.

기본 디바이스를 사용하는 애플리케이션은 다음과 같이 AUDCLNT_E_DEVICE_INVALIDATED 오류에서 복구를 시도할 수 있습니다.

  1. IAudioClient 인터페이스 및 디바이스에서 가져온 다른 WASAPI 인터페이스를 해제합니다.
  2. IMMDeviceEnumerator::GetDefaultAudioEndpoint 메서드를 호출하여 현재 기본 오디오 디바이스를 가져옵니다.
  3. 기본 오디오 디바이스에서 IAudioClient 를 활성화하려고 시도합니다.

이전 단계에 따라 애플리케이션은 AUDCLNT_E_DEVICE_INVALIDATED 오류의 원인에 관계없이 적절하게 응답하는 경향이 있습니다. 기본 디바이스의 재구성으로 인해 오류가 발생한 경우(예: 사용자가 디바이스에서 사용하는 스트림 형식을 변경한 경우) 이러한 단계가 성공하면 애플리케이션에서 동일한 디바이스를 계속 사용할 수 있습니다. 사용자가 애플리케이션에서 사용 중인 디바이스를 사용하지 않도록 설정하거나 제거했으며 다른 디바이스를 사용하여 기본 디바이스의 역할을 맡을 수 있는 경우 새 기본 디바이스를 사용하여 애플리케이션을 계속할 수 있습니다. 두 경우 모두 애플리케이션은 사용자의 개입 없이 자동으로 조정됩니다.

특정 디바이스를 선택하는 애플리케이션은 다음과 같이 AUDCLNT_E_DEVICE_INVALIDATED 오류에서 복구를 시도할 수 있습니다.

  1. IAudioClient 인터페이스 및 디바이스에서 가져온 다른 WASAPI 인터페이스를 해제합니다.
  2. 동일한 디바이스에서 IAudioClient 인터페이스를 활성화하려고 시도합니다.
  3. 2단계가 실패하면 애플리케이션이 옵션으로 사용자에게 다른 디바이스를 선택하라는 메시지를 표시할 수 있습니다.

애플리케이션에서 사용하는 디바이스가 다시 구성되었지만 사용하지 않도록 설정되거나 제거되지 않은 경우 2단계가 성공할 수 있습니다. 성공하면 2단계를 사용하면 애플리케이션이 사용자의 개입 없이도 동일한 디바이스를 자동으로 계속 사용할 수 있습니다. 3단계는 애플리케이션에서 사용자가 이전에 사용한 디바이스를 사용하지 않도록 설정하거나 제거한 후 사용자가 다른 디바이스를 명시적으로 선택할 수 있도록 허용하는 경우에 적합합니다.

애플리케이션은 세션이 디바이스에 대한 연결을 끊을 때 알림을 수신하도록 등록하여 잘못된 디바이스 오류의 원인을 보다 정확하게 확인할 수 있습니다. 이 알림을 사용하도록 설정하기 위해 애플리케이션은 IAudioSessionEvents 인터페이스를 구현하고 IAudioSessionControl::RegisterAudioSessionNotification 메서드를 호출하여 인터페이스를 등록합니다. 잘못된 디바이스 오류로 인해 세션 연결이 끊어지면 WASAPI는 등록된 인터페이스에서 IAudioSessionEvents::OnSessionDisconnected 메서드를 호출합니다. 이 메서드를 통해 WASAPI는 애플리케이션에 연결 끊김 이유를 알릴 수 있습니다. Windows Vista에서 OnSessionDisconnected 호출은 다음과 같은 이유를 식별합니다.

  • 사용자가 오디오 엔드포인트 디바이스를 제거했습니다.
  • Windows 오디오 서비스가 종료되었습니다.
  • 오디오 세션이 연결된 디바이스에 대해 기본 설정 스트림 형식이 변경되었습니다.
  • 사용자가 오디오 세션이 실행 중인 WTS(Windows 터미널 Services) 세션을 로그오프했습니다. WTS 세션에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.
  • 오디오 세션이 실행 중인 WTS 세션의 연결이 끊어졌습니다.
  • 오디오 엔드포인트 디바이스를 단독 모드 연결에 사용할 수 있도록 (공유 모드) 오디오 세션의 연결이 끊어졌습니다.

연결 끊기 이벤트에 대한 응답으로 WASAPI는 세션에 속한 모든 스트림을 닫습니다. 애플리케이션이 이후에 IAudioClient::GetCurrentPadding과 같은 WASAPI 메서드를 통해 닫힌 스트림에 액세스하려고 하면 메서드가 실패하고 오류 코드 AUDCLNT_E_DEVICE_INVALIDATED 반환합니다.

IAudioSessionEvents 인터페이스를 통해 알림을 받는 추가 이점은 알림이 비동기적으로 도착한다는 것입니다. 따라서 스트림이 실행되지 않더라도 애플리케이션은 스트림이 실행되지 않을 수 있는 잘못된 디바이스 오류에 대한 알림을 적시에 수신합니다.

스트림 관리