無効なデバイス エラーからの回復

WASAPI のメソッドの多くは、クライアント アプリケーションが使用しているオーディオ エンドポイント デバイスが無効になった場合に、AUDCLNT_E_DEVICE_INVALIDATED エラー コードを返します。 このエラー コードは、エンドポイント デバイスが取り外されていること、またはオーディオ ハードウェアや関連するハードウェア リソースが再構成、無効化、削除されていること、あるいはその他の方法で使用できなくなったことを示しています。 多くの場合、アプリケーションはこのエラーから回復できます。

Note

空間オーディオ 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 ターミナル サービス (WTS) のセッションからログオフしました。 WTS セッションの詳細については、Windows SDK ドキュメントを参照してください。
  • オーディオ セッションが実行されていた WTS セッションが切断されました。
  • (共有モード) オーディオ セッションが切断され、オーディオ エンドポイント デバイスが排他モード接続で使用できるようになりました。

切断イベントに応答して、WASAPI はセッションに属するすべてのストリームを閉じます。 その後、アプリケーションが IAudioClient::GetCurrentPadding などの WASAPI メソッドを介して閉じたストリームにアクセスしようとすると、メソッドは失敗し、エラー コード AUDCLNT_E_DEVICE_INVALIDATED を返します。

IAudioSessionEvents インターフェイスを介して通知を受け取るもう 1 つの利点は、通知が非同期に受信されることです。 したがって、ストリームが実行されていない場合でも、アプリケーションは、ストリームの実行を妨げる可能性がある無効なデバイス エラーのタイムリーな通知を受け取ります。

ストリームの管理