Windows 10 でボリューム スライダーの操作後に流れる音声を中断させると、その後一定期間システム音が流れなくなる
こんにちは、マルチメディアサポートチームです。今回は、Windows 10 Anniversary Update 及び Windows 10 Creators Update で確認されている、ある条件下でシステム音が流れない現象について案内します。
事象発生までの流れ
Windows 10 にて、タスク バーのスピーカー アイコンをクリックすると、以下 図1 のように、ボリュームを調整するための「ボリューム スライダー」がタスク バーの上に表示されます。
(図 1)
このボリューム スライダーを利用して任意の値にボリュームを設定した際、音量の確認のために、「一般の警告音」プログラム イベントで設定されている音が再生されます。(参照: 図 2)
(図 2)
この音が再生されている途中に、ユーザーがボリューム スライダー UI から (デスクトップをクリックするなどして) フォーカスを外します。その場合、以下の動作になる場合があります。
· Windows 10 Anniversary Update: 音がフェードアウトします。
· Windows 10 Creators Update: 音の再生が中断されます。
この状態で、以下の例に挙げられているような、「システム音」の再生を試みた場合、音が流れない場合があります。
· Beep API でBeep 音を再生する
· PlaySound API を"SND_SYSTEM" フラグを付けた状態で呼び出す(※1)
· 図2 で表示されている"サウンド" 項目のオーディオ データを [テスト] ボタンで再生する
事象の発生要因について
ユーザーによって操作されているボリューム スライダーは、Universal Windows Platform (UWP) 形態の OS コンポーネントとなっており、このコンポーネントの挙動が事象の発生に関連しています。
UWP 形態のアプリケーション プロセスの性質として、フォーカスが当たってインタラクティブな状態である場合には音を再生しますが、フォーカスを失いノンインタラクティブな状態となりますと、Mute 状態に遷移します。(※2)
また、UWP アプリのボリュームを管理する値として OS は「ポリシー ボリューム」(と呼ぶ内部的な変数)を利用しています。ボリューム スライダーの場合、ポリシー ボリュームがシステム音へ関与しており、システム音に対しある種の係数として働きかけます。
ボリューム スライダーに関連しているポリシー ボリュームは、Mute 状態となった後、ある程度の期間 その状態が維持されます。そのため、ボリューム スライダーのポリシー ボリュームが Mute 状態の間に再生されるシステム音は、ポリシー ボリュームの Mute の値 (=0) が係数として掛け算されます。結果として、最終ボリュームが 0 の状態でシステム音が再生され、事象が発生します。
なお、現象発生時に本来音が流れているタイミングにて、同様の UWP 形態の OS コンポーネント(ボリューム スライダー、スタート メニュー、トーストなど) がインタラクティブ状態である間は、ポリシー ボリュームが Mute 状態でなくなり音が復帰します。
対処策について
システム音が流れない事象に対する、考えられる対処法として、以下がございます。
· ボリューム スライダー操作時に再生される音を中断し、事象の発生条件を満たしている場合でも、中断後 システム音を一定時間 (10 秒以下) 再生しなかった場合、ポリシー ボリュームの Mute 状態は解除され、システム音を確認することが可能になります。
· Media Foundation により再生される音など、システム音以外の音は、この事象の影響を受けません。よって、音の再生方法として、Media Foundation 関連の API や、SND_SYSTEM フラグがセットされていない PlaySound API を使うことによって、事象を回避することが可能です。
注釈
※ 1: PlaySound API の使用方法については、以下のドキュメントをご参照ください。
PlaySound function
https://msdn.microsoft.com/en-us/library/dd743680(v=vs.85).aspx
※ 2: UWP
アプリケーションのライフサイクルの詳細については、以下のドキュメントをご参照ください。
Windows 10 ユニバーサルWindows プラットフォーム(UWP) アプリのライフサイクル