/**
* @file audio-track-list.js
*/
'./track-list'에서 TrackList 가져오기;
/**
* 우리가 이 함수를 호출하는 모든 곳에서 우리는 사양에서 벗어납니다.
* 한 번에 하나의 활성화된 오디오 트랙만 지원하므로
*
* @param {AudioTrackList} 목록
* 작업할 목록
*
* @param {AudioTrack} 트랙
* 건너뛸 트랙
*
* @사적인
*/
const disableOthers = 기능(목록, 추적) {
에 대한 (하자 i = 0; i < 목록 길이; i++) {
if (!Object.keys(list[i]).length || track.id === list[i].id) {
계속하다;
}
// 다른 오디오 트랙이 활성화되어 있으면 비활성화합니다.
list[i].enabled = 거짓;
}
};
/**
* 미디어 파일에 대한 {@link AudioTrack}의 현재 목록입니다.
*
* @see [사양]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}
* @extends 트랙리스트
*/
클래스 AudioTrackList 확장 TrackList {
/**
* 이 클래스의 인스턴스를 만듭니다.
*
* @param {AudioTrack[]} [트랙=[]]
* 목록을 인스턴스화할 `AudioTrack` 목록.
*/
생성자(트랙 = []) {
// 1개의 트랙만 활성화되었는지 확인
// 마지막 인덱스에서 첫 번째 인덱스로 정렬
for (let i = 트랙 길이 - 1; i > = 0; 나--) {
if (트랙[i].활성화) {
disableOthers(트랙, 트랙[i]);
부서지다;
}
}
슈퍼(트랙);
this.change_ = 거짓;
}
/**
* `AudioTrackList`에 {@link AudioTrack}을 추가합니다.
*
* @param {AudioTrack} 트랙
* 목록에 추가할 AudioTrack
*
* @fires 트랙리스트#addtrack
*/
addTrack(트랙) {
if (트랙.활성화) {
disableOthers(this, 트랙);
}
super.addTrack(트랙);
// 네이티브 트랙에는 이것이 없습니다.
if (!track.addEventListener) {
반품;
}
track.enabledChange_ = () => {
// 다른 트랙을 비활성화할 때(지원하지 않기 때문에)
// 한 번에 하나 이상의 트랙) changing_을 설정합니다.
// 추가 변경 이벤트를 트리거하지 않도록 true로 변경
if (이.변화_) {
반품;
}
this.change_ = 참;
disableOthers(this, 트랙);
this.change_ = 거짓;
this.trigger('변경');
};
/**
* @listens AudioTrack#enabledchange
* @fires 트랙리스트#변경
*/
track.addEventListener('enabledchange', track.enabledChange_);
}
removeTrack(rtrack) {
super.removeTrack(rtrack);
if (rtrack.removeEventListener && rtrack.enabledChange_) {
rtrack.removeEventListener('enabledchange', rtrack.enabledChange_);
rtrack.enabledChange_ = null;
}
}
}
기본 AudioTrackList 내보내기;