Skip to content

Commit

Permalink
Fix: [Client/Player] 一部の assert を削除
Browse files Browse the repository at this point in the history
絶対に発生しないと思っていたが、よく考えると init() 完了前に destroy() される可能性もなくもないため
  • Loading branch information
tsukumijima committed Oct 25, 2023
1 parent 61ef436 commit e480921
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 29 deletions.
34 changes: 19 additions & 15 deletions client/src/services/player/PlayerWrapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -923,8 +923,6 @@ class PlayerWrapper {
* player_store.event_emitter.emit('PlayerRestartRequired', 'プレイヤーロジックを再起動しています…') のようにイベントを発火させるべき
*/
public async destroy(): Promise<void> {
assert(this.player !== null);
assert(this.player_container_resize_observer !== null);
const player_store = usePlayerStore();

// すでに破棄されているのに再度実行してはならない
Expand All @@ -947,12 +945,14 @@ class PlayerWrapper {
// ローディング状態への移行に伴い、映像がフェードアウトするアニメーション (0.2秒) 分待ってから実行
// この 0.2 秒の間に音量をフェードアウトさせる
// なお、ザッピングでチャンネルを連続で切り替えている場合は実行しない (実行しても意味がないため)
const current_volume = this.player.user.get('volume');
// 20回 (0.01秒おき) に分けて音量を下げる
for (let i = 0; i < 20; i++) {
await Utils.sleep(0.01);
if (this.player?.video) {
this.player.video.volume = current_volume * (1 - (i + 1) / 20);
if (this.player !== null) {
const current_volume = this.player.user.get('volume');
// 20回 (0.01秒おき) に分けて音量を下げる
for (let i = 0; i < 20; i++) {
await Utils.sleep(0.01);
if (this.player && this.player.video) { // この行がないとタイミングによってはエラーになる
this.player.video.volume = current_volume * (1 - (i + 1) / 20);
}
}
}

Expand All @@ -961,17 +961,21 @@ class PlayerWrapper {
window.clearTimeout(this.player_control_ui_hide_timer_id);

// プレイヤー全体のコンテナ要素の監視を停止
this.player_container_resize_observer.disconnect();
this.player_container_resize_observer = null;
if (this.player_container_resize_observer !== null) {
this.player_container_resize_observer.disconnect();
this.player_container_resize_observer = null;
}

// DPlayer 本体を破棄
// なぜか例外が出ることがあるので try-catch で囲む
try {
this.player.destroy();
} catch (e) {
// 何もしない
if (this.player !== null) {
try {
this.player.destroy();
} catch (e) {
// 何もしない
}
this.player = null;
}
this.player = null;

// 破棄済みかどうかのフラグを立てる
this.destroyed = true;
Expand Down
8 changes: 4 additions & 4 deletions client/src/services/player/managers/LiveEventManager.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@

import assert from 'assert';

import DPlayer from 'dplayer';

Expand Down Expand Up @@ -263,11 +262,12 @@ class LiveEventManager implements PlayerManager {
* サーバー側のライブストリームステータス API (Server-Sent Events) への接続を切断し、ライブストリームのステータス監視を停止する
*/
public async destroy(): Promise<void> {
assert(this.eventsource !== null);

// EventSource を破棄し、Server-Sent Events のストリーミングを終了する
this.eventsource.close();
this.eventsource = null;
if (this.eventsource !== null) {
this.eventsource.close();
this.eventsource = null;
}
}
}

Expand Down
10 changes: 0 additions & 10 deletions client/src/views/TV/Watch2.vue
Original file line number Diff line number Diff line change
Expand Up @@ -263,10 +263,6 @@ export default Vue.extend({
// ザッピング(「前/次のチャンネル」ボタン or 上下キーショートカット)によるチャンネル移動かどうか
is_zapping: false,
// ザッピングで連続してチャンネルを切り替えている最中かどうか
// 「連続して」とは、切り替える間隔が 0.5 秒以下で、再生セッションが初期化される前に次のチャンネルに切り替えたときのこと
is_zapping_continuously: false,
// ***** プレイヤー *****
// PlayerWrapper のインスタンス
Expand Down Expand Up @@ -407,10 +403,6 @@ export default Vue.extend({
// 前の再生セッションを破棄して終了する
const destroy_promise = this.destroy();
// 連続してチャンネルを切り替えていることを示すフラグを立てる
// このフラグは再生セッションが初期化されるタイミングで必ず降ろされる
this.is_zapping_continuously = true;
// チャンネル ID を次のチャンネルのものに切り替える
this.channelsStore.display_channel_id = to.params.display_channel_id;
Expand All @@ -422,13 +414,11 @@ export default Vue.extend({
if (this.is_zapping === true) {
this.is_zapping = false;
this.interval_ids.push(window.setTimeout(() => {
this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす
destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する
}, 0.5 * 1000));
// 通常のチャンネル移動時は、すぐに再生セッションを初期化する
} else {
this.is_zapping_continuously = false; // 新しいセッションを初期化するので、フラグを下ろす
destroy_promise.then(() => this.init()); // destroy() の実行完了を待ってから初期化する
}
})();
Expand Down

0 comments on commit e480921

Please sign in to comment.