オーディオセッション

W3C作業草案,

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2024/WD-audio-session-20241113/
最新公開バージョン:
https://www.w3.org/TR/audio-session/
編集者草案:
https://w3c.github.io/audio-session/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/audio-session/
フィードバック:
GitHub
編集者:
(Apple)
(Mozilla)

概要

この API は、オーディオがどのようにレンダリングされ、他のオーディオ再生アプリケーションとどのように相互作用するかを制御するための API サーフェスを定義します。

この文書の状態

この節では、公開時点におけるこの文書の状態について説明します。現在の W3C 公開文書およびこの技術報告書の最新改訂版の一覧は、 https://www.w3.org/TR/ にある W3C 技術報告書インデックスで 見つけることができます。

この仕様に対するフィードバックおよびコメントを歓迎します。この仕様についての議論には、GitHub Issues が推奨されます。 あるいは、Media Working Group のメーリングリスト public-media-wg@w3.org (アーカイブ) にコメントを送ることもできます。 この草案では、ワーキンググループでまだ議論されるべき未解決の課題の一部を強調しています。 これらの課題の結果について、それらが有効であるかどうかを含め、まだ決定は行われていません。

この文書は、Media Working Group により、 勧告 トラックを用いて作業草案として公開されました。 この文書は W3C 勧告となることを意図しています。

作業草案としての公開は、W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 作業中の文書以外のものとしてこの文書を引用することは不適切です。

この文書は、W3C 特許ポリシーの下で運営されるグループによって作成されました。W3C は、そのグループの成果物に関連して行われた特許開示の公開一覧を維持しています。 そのページには、特許を開示するための手順も含まれています。個人が、その個人の実際の知識として、必須クレームを含むと信じる特許を知っている場合、その個人は W3C 特許ポリシー第 6 節に従って 情報を開示しなければなりません。

この文書は、2023年11月3日 W3C プロセス文書に準拠します。

1. はじめに

人々は、ますます Web を通じてメディア(オーディオ/ビデオ)を消費するようになっており、 Web はこの種のコンテンツにアクセスするための主要なチャネルになっています。 しかし、Web 上のメディアは、多くの場合、基盤となるプラットフォームとのシームレスな統合を欠いています。 Audio Session API は、オーディオセッション管理または類似のオーディオフォーカス機能をサポートする プラットフォーム全体でメディア処理を強化することにより、この隔たりに対処します。 この API は、Web ベースのオーディオが他のアプリとどのように相互作用するかを改善し、 コンテキストに応じて、より良いオーディオミキシングまたは排他的な再生を可能にし、 デバイス全体でより一貫した統合メディア体験を提供します。

さらに、一部のプラットフォームは、メディア再生およびオーディオ再生に使用される API に基づいて、 サイトのオーディオセッションを自動的に管理します。 しかし、この振る舞いは、常にユーザーの期待に沿うとは限りません。 この API により、開発者はデフォルトの振る舞いを上書きし、オーディオセッションをより細かく制御できます。

2. 概念

Web ページは、HTMLMediaElement や AudioContext などのさまざまな API を組み合わせて、さまざまな方法でオーディオ処理を行うことができます。 このオーディオ処理には開始と停止があり、使用されているすべての異なるオーディオ API を集約します。 オーディオセッションは、 この集約されたオーディオ処理を表します。これは、Web ページが行うオーディオ処理の一般的な性質を Web ページが表明できるようにします。

オーディオセッションは、特定の 型を持ち、 特定の 状態にあることができます。 オーディオセッションは、個々の ソース(マイク録音)およびシンク(オーディオレンダリング)の集合に対するオーディオを管理し、それらは オーディオセッションの 要素と呼ばれます。

オーディオセッションの要素には、 いくつかのプロパティがあります。

オーディオセッション要素は、その可聴フラグが true の場合、 可聴要素です。

さらに、オーディオセッション要素には、さまざまな状態変化を処理するための関連する手順があります。 デフォルトでは、これらの各手順は空の手順リストです。

この仕様は、これらの手順、デフォルト型、および可聴フラグを、オーディオセッションの一部の要素について、§ 6 オーディオソースおよびシンクの統合で定義しています。 他の要素を定義する仕様は、これらの手順とプロパティを定義する必要があります。

トップレベル閲覧コンテキストは、 選択されたオーディオセッションを持ちます。 任意のオーディオセッションに 変更があった場合、ユーザーエージェントはどのオーディオセッションが選択されたオーディオセッションになるかを更新します。 トップレベル閲覧コンテキストは、その選択されたオーディオセッションが null でなく、かつその状態が active である場合、オーディオフォーカスを持つといいます。

ユーザーエージェントは、複数のトップレベル閲覧コンテキストがオーディオ フォーカスを持つことを許可するか、または任意の時点で単一のトップレベル閲覧コンテキストだけがオーディオフォーカスを持つように強制するかを決定できます。

3. AudioSession インターフェイス

AudioSession は、この API の主要なインターフェイスです。 これは Navigator インターフェイスを通じてアクセスされます(§ 4 Navigator インターフェイスへの拡張を参照)。

[Exposed=Window]
interface AudioSession : EventTarget {
  attribute AudioSessionType type;

  readonly attribute AudioSessionState state;
  attribute EventHandler onstatechange;
};

realm に AudioSession オブジェクトを作成するには、次の手順を実行します。

  1. audioSession を、realm における新しい AudioSession オブジェクトとし、次の内部スロットで初期化します。

    1. [[type]] は、オーディオセッションの型を格納し、 auto に初期化されます。

    2. [[state]] は、オーディオセッションの状態を格納し、inactive に初期化されます。

    3. [[elements]] は、オーディオセッションの要素を格納し、空リストに初期化されます。

    4. [[interruptedElements]] は、可聴である間に 中断されたオーディオセッションの要素を格納し、 空リストに初期化されます。

    5. [[appliedType]] は、オーディオセッションに適用された型を格納し、 auto に初期化されます。

    6. [[isTypeBeingApplied]] フラグは、 型がオーディオセッションに適用中かどうかを格納し、 false に初期化されます。

  2. audioSession を返します。

各 AudioSession オブジェクトは、その基盤となるオーディオセッションに一意に結び付けられます。

AudioSession の state 属性は、そのオーディオ セッションの状態を反映します。 取得時には、AudioSession の [[state]] 値を返さなければなりません。

AudioSession の type 属性は、auto を除き、そのオーディオ セッションの型を反映します。

取得時には、AudioSession の [[type]] 値を返さなければなりません。

設定時には、audioSession に設定される新しい値を newValue として、 次の手順を実行しなければなりません。

  1. audioSession.[[type]] が newValue と等しい場合、これらの手順を中止します。

  2. audioSession.[[type]] を newValue に設定します。

  3. audioSession の型を更新します。

3.1. オーディオセッション型

慣例として、さまざまな目的に応じて、いくつかの異なるオーディオセッションの型があります。 API では、これらは AudioSessionType enum によって表されます。

playback
再生オーディオ。これは動画や音楽再生、ポッドキャストなどに使用されます。 他の再生オーディオとミックスされるべきではありません。(おそらく)他のすべてのオーディオを無期限に一時停止すべきです。
transient
通知音などの一時的なオーディオ。通常、再生オーディオの上に重ねて再生されるべきです(また、 永続的なオーディオを「ダック」することもあります)。
transient-solo
運転案内などの一時的なソロオーディオ。他のすべてのオーディオを一時停止/ミュートし、 排他的に再生すべきです。一時的なソロオーディオが終了したときは、一時停止/ミュートされたオーディオを再開すべきです。
ambient
アンビエントオーディオ。これは他の種類のオーディオとミックス可能です。 ユーザーが複数のページからのオーディオをミックスしたい場合など、一部の特殊なケースで有用です。
play-and-record
再生および録音オーディオ。これはオーディオ録音に使用されます。 マイクが使用されている場合やビデオ会議アプリケーションで有用です。
auto
Auto は、Web ページによるオーディオの使用に応じて、ユーザーエージェントが最適なオーディオセッション型を選択できるようにします。 これは AudioSession のデフォルト型です。
enum AudioSessionType {
  "auto",
  "playback",
  "transient",
  "transient-solo",
  "ambient",
  "play-and-record"
};

AudioSessionType は、それが playback、 play-and-record または transient-solo である場合、排他的型です。

3.2. オーディオセッション状態

オーディオセッションは、 次のいずれかの状態にあることができ、これらは API では AudioSessionState enum によって表されます。

active
オーディオセッションは、 音を再生しているか、マイクを録音しています。
interrupted
オーディオセッションは、 音を再生しておらず、マイクも録音していませんが、中断が解除されれば再開できます。
inactive
オーディオセッションは、 音を再生しておらず、マイクも録音していません。
enum AudioSessionState {
  "inactive",
  "active",
  "interrupted"
};

オーディオセッションの状態は 変化する可能性があり、その変化は状態の変化を通知する手順を通じて、対応する AudioSession オブジェクトに自動的に反映されます。

4. Navigator インターフェイスへの拡張

各 Window は、関連付けられた AudioSessionを持ち、これは AudioSession オブジェクトです。 これは、オーディオセッションパラメーターを自動的に設定するためにユーザーエージェントが使用するデフォルトの オーディオセッションを表します。 ユーザーエージェントは、オーディオセッション要素が再生を開始または終了したときに、 オーディオフォーカスを要求または放棄します。 Window オブジェクトの作成時に、その関連付けられた AudioSessionは、AudioSession オブジェクトとして新たに作成され、Window オブジェクトの関連するレルムで設定されなければなりません。

関連付けられた AudioSession の要素のリストは、Window オブジェクトのオーディオソースおよびシンクが作成または削除されるにつれて動的に更新されます。

[Exposed=Window]
partial interface Navigator {
  // The default audio session that the user agent will use when media elements start/stop playing.
  readonly attribute AudioSession audioSession;
};

5. オーディオセッションアルゴリズム

5.1. AudioSession の type を更新する

audioSession の型を更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[isTypeBeingApplied]] が true の場合、 これらの手順を中止します。

  2. audioSession.[[isTypeBeingApplied]] を true に設定します。

  3. 次の手順を実行するタスクをキューに入れます。

    1. audioSession.[[isTypeBeingApplied]] を false に設定します。

    2. audioSession.[[type]] が audioSession.[[appliedType]] と同じである場合、これらの手順を中止します。

    3. audioSession.[[appliedType]] を audioSession.[[type]] に設定します。

    4. audioSession により、audioSession のトップレベル閲覧コンテキストのすべての AudioSession 状態を更新します。

    5. audioSession.[[elements]] の各 element について、element を更新します。

    6. newType を、audioSession の型を計算する結果とします。

    7. 並列に、audioSession のオーディオセッションの型を newType に設定します。

5.2. AudioSession の state を更新する

オーディオセッション要素が開始または停止しているとき、ユーザーエージェントは、 非アクティブ化するおよびアクティブ化を試みるアルゴリズムを通じて、オーディオセッションの 状態を設定する手順を実行します。 オーディオセッションの状態を active に設定することには、特にオーディオセッションの型が排他的型である場合、結果が伴います。

逆に、オーディオセッションの 状態は、 オーディオセッション要素の変更とは別に変更されることがあります。 ユーザーエージェントがそのような変更を観測したとき、ユーザーエージェントは、変更されたオーディオセッションに 結び付けられた AudioSession オブジェクトである audioSession と、新しいオーディオセッション状態である newState を用いて、状態の変化を通知するためのタスクをキューに入れなければなりません。

アクティブな playback オーディオセッションは、着信電話、または別のタブで新しいメディアコンテンツの再生を開始しようとしている 別の playback セッションによって中断されることがあります。

audioSession および newState を用いて状態の 変化を通知するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. isMutatingState を、audioSession.[[state]] が newState でない場合は true、そうでない場合は false とします。

  2. audioSession.[[state]] を newState に設定します。

  3. newState が inactive の場合、 audioSession.[[interruptedElements]] を空リストに設定します。

  4. audioSession.[[elements]] の各 element について、element を更新します。

  5. isMutatingState が false の場合、これらの手順を中止します。

  6. audioSession により、audioSession のトップレベル閲覧コンテキストのすべての AudioSession 状態を更新します。

  7. audioSession に対して statechange という名前のイベントを発火します。

audioSession という名前の AudioSession を非アクティブ化するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[state]] が inactive である場合、 これらの手順を中止します。

  2. 次の手順を並列に実行します。

    1. audioSession のオーディオセッションの状態を設定し、 inactive にします。

    2. アサート: audioSession のオーディオセッションの状態は inactive です。

    3. audioSession と、そのオーディオセッションの状態を用いて、状態の 変化を通知するためのタスクをキューに入れます。

audioSession という名前の AudioSession のアクティブ化を試みるには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[state]] が active である場合、 これらの手順を中止します。

  2. 次の手順を並列に実行します。

    1. audioSession のオーディオセッションの状態を設定し、 active にします。 状態を設定することは、 active に対して失敗する可能性があり、その場合、オーディオセッションの状態は inactive または interrupted のいずれかになります。

    2. audioSession と、そのオーディオセッションの状態を用いて、状態の 変化を通知するためのタスクをキューに入れます。

オーディオセッションのアクティブ化は、 さまざまな理由で失敗する可能性があります。 たとえば、電話アプリケーションのようなより高い権限を持つアプリケーションがすでにオーディオを再生している間に、 Web アプリケーションが何らかのオーディオの再生を開始しようとする場合があります。

5.3. 選択されたオーディオセッションを更新する

context という名前のトップレベル閲覧コンテキストの選択された オーディオセッションを更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. activeAudioSessions を、context およびその子の AudioSession オブジェクトに結び付けられたすべてのオーディオセッションのうち、幅優先順で、次の 両方の制約に一致するもののリストとします。

    1. その状態は active です。

    2. AudioSession オブジェクトの型を計算する結果が排他的型です。

  2. activeAudioSessions が空の場合、これらの手順を中止します。

  3. activeAudioSessions 内にオーディオ セッションが 1 つだけある場合、選択されたオーディオセッションを このオーディオセッションに設定し、 これらの手順を中止します。

  4. アサート: activeAudioSessions 内のオーディオ セッションに結び付けられた任意の AudioSession オブジェクトで、audioSession という名前のものについて、 audioSession.[[type]] は auto です。

    明示的な排他的型を持つオーディオセッションは、任意の時点で 1 つだけ アクティブになれることが期待されます。 activeAudioSessions 内に複数のアクティブなオーディオセッションがある場合、それらの [[type]] は auto のみになり得ます。
  5. ユーザーエージェントは、activeAudioSessions を並べ替えるために特定のヒューリスティックを適用してもよいです。

  6. 選択されたオーディオセッションを、 activeAudioSessions 内の最初のオーディオセッションに設定します。

5.4. その他のアルゴリズム

context という名前のトップレベル閲覧コンテキストのすべての AudioSession 状態を更新するには、 updatedAudioSession を用いて、次の手順を実行します。

  1. context の選択されたオーディオセッションを更新します。

  2. updatedType を、updatedAudioSession の型を 計算する結果とします。

  3. updatedType が排他的型でない場合、または updatedAudioSession.[[state]] が active でない場合、 これらの手順を中止します。

  4. audioSessions を、context およびその子のすべての AudioSession オブジェクトの幅優先順のリストとします。

  5. updatedAudioSession を除く audioSessions の各 audioSession について、 次の手順を実行します。

    1. audioSession.[[state]] が active でない場合、 これらの手順を中止します。

    2. type を、audioSession の型を計算する結果とします。

    3. type が排他的型でない場合、これらの手順を中止します。

    4. type と updatedType がどちらも auto の場合、 これらの手順を中止します。

    5. audioSession を非アクティブ化します。

audioSession のオーディオ セッション型を計算するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[type]] が auto でない場合、 audioSession.[[type]] を返します。

  2. audioSession.[[elements]] のいずれかの element が play-and-record のデフォルト型を持ち、その状態が active である場合、 play-and-record を返します。

  3. audioSession.[[elements]] のいずれかの element が playback のデフォルト型を持ち、その状態が active である場合、 playback を返します。

  4. audioSession.[[elements]] のいずれかの element が transient-solo のデフォルト型を持ち、その状態が active である場合、 transient-solo を返します。

  5. audioSession.[[elements]] のいずれかの element が transient のデフォルト型を持ち、その状態が active である場合、 transient を返します。

  6. ambient を返します。

6. オーディオソースおよびシンクの統合

この節では、AudioContext、 HTMLMediaElement およびマイクの MediaStreamTrack について、オーディオ セッション要素の手順とプロパティを説明します。

要素状態は次のとおりです。

element という名前の要素を更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession を element の AudioSession とします。

  2. element の更新手順を実行します。

  3. element が可聴要素であり、かつ audioSession.[[state]] が interrupted である場合、 次の手順を実行します。

    1. element を audioSession.[[interruptedElements]] に追加します。

    2. element の一時停止手順を実行します。

  4. element が audioSession.[[interruptedElements]] 内にあり、かつ audioSession.[[state]] が active である場合、 次の手順を実行します。

    1. element を audioSession.[[interruptedElements]] から削除します。

    2. element の再開手順を実行します。

audioSession の要素の 1 つの可聴フラグが 変化しているとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. 可聴フラグが true に変化している場合、audioSession のアクティブ化を試みます。

  2. そうでなく、audioSession.[[elements]] のいずれかの element が interrupted の状態を持つ場合、 これらの手順を中止します。

  3. そうでなければ、audioSession を非アクティブ化します。

6.1. AudioContext

AudioContext は、次のプロパティを持つ要素です。

AudioContext が作成されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioContext を、新しく作成された AudioContext とします。

  2. audioSession を、audioContext が作成される Window オブジェクトの AudioSession オブジェクトとします。

  3. audioContext を audioSession.[[elements]] に追加します。

6.2. HTMLMediaElement

HTMLMediaElement は、次のプロパティを持つ要素です。

HTMLMediaElement の ノード文書が変更されるとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. mediaElement を、そのノード文書が変更される HTMLMediaElement とします。

  2. previousWindow を、存在する場合は mediaElement の以前のノード文書に関連付けられた Window オブジェクトとし、そうでなければ null とします。

  3. previousWindow が null でない場合、mediaElement を previousWindow の関連付けられた AudioSession.[[elements]] から削除します。

  4. newWindow を、存在する場合は mediaElement の新しいノード文書に関連付けられた Window オブジェクトとし、そうでなければ null とします。

  5. newWindow が null でない場合、mediaElement を newWindow の関連付けられた AudioSession.[[elements]] に追加します。

6.3. マイク MediaStreamTrack

マイクキャプチャ MediaStreamTrack は、次のプロパティを持つ要素です。

マイクキャプチャ MediaStreamTrack が作成されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. track を、新しく作成された MediaStreamTrack とします。

  2. audioSession を、track が作成される Window オブジェクトの AudioSession オブジェクトとします。

  3. track を audioSession.[[elements]] に追加します。

FIXME: MediaStreamTrack ではなく、Window の mediaDevices の mediaStreamTrackSources に格納されたオーディオトラックのソースにフックするべきです。 これは、転送されたマイクトラックの場合を扱うべきです。

7. プライバシーに関する考慮事項

8. セキュリティに関する考慮事項

9. 例

9.1. サイトがオーディオセッション型を先回りして "play-and-record" に設定する

navigator.audioSession.type = 'play-and-record';
// これ以降、音量は 'play-and-record' に基づいて設定される可能性があります。
...
// リモートメディアの再生を開始する
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// キャプチャを開始する
navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((stream) => {
    localVideo.srcObject = stream;
  });

9.2. サイトが中断に反応する

navigator.audioSession.type = "play-and-record";
// これ以降、音量は 'play-and-record' に基づいて設定される可能性があります。
...
// リモートメディアの再生を開始する
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// キャプチャを開始する
navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((stream) => {
    localVideo.srcObject = stream;
  });

navigator.audioSession.onstatechange = async () => {
  if (navigator.audioSession.state === "interrupted") {
    localVideo.pause();
    remoteVideo.pause();
    // 通話が中断されていることをユーザーに明確に示す。
    showInterruptedBanner();
    for (const track of localVideo.srcObject.getTracks()) {
      track.enabled = false;
    }
  } else {
    // 通話をいつ再開するかはユーザーに決めさせる。
    const shouldRestart = await showOptionalRestartBanner();
    if (!shouldRestart) {
      return;
    }
    for (const track of localVideo.srcObject.getTracks()) {
      track.enabled = true;
    }
    localVideo.play();
    remoteVideo.play();
  }
};

10. 謝辞

ワーキンググループは、この仕様への貴重な貢献について、次の方々に謝意を表します。

適合性

文書 規約

適合性要件は、記述的な表明と RFC 2119 の用語の組み合わせによって表現されます。 この文書の規範的な部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、 RFC 2119 で説明されているように解釈されるものとします。 ただし、読みやすさのために、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のすべてのテキストは、非規範的であると明示的に示された節、例、および注を除いて、 規範的です。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 または class="example" によって 規範的なテキストから分離されます。 例えば次のようになります。

これは情報提供的な例の一例です。

情報提供的な注は “Note” という語で始まり、 class="note" によって 規範的なテキストから分離されます。 例えば次のようになります。

注、これは情報提供的な注です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (例えば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など)の意味で解釈されるものとします。

アルゴリズムまたは具体的な手順として表現された適合性要件は、 最終的な結果が等価である限り、 どのような方法でも実装できます。 特に、この仕様で定義されるアルゴリズムは、 理解しやすいことを意図したものであり、 高性能であることを意図したものではありません。 実装者には最適化が推奨されます。

索引

この仕様で定義される 用語

参照により 定義される用語

参照文献

規範的参照文献

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. 2024年10月3日. CR. URL: https://www.w3.org/TR/mediacapture-streams/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBAUDIO]
Paul Adenot; Hongchan Choi. Web Audio API. 2021年6月17日. REC. URL: https://www.w3.org/TR/webaudio/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL 索引

[Exposed=Window]
interface AudioSession : EventTarget {
  attribute AudioSessionType type;

  readonly attribute AudioSessionState state;
  attribute EventHandler onstatechange;
};

enum AudioSessionType {
  "auto",
  "playback",
  "transient",
  "transient-solo",
  "ambient",
  "play-and-record"
};

enum AudioSessionState {
  "inactive",
  "active",
  "interrupted"
};

[Exposed=Window]
partial interface Navigator {
  // The default audio session that the user agent will use when media elements start/stop playing.
  readonly attribute AudioSession audioSession;
};