Восстановление после ошибки "Недопустимое устройство"

Многие методы в WASAPI возвращают код ошибки AUDCLNT_E_DEVICE_INVALIDATED, если устройство аудио конечной точки, которое использует клиентское приложение, становится недействительным. Этот код ошибки указывает, что устройство конечной точки было отключено или что звуковое оборудование или связанные аппаратные ресурсы были перенастроены, отключены, удалены или недоступны для использования. Часто приложение может восстановиться после этой ошибки.

Примечание.

Сведения о восстановлении из недопустимых ошибок устройства при использовании API пространственного звука (ISAC) см. в разделе "Восстановление из ошибки недопустимого устройства ( пространственный звук)

Стратегия, которую приложение должно использовать для восстановления после ошибки 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 завершила работу.
  • Предпочтительный формат потока изменился для устройства, к которому подключен сеанс аудио.
  • Пользователь вошел в сеанс Терминал Windows Services (WTS), в котором был запущен звуковой сеанс. Дополнительные сведения о сеансах WTS см. в документации по пакету SDK для Windows.
  • Сеанс WTS, в котором был запущен звуковой сеанс, был отключен.
  • Сеанс аудиосвязи (общий режим) был отключен, чтобы сделать устройство аудио конечной точки доступным для подключения в монопольном режиме.

В ответ на событие отключения WASAPI закрывает все потоки, принадлежащие сеансу. Если приложение впоследствии пытается получить доступ к закрытому потоку через метод WASAPI, например IAudioClient::GetCurrentPadding, метод завершается ошибкой и возвращает код ошибки AUDCLNT_E_DEVICE_INVALIDATED.

Дополнительное преимущество получения уведомлений через интерфейс IAudioSessionEvents заключается в том, что уведомления прибывают асинхронно. Таким образом, даже если поток не запущен, приложение по-прежнему получит своевременное уведомление об ошибках недопустимого устройства, которые могут предотвратить выполнение потока.

Управление потоками