PlayHead: divide by zero on the audio thread when looping is turned on during playback

オープン 初心者向け
#482 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
76/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
cpp

調査の方向性

Issueで挙げられている PlayHead::setLoopRange と PlayHead::linearPositionToLoopPosition から始め、再生中に PlayHeadState::update がループ範囲をどのように読み取るかを追ってください。既存のPlayHeadテストを確認し、空の範囲でループを有効化および無効化するケースのテストを追加して、関連するテストを実行してください。完了条件は、オーディオスレッドが長さゼロの範囲を modulo に渡せないことです。

索引モデルが issue の本文から書いたものです。

説明

graph::PlayHead can divide by zero on the audio thread when looping is switched on during playback.

Stack: juce::negativeAwareModulo ← PlayHead::linearPositionToLoopPosition ← PlayHead::referenceSamplePositionToTimelinePosition ← PlayHeadState::update.

Cause: PlayHead::setLoopRange sets looping = loop before timelinePlayRange.store (loopRange). Turning the loop off stores an empty range (TransportControl: setLoopTimes (false, {})), so when it's turned back on the audio thread can briefly see looping == true with that zero-length range, and negativeAwareModulo divides by its length. The reverse can happen too: a reader holding looping == true from just before it's turned off, then reading the empty range.

Fix we're carrying (seen rarely, as a crash under load on Windows):

 inline void PlayHead::setLoopRange (bool loop, juce::Range<int64_t> loopRange, bool updatePosition)
 ...
-        looping = loop;
-        timelinePlayRange.store (loopRange);
+        if (loop)
+        {
+            timelinePlayRange.store (loopRange);
+            looping = true;
+        }
+        else
+        {
+            looping = false;
+            timelinePlayRange.store (loopRange);
+        }

 inline int64_t PlayHead::linearPositionToLoopPosition (int64_t position, juce::Range<int64_t> loopRange)
 {
+    if (loopRange.getLength() <= 0)
+        return position;
+
     const auto loopStart = loopRange.getStart();

The guard alone is enough to stop the crash, since the two atomics can't be read together; the ordering just makes it rarer. Seen on 38d5a27.

主要言語
C++
スター
1.5k
フォーク
222
平均マージ
8時間 7分
マージ済み PR(30日)
17

環境構築

このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

Tracktion/tracktion_engine のほかの issue

Tracktion/tracktion_engine の issue をすべて見る

似ている issue

C++ の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。