跳转到内容

Status Management

此内容尚不支持你的语言。

Stretcher は通常の playing / paused / stopped に加えて、bufferingbuffer health という独自の状態管理を持ちます。チャンクの変換状況に応じて再生を一時停止・再開し、UI にバッファ状態を通知します。

Phase(再生状態)遷移

Stretcher の再生状態は 5 つの Phase で管理されます。

start()
waiting ──→ buffering ──→ playing ←──→ paused
↑ │ │
│ ↓ │
└── underrun ──┘ │
ended ←──────┘
Phase説明
waiting初期化中。チャンク分割が完了し、最初のバッファリングに入る直前
bufferingバッファ不足で再生を一時停止中。チャンク変換の完了を待っている
playing再生中。チャンクプレーヤーが音声を出力している
pausedユーザー操作による一時停止
ended最終チャンクの再生が完了

通常の音楽プレーヤーと異なり、Stretcher にはリアルタイム変換に起因する buffering 状態があります。動画ストリーミングサービスのバッファリングと同じ考え方で、変換が再生に追いつかないとき(underrun)に自動的に一時停止し、十分なバッファが溜まったら再開します。

Buffer Health

Buffer Health は、再生位置から先にどれだけ変換済みチャンクがあるかを段階的に表します。

再生位置の前方に連続する変換済みチャンクを数え、その合計時間から健全性を 4 段階(healthy / low / critical / empty)で判定します。

チャンク: [ready] [ready] [ready] [converting] [ready] [pending]
ここで停止

最初の未完了チャンクで計算が停止する点がポイントです。後方に飛び地で完了しているチャンクがあっても、再生には連続性が必要なため、健全性には含めません。

この段階的な指標を UI に公開することで、ユーザーに対して適切なフィードバック(バッファ状態の表示や警告)を提供できます。

ヒステリシスによるフリッカー防止

バッファリングの開始と終了に同じ閾値を使うと、バッファが閾値付近で揺れたときに状態が高速で切り替わります(フリッカー問題)。

Buffer seconds
30 ─── healthy ───────────────────
10 ─── low ───────────────────────
5 ─── ← exit buffering ───────── ↑ ヒステリシス幅
3 ─── ← enter buffering ──────── ↓
0 ─── empty ────────────────────

開始閾値と終了閾値をずらすヒステリシスを設けることで、バッファがこの範囲内で揺れても状態が安定します。一度バッファリングに入ったら、開始閾値より高い終了閾値を超えるまで抜けません。

これはサーモスタットの温度制御と同じ原理です。「暑くなったら冷房を入れ、十分涼しくなったら止める」というように、開始と終了に余裕を持たせて頻繁な ON/OFF を防ぎます。

Buffering Reason

バッファリングに入った理由は buffering イベントで通知されます。

Reason説明
initial初回再生開始前のバッファリング
seekSeek 先のチャンクが未変換
tempo-changeテンポ変更で既存チャンクが無効化
underrun再生が変換に追いついてしまった

UI では reason に応じてメッセージを出し分けることができます。例えば initial では「読み込み中…」、underrun では「バッファリング中…」など、ユーザーにとって意味のあるフィードバックを提供できます。

イベント

Stretcher は再生状態やバッファ状況の変化をイベントとして発行します。

イベント説明
bufferingバッファリング開始(reason 付き)
bufferedバッファリング終了(待機時間付き)
chunkreadyチャンク変換完了
progress変換進捗更新
bufferhealthバッファ健全性更新
complete全チャンク変換完了
ended再生完全終了
error変換エラー