Browse Source

fix error when creating a region in the 3rd automation track

Fixes https://todo.sr.ht/~alextee/zrythm-bug/872.
audio_region_bpm_change_fix
Alexandros Theodotou 11 months ago
parent
commit
e38c7c1128
Signed by: alex
GPG Key ID: 022EAE42313D70F3
  1. 4
      src/audio/region.c
  2. 54
      src/gui/backend/arranger_object.c
  3. 72
      tests/audio/automation_track.c

4
src/audio/region.c

@ -560,6 +560,10 @@ TrackLane * @@ -560,6 +560,10 @@ TrackLane *
region_get_lane (const ZRegion * self)
{
g_return_val_if_fail (IS_REGION (self), NULL);
g_return_val_if_fail (
self->id.type == REGION_TYPE_MIDI
|| self->id.type == REGION_TYPE_AUDIO,
NULL);
Track * track = arranger_object_get_track (
(ArrangerObject *) self);

54
src/gui/backend/arranger_object.c

@ -259,20 +259,46 @@ arranger_object_get_muted ( @@ -259,20 +259,46 @@ arranger_object_get_muted (
check_parent
&& self->type == ARRANGER_OBJECT_TYPE_REGION)
{
ZRegion * region = (ZRegion *) self;
TrackLane * lane = region_get_lane (region);
g_return_val_if_fail (lane, true);
if (track_lane_get_muted (lane))
return true;
/* if lane is non-soloed while other soloed
* lanes exist, this should be muted */
Track * track = track_lane_get_track (lane);
g_return_val_if_fail (track, true);
if (
track_has_soloed_lanes (track)
&& !track_lane_get_soloed (lane))
return true;
ZRegion * region = (ZRegion *) self;
switch (region->id.type)
{
case REGION_TYPE_MIDI:
case REGION_TYPE_AUDIO:
{
TrackLane * lane =
region_get_lane (region);
g_return_val_if_fail (lane, true);
if (track_lane_get_muted (lane))
return true;
/* if lane is non-soloed while other
* soloed lanes exist, this should be
* muted */
Track * track =
track_lane_get_track (lane);
g_return_val_if_fail (track, true);
if (
track_has_soloed_lanes (track)
&& !track_lane_get_soloed (lane))
return true;
}
break;
case REGION_TYPE_AUTOMATION:
{
AutomationTrack * at =
region_get_automation_track (region);
g_return_val_if_fail (at, true);
if (
at->automation_mode
== AUTOMATION_MODE_OFF)
return true;
}
break;
default:
break;
}
}
return self->muted;

72
tests/audio/automation_track.c

@ -67,6 +67,73 @@ test_set_at_index (void) @@ -67,6 +67,73 @@ test_set_at_index (void)
test_helper_zrythm_cleanup ();
}
/**
* There was a case where
* arranger_object__get_muted() assumed
* that the region was an audio/MIDI region and
* threw errors.
*
* This replicates the issue and tests that this
* does not happen.
*/
static void
test_region_in_2nd_automation_track_get_muted (void)
{
test_helper_zrythm_init ();
Track * master = P_MASTER_TRACK;
track_set_automation_visible (master, true);
AutomationTracklist * atl =
track_get_automation_tracklist (master);
AutomationTrack ** visible_ats =
calloc (100000, sizeof (AutomationTrack *));
int num_visible = 0;
automation_tracklist_get_visible_tracks (
atl, visible_ats, &num_visible);
AutomationTrack * first_vis_at = visible_ats[0];
/* create a new automation track */
AutomationTrack * new_at =
automation_tracklist_get_first_invisible_at (
atl);
if (!new_at->created)
new_at->created = 1;
new_at->visible = true;
/* move it after the clicked
* automation track */
automation_tracklist_set_at_index (
atl, new_at, first_vis_at->index + 1, true);
/* create a region and set it as clip editor
* region */
Position start, end;
position_set_to_bar (&start, 2);
position_set_to_bar (&end, 4);
ZRegion * region = automation_region_new (
&start, &end, track_get_name_hash (master),
new_at->index, 0);
track_add_region (
master, region, new_at, -1, F_GEN_NAME,
F_NO_PUBLISH_EVENTS);
arranger_object_select (
(ArrangerObject *) region, F_SELECT,
F_NO_APPEND, F_NO_PUBLISH_EVENTS);
arranger_selections_action_perform_create (
(ArrangerSelections *) TL_SELECTIONS, NULL);
clip_editor_set_region (
CLIP_EDITOR, region, F_NO_PUBLISH_EVENTS);
engine_wait_n_cycles (AUDIO_ENGINE, 3);
/* assert not muted */
g_assert_false (arranger_object_get_muted (
(ArrangerObject *) region, true));
test_helper_zrythm_cleanup ();
}
int
main (int argc, char * argv[])
{
@ -77,6 +144,11 @@ main (int argc, char * argv[]) @@ -77,6 +144,11 @@ main (int argc, char * argv[])
g_test_add_func (
TEST_PREFIX "test set at index",
(GTestFunc) test_set_at_index);
g_test_add_func (
TEST_PREFIX
"test region in 2nd automation track get muted",
(GTestFunc)
test_region_in_2nd_automation_track_get_muted);
return g_test_run ();
}

Loading…
Cancel
Save