Skip to content

Commit 6c845a2

Browse files
Fix mixer reordering and loop handling. Fixes #580 (#581)
* Fix mixer reordering and loop handling. Add more tests for mixer reordering and loops * use memcpy (thanks @howard0su)
1 parent 9d94dc5 commit 6c845a2

2 files changed

Lines changed: 68 additions & 9 deletions

File tree

src/mixer.c

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,7 @@ void fix_mixer_dependencies(unsigned mixer_count)
613613
mixers[i].src = 0;
614614
}
615615
memset(placed, 0, sizeof(placed));
616-
while(mixer_count || last_count != mixer_count) {
616+
while(mixer_count && last_count != mixer_count) {
617617
last_count = mixer_count;
618618
for (i = 0; i < NUM_SOURCES; i++) {
619619
if (placed[i])
@@ -626,7 +626,7 @@ void fix_mixer_dependencies(unsigned mixer_count)
626626
unsigned j;
627627
// determine if all dependencies have been placed
628628
for (j = 0; j < NUM_SOURCES; j++) {
629-
if (dependencies[i] && ! placed[i]) {
629+
if (dependencies[j] && ! placed[j]) {
630630
ok = 0;
631631
break;
632632
}
@@ -639,13 +639,17 @@ void fix_mixer_dependencies(unsigned mixer_count)
639639
}
640640
}
641641
}
642-
//mixer_count s gauranteed to be 0 when we get here
643-
//if (mixer_count) {
644-
// printf("Could not place all mixers!\n");
645-
// return;
646-
//}
647-
for (i = 0; i < NUM_MIXERS; i++)
648-
Model.mixers[i] = mixers[i];
642+
if (mixer_count) {
643+
// We found a mixer loop....add missing mixers to the end of the order
644+
printf("Mix loop detected. The following mixers may have a circular dependency!\n");
645+
for (unsigned source = 0; source < NUM_SOURCES; source++) {
646+
if (placed[source])
647+
continue;
648+
printf(" Mixer source: %d\n", source);
649+
pos += MIXER_GetMixers(source, &mixers[pos], NUM_MIXERS);
650+
}
651+
}
652+
memcpy(Model.mixers, mixers, sizeof(mixers));
649653
}
650654

651655
int MIXER_SetMixers(struct Mixer *mixers, int count)

src/tests/test_mixer.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,61 @@ void TestSetMixers(CuTest *t)
686686
}
687687
}
688688

689+
#define TO_SOURCE(x) ((x) < 0 ? (NUM_SOURCES + 1 - (x)) : (x))
690+
#define FROM_SOURCE(x) ((x) > NUM_SOURCES ? -((x)-NUM_SOURCES-1) : (x))
691+
void TestSetMixerDepends(CuTest *t)
692+
{
693+
int sources[] = {-6, 1, -2, 1, -1, 1};
694+
int switches[] = { 0, 0, 0, -5, 0, 0};
695+
int dests[] = { 4, 1, 6, 6, 2, 5};
696+
memset(&Model, 0, sizeof(Model));
697+
for (unsigned i = 0; i < sizeof(Model.templates)/sizeof(Model.templates[0]); i++) {
698+
Model.templates[i] = MIXERTEMPLATE_SIMPLE;
699+
}
700+
for (unsigned i = 0; i < sizeof(sources)/sizeof(sources[0]); i++) {
701+
Model.mixers[i].src = TO_SOURCE(sources[i]);
702+
Model.mixers[i].sw = TO_SOURCE(switches[i]);
703+
Model.mixers[i].dest = dests[i];
704+
Model.mixers[i].scalar = i;
705+
Model.mixers[i].curve.type = CURVE_FIXED;
706+
}
707+
MIXER_SetMixers(NULL, 0);
708+
int expected[] = {1, 4, 5, 2, 3, 0};
709+
for (unsigned i = 0; i < sizeof(sources)/sizeof(sources[0]); i++) {
710+
//printf("%d: orig:%d src:%d sw:%d dest:%d\n",
711+
// i, Model.mixers[i].scalar, FROM_SOURCE(Model.mixers[i].src),
712+
// FROM_SOURCE(Model.mixers[i].sw), Model.mixers[i].dest);
713+
CuAssertIntEquals(t, expected[i], Model.mixers[i].scalar);
714+
}
715+
}
716+
717+
void TestSetMixerLoop(CuTest *t)
718+
{
719+
//negaitve values mean to use a dest as source
720+
int sources[] = {-6, 1, -2, 1, -1, 1};
721+
int switches[] = { 0, 0, 0, -5, 0, 0};
722+
int dests[] = { 1, 4, 6, 6, 2, 5};
723+
memset(&Model, 0, sizeof(Model));
724+
for (unsigned i = 0; i < sizeof(Model.templates)/sizeof(Model.templates[0]); i++) {
725+
Model.templates[i] = MIXERTEMPLATE_SIMPLE;
726+
}
727+
for (unsigned i = 0; i < sizeof(sources)/sizeof(sources[0]); i++) {
728+
Model.mixers[i].src = TO_SOURCE(sources[i]);
729+
Model.mixers[i].sw = TO_SOURCE(switches[i]);
730+
Model.mixers[i].dest = dests[i];
731+
Model.mixers[i].scalar = i;
732+
Model.mixers[i].curve.type = CURVE_FIXED;
733+
}
734+
MIXER_SetMixers(NULL, 0);
735+
int expected[] = {1, 5, 0, 4, 2, 3};
736+
for (unsigned i = 0; i < sizeof(sources)/sizeof(sources[0]); i++) {
737+
//printf("%d: orig:%d src:%d sw:%d dest:%d\n",
738+
// i, Model.mixers[i].scalar, FROM_SOURCE(Model.mixers[i].src),
739+
// FROM_SOURCE(Model.mixers[i].sw), Model.mixers[i].dest);
740+
CuAssertIntEquals(t, expected[i], Model.mixers[i].scalar);
741+
}
742+
}
743+
689744
void TestGetLimit(CuTest *t)
690745
{
691746
struct Limit limit = {0};

0 commit comments

Comments
 (0)