/**
 * @file 音軌列表.js
 */
從 './track-list' 導入 TrackList;

/**
 * 我們調用這個函數的任何地方都與規範不同
 * 因為我們一次只支持一個啟用的音軌
 *
 * @param {AudioTrackList} 列表
 * 工作清單
 *
 * @param {AudioTrack} 音軌
 * 要跳過的曲目
 *
 * @私人的
 */
const disableOthers = function(list, track) {
  為 (讓我 = 0; 我 < 列出. 長度; 我 ++) {
    如果(!對象鍵(列表 [I])。長度 || 跟踪 ID === 列表 [我] .id){
      繼續;
    }
    // 啟用另一個音軌,禁用它
    列表 [i].enabled = false;
  }
};

/**
 * 媒體文件的當前 {@link AudioTrack} 列表。
 *
 * @see [規範]{@link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist}
 * @extends 曲目列表
 */
類 AudioTrackList 擴展 TrackList {

  /**
   * 創建此類的一個實例。
   *
   * @param {AudioTrack[]} [tracks=[]]
   * 用於實例化列表的 `AudioTrack` 列表。
   */
  構造函數(軌道= []){
    // 確保只啟用了 1 個軌道
    // 從最後一個索引到第一個索引排序
    對於(讓 i = tracks.length - 1; i >= 0; i--){
      如果(軌道[i].enabled){
        禁用其他(曲目,曲目[i]);
        休息;
      }
    }

    超級(曲目);
    this.changing_ = false;
  }

  /**
   * 添加一個 {@link AudioTrack} 到 `AudioTrackList`。
   *
   * @param {AudioTrack} 音軌
   * 添加到列表中的 AudioTrack
   *
   * @fires TrackList#addtrack
   */
  添加軌道(軌道){
    如果(track.enabled){
      禁用其他(這,跟踪);
    }

    super.addTrack(軌道);
    // 本機曲目沒有這個
    如果(!track.addEventListener){
      返回;
    }

    track.enabledChange_ = () => {
      // 當我們禁用其他軌道時(因為我們不支持
      // 一次不止一個軌道)我們將設置 changing_
      // 為真,這樣我們就不會觸發額外的更改事件
      如果(this.changing_){
        返回;
      }
      this.changing_ = true;
      禁用其他(這,跟踪);
      this.changing_ = false;
      this.trigger('改變');
    };

    /**
     * @listens AudioTrack#enabledchange
     * @fires 曲目列表#change
     */
    track.addEventListener('enabledchange', track.enabledChange_);
  }

  removeTrack(rtrack){
    super.removeTrack(rtrack);

    如果(rtrack.removeEventListener && rtrack.enabledChange_){
      rtrack.removeEventListener('enabledchange', rtrack.enabledChange_);
      rtrack.enabledChange_ = null;
    }
  }
}

導出默認 AudioTrackList;