오디오 세션

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에 의해 Recommendation 트랙을 사용하여 Working Draft로 공개되었다. 이 문서는 W3C Recommendation이 되는 것을 목적으로 한다.

Working Draft로 공개되었다고 해서 W3C 및 그 회원들의 지지를 의미하지는 않는다.

이 문서는 초안 문서이며 언제든지 다른 문서로 갱신되거나 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에 의해 작성되었다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지 관리하며, 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있다. 개인이 자신이 알고 있는 특허가 Essential Claim(s)을 포함한다고 실제로 인지한 경우, 그 개인은 W3C Patent Policy의 6절에 따라 정보를 공개해야 한다.

이 문서는 2023년 11월 03일 W3C Process Document의 적용을 받는다.

1. 소개

사람들은 점점 더 Web을 통해 미디어(오디오/비디오)를 소비하고 있으며, Web은 이러한 종류의 콘텐츠에 접근하기 위한 주요 채널이 되었습니다. 그러나 Web상의 미디어는 많은 경우 기반 플랫폼과의 매끄러운 통합이 부족합니다. Audio Session API는 오디오 세션 관리 또는 유사한 오디오 포커스 기능을 지원하는 플랫폼 전반에서 미디어 처리를 강화함으로써 이 간극을 해결합니다. 이 API는 Web 기반 오디오가 다른 앱과 어떻게 상호작용하는지를 개선하고, 컨텍스트에 따라 더 나은 오디오 믹싱 또는 배타적 재생을 가능하게 하며, 디바이스 전반에서 더 일관되고 통합된 미디어 경험을 제공합니다.

또한 일부 플랫폼은 미디어 재생 및 오디오 재생에 사용되는 API를 기반으로 사이트의 오디오 세션을 자동으로 관리합니다. 그러나 이 동작이 항상 사용자 기대와 일치하는 것은 아닐 수 있습니다. 이 API를 통해 개발자는 기본 동작을 덮어쓰고 오디오 세션을 더 세밀하게 제어할 수 있습니다.

2. 개념

Web 페이지는 HTMLMediaElementAudioContext 같은 여러 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;
};

realmAudioSession 객체를 만들려면 다음 절차를 실행합니다.

  1. audioSessionrealm의 새로운 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 객체가 생성될 때, 그 관련 AudioSessionWindow 객체의 관련 realm으로 새로 생성된 AudioSession 객체로 설정되어야 합니다.

관련 AudioSession요소 목록은 Window 객체의 오디오 소스와 싱크가 생성되거나 제거됨에 따라 동적으로 갱신됩니다.

[Exposed=Window]
partial interface Navigator {
  // 미디어 요소가 재생을 시작/중지할 때 사용자 에이전트가 사용할 기본 오디오 세션.
  readonly attribute AudioSession audioSession;
};

5. 오디오 세션 알고리즘

5.1. AudioSession의 type 갱신

audioSessiontype을 갱신하려면, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. audioSession.[[isTypeBeingApplied]]true이면, 이 단계를 중단한다.

  2. audioSession.[[isTypeBeingApplied]]true로 설정한다.

  3. 다음 단계를 실행하도록 task를 큐에 넣는다:

    1. audioSession.[[isTypeBeingApplied]]false로 설정한다.

    2. audioSession.[[type]]audioSession.[[appliedType]]와 같으면, 이 단계를 중단한다.

    3. audioSession.[[appliedType]]audioSession.[[type]]으로 설정한다.

    4. audioSession와 함께, audioSession최상위 브라우징 컨텍스트모든 AudioSession 상태를 갱신한다.

    5. audioSession.[[elements]]의 각 element에 대해, element갱신한다.

    6. newTypeaudioSessiontype 계산 결과로 둔다.

    7. 병렬로, audioSession오디오 세션typenewType으로 설정한다.

5.2. AudioSession의 state 갱신

오디오 세션 요소가 시작하거나 중지할 때, 사용자 에이전트는 비활성화활성화 시도 알고리즘을 통해 오디오 세션state를 설정하는 단계를 실행한다. 오디오 세션stateactive로 설정하면 결과가 발생하며, 특히 오디오 세션type배타적 유형인 경우 그러하다:

반대로, 오디오 세션 state는 오디오 세션 요소 변경 외부에서 수정될 수 있다. 사용자 에이전트가 그러한 수정을 관찰하면, 사용자 에이전트는 반드시 audioSession, 수정된 오디오 세션결부된 AudioSession 객체, 그리고 newState를 새 오디오 세션 state로 하여 state의 변화를 알리기 위한 task를 큐에 넣어야 한다.

활성 상태의 playback 오디오 세션은 수신 전화나, 다른 탭에서 새 미디어 콘텐츠 재생을 시작하려는 다른 playback 세션에 의해 중단될 수 있다.

audioSessionnewState와 함께 state의 변화를 알리려면, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. isMutatingStateaudioSession.[[state]]newState가 아니면 true로, 그렇지 않으면 false로 둔다.

  2. audioSession.[[state]]newState로 설정한다.

  3. newStateinactive이면, audioSession.[[interruptedElements]]를 빈 목록으로 설정한다.

  4. audioSession.[[elements]]의 각 element에 대해, element갱신한다.

  5. isMutatingStatefalse이면, 이 단계를 중단한다.

  6. audioSession와 함께, audioSession최상위 브라우징 컨텍스트모든 AudioSession 상태를 갱신한다.

  7. audioSession에서 statechange라는 이름의 이벤트를 발생시킨다.

audioSession이라는 AudioSession비활성화하려면, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. audioSession.[[state]]inactive이면, 이 단계를 중단한다.

  2. 다음 단계를 병렬로 실행한다:

    1. audioSession오디오 세션state를 설정하여 inactive로 한다.

    2. 단언: audioSession오디오 세션stateinactive이다.

    3. audioSession 및 그 오디오 세션state와 함께 state의 변화를 알리기 위한 task를 큐에 넣는다.

audioSession이라는 AudioSession활성화 시도하려면, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. audioSession.[[state]]active이면, 이 단계를 중단한다.

  2. 다음 단계를 병렬로 실행한다:

    1. audioSession오디오 세션state를 설정하여 active로 한다. state를 설정하여 active로 하는 것은 실패할 수 있으며, 이 경우 오디오 세션stateinactive 또는 interrupted 중 하나가 된다.

    2. audioSession 및 그 오디오 세션state와 함께 state의 변화를 알리기 위한 task를 큐에 넣는다.

오디오 세션 활성화는 여러 이유로 실패할 수 있다. 예를 들어 Web 애플리케이션이 일부 오디오 재생을 시작하려고 할 때, 전화 통화 애플리케이션 같은 더 높은 권한의 애플리케이션이 이미 오디오를 재생하고 있을 수 있다.

5.3. 선택된 오디오 세션 갱신

context라는 이름의 최상위 브라우징 컨텍스트선택된 오디오 세션을 갱신하려면, 사용자 에이전트는 다음 단계를 반드시 실행해야 한다:

  1. activeAudioSessionscontext 및 그 자식들의 AudioSession 객체에 결부된 모든 오디오 세션 중 너비 우선 순서로 된 목록으로 하며, 다음 두 제약 조건을 모두 만족하는 것들로 한다:

    1. 상태active이다.

    2. AudioSession 객체의 type 계산 결과가 배타적 유형이다.

  2. activeAudioSessions가 비어 있으면, 이 단계를 중단한다.

  3. activeAudioSessions오디오 세션이 하나만 있으면, 선택된 오디오 세션을 이 오디오 세션으로 설정하고 이 단계를 중단한다.

  4. 단언: activeAudioSessions오디오 세션결부된 임의의 AudioSession 객체 중 audioSession이라는 이름의 객체에 대해, audioSession.[[type]]auto이다.

    명시적인 배타적 유형을 가진 오디오 세션은 임의의 시점에 하나만 활성화될 것으로 예상된다. activeAudioSessions에 여러 활성 오디오 세션이 있는 경우, 그들의 [[type]]auto일 수밖에 없다.
  5. 사용자 에이전트는 activeAudioSessions의 순서를 재배열하기 위해 특정 휴리스틱을 적용할 수 있다.

  6. 선택된 오디오 세션activeAudioSessions의 첫 번째 오디오 세션으로 설정한다.

5.4. 기타 알고리즘

updatedAudioSession와 함께 context라는 이름의 최상위 브라우징 컨텍스트모든 AudioSession 상태를 갱신하려면, 다음 단계를 실행한다:

  1. context선택된 오디오 세션을 갱신한다.

  2. updatedTypeupdatedAudioSessiontype 계산 결과로 둔다.

  3. updatedType배타적 유형이 아니거나, updatedAudioSession.[[state]]active가 아니면, 이 단계를 중단한다.

  4. audioSessionscontext 및 그 자식들의 모든 AudioSession 객체를 너비 우선 순서로 나열한 목록으로 둔다.

  5. updatedAudioSession을 제외한 audioSessions의 각 audioSession에 대해, 다음 단계를 실행한다:

    1. audioSession.[[state]]active가 아니면, 이 단계를 중단한다.

    2. typeaudioSessiontype 계산 결과로 둔다.

    3. type배타적 유형이 아니면, 이 단계를 중단한다.

    4. typeupdatedType이 모두 auto이면, 이 단계를 중단한다.

    5. audioSession비활성화한다.

audioSession오디오 세션 유형을 계산하려면, 사용자 에이전트는 다음 단계를 반드시 실행해야 한다:

  1. audioSession.[[type]]auto가 아니면, audioSession.[[type]]을 반환한다.

  2. audioSession.[[elements]]의 어떤 elementplay-and-record기본 유형을 가지고, 그 상태active이면, play-and-record를 반환한다.

  3. audioSession.[[elements]]의 어떤 elementplayback기본 유형을 가지고, 그 상태active이면, playback을 반환한다.

  4. audioSession.[[elements]]의 어떤 elementtransient-solo기본 유형을 가지고, 그 상태active이면, transient-solo를 반환한다.

  5. audioSession.[[elements]]의 어떤 elementtransient기본 유형을 가지고, 그 상태active이면, transient를 반환한다.

  6. ambient를 반환한다.

6. 오디오 소스 및 싱크 통합

이 절은 AudioContext, HTMLMediaElement 및 마이크 MediaStreamTrack에 대한 오디오 세션 요소의 절차와 프로퍼티를 설명한다.

요소 상태는 다음과 같다:

element라는 이름의 요소를 갱신하려면, 사용자 에이전트는 다음 단계를 반드시 실행해야 한다:

  1. audioSessionelementAudioSession으로 둔다.

  2. element갱신 절차를 실행한다.

  3. element가청 요소이고 audioSession.[[state]]interrupted이면, 다음 단계를 실행한다:

    1. elementaudioSession.[[interruptedElements]]에 추가한다.

    2. element일시정지 절차를 실행한다.

  4. elementaudioSession.[[interruptedElements]] 안에 있고, audioSession.[[state]]active이면, 다음 단계를 실행한다:

    1. elementaudioSession.[[interruptedElements]]에서 제거한다.

    2. element재개 절차를 실행한다.

audioSession요소 중 하나의 가청 플래그가 변경될 때, 사용자 에이전트는 다음 단계를 반드시 실행해야 한다:

  1. 가청 플래그true로 변경되는 경우, audioSession활성화 시도한다.

  2. 그렇지 않고, audioSession.[[elements]]의 어떤 elementinterrupted상태를 가지면, 이 단계를 중단한다.

  3. 그렇지 않으면, audioSession비활성화한다.

6.1. AudioContext

AudioContext 는 다음 프로퍼티를 가진 요소이다:

AudioContext 가 생성될 때, 사용자 에이전트는 다음 단계를 반드시 실행해야 한다:

  1. audioContext를 새로 생성된 AudioContext로 둔다.

  2. audioSessionaudioContext가 생성된 Window 객체의 AudioSession 객체로 둔다.

  3. audioContextaudioSession.[[elements]]에 추가한다.

6.2. HTMLMediaElement

HTMLMediaElement는 다음 프로퍼티를 가진 요소이다:

HTMLMediaElement노드 문서가 변경될 때, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. mediaElement를 그 노드 문서가 변경되고 있는 HTMLMediaElement로 둔다.

  2. previousWindowmediaElement의 이전 노드 문서에 연관된 Window 객체로 둔다. 그러한 객체가 없으면 null로 둔다.

  3. previousWindownull이 아니면, mediaElementpreviousWindow관련 AudioSession.[[elements]]에서 제거한다.

  4. newWindowmediaElement의 새 노드 문서에 연관된 Window 객체로 둔다. 그러한 객체가 없으면 null로 둔다.

  5. newWindownull이 아니면, mediaElementnewWindow관련 AudioSession.[[elements]]에 추가한다.

6.3. 마이크 MediaStreamtrack

마이크 캡처 MediaStreamTrack은 다음 프로퍼티를 가진 요소이다:

마이크 캡처 MediaStreamTrack이 생성될 때, 사용자 에이전트는 반드시 다음 단계를 실행해야 한다:

  1. track을 새로 생성된 MediaStreamTrack으로 둔다.

  2. audioSessiontrack이 생성된 Window 객체의 AudioSession 객체로 둔다.

  3. trackaudioSession.[[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]

이 명세의 예제는 “예를 들어”라는 말로 도입되거나, 다음과 같이 class="example"을 사용하여 규범적 텍스트와 구분된다:

이는 정보 제공용 예제의 예이다.

정보 제공용 주석은 “Note”라는 단어로 시작하며, 다음과 같이 class="note"를 사용하여 규범적 텍스트와 구분된다:

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;
};