View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0010101 | ardour | bugs | public | 2026-01-03 21:47 | 2026-01-03 21:47 |
| Reporter | patrigirane | Assigned To | |||
| Priority | normal | Severity | major | Reproducibility | always |
| Status | new | Resolution | open | ||
| Platform | Ubuntu | OS | Linux | OS Version | (any) |
| Product Version | 9.0-rc | ||||
| Summary | 0010101: Ardour crash during audio region deletion | ||||
| Description | Ardour crashes with an assertion failure in Playlist::relayer() when deleting a split audio region. The crash occurs due to floating-point precision errors when calculating division boundaries for region layering. When a region's position falls exactly at the playlist's end boundary, start_division can equal divisions, triggering the assertion start_division >= 0 && end_division >= start_division. | ||||
| Steps To Reproduce | 1. Create an audio track with a region 2. Split the region 3. Delete one of the split regions 4. Crash occurs during playlist relayering | ||||
| Additional Information | Backtrace: #0 __pthread_kill_implementation 0000001 raise #2 abort #3 Playlist::relayer() at playlist.cc:2667 assertion failed: (divisions == 0 || (start_division >= 0 && end_division >= start_division)) I tried fixing it by clamping both `start_division` and `end_division` using std::min() to ensure they never exceed `divisions - 1`: From dcf206e0b3 diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index 5de65a1af2..45dfc7ef00 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -2660,11 +2660,8 @@ Playlist::relayer () int end_division = 0; if (division_size > 0) { - start_division = start.distance (r->position ()).samples () / division_size; - end_division = start.distance (r->position () + r->length ()).samples () / division_size; - if (end_division == divisions) { - end_division--; - } + start_division = std::min ((int) (start.distance (r->position ()).samples () / division_size), divisions - 1); + end_division = std::min ((int) (start.distance (r->position () + r->length ()).samples () / division_size), divisions - 1); } assert (divisions == 0 || end_division < divisions); | ||||
| Tags | No tags attached. | ||||
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2026-01-03 21:47 | patrigirane | New Issue |