mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-02 09:01:46 -05:00
tests: Run svolume on different channel counts
This adds checks to run svolume tests with 1, 2 and 3 channels (we don't run Orc with 3 channels since only 1/2-ch are implemented there).
This commit is contained in:
parent
58b61a9d16
commit
f10e663d04
1 changed files with 43 additions and 46 deletions
|
|
@ -64,18 +64,17 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Common defines for svolume tests */
|
/* Common defines for svolume tests */
|
||||||
#define CHANNELS 2
|
|
||||||
#define SAMPLES 1028
|
#define SAMPLES 1028
|
||||||
#define TIMES 1000
|
#define TIMES 1000
|
||||||
#define TIMES2 100
|
#define TIMES2 100
|
||||||
#define PADDING 16
|
#define PADDING 16
|
||||||
|
|
||||||
static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func, int align, pa_bool_t correct,
|
static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func, int align, int channels,
|
||||||
pa_bool_t perf) {
|
pa_bool_t correct, pa_bool_t perf) {
|
||||||
PA_DECLARE_ALIGNED(8, int16_t, s[SAMPLES]) = { 0 };
|
PA_DECLARE_ALIGNED(8, int16_t, s[SAMPLES]) = { 0 };
|
||||||
PA_DECLARE_ALIGNED(8, int16_t, s_ref[SAMPLES]) = { 0 };
|
PA_DECLARE_ALIGNED(8, int16_t, s_ref[SAMPLES]) = { 0 };
|
||||||
PA_DECLARE_ALIGNED(8, int16_t, s_orig[SAMPLES]) = { 0 };
|
PA_DECLARE_ALIGNED(8, int16_t, s_orig[SAMPLES]) = { 0 };
|
||||||
int32_t volumes[CHANNELS + PADDING];
|
int32_t volumes[channels + PADDING];
|
||||||
int16_t *samples, *samples_ref, *samples_orig;
|
int16_t *samples, *samples_ref, *samples_orig;
|
||||||
int i, padding, nsamples, size;
|
int i, padding, nsamples, size;
|
||||||
|
|
||||||
|
|
@ -84,43 +83,43 @@ static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_f
|
||||||
samples_ref = s_ref + (8 - align);
|
samples_ref = s_ref + (8 - align);
|
||||||
samples_orig = s_orig + (8 - align);
|
samples_orig = s_orig + (8 - align);
|
||||||
nsamples = SAMPLES - (8 - align);
|
nsamples = SAMPLES - (8 - align);
|
||||||
nsamples += nsamples % CHANNELS;
|
nsamples += nsamples % channels;
|
||||||
size = nsamples * sizeof(*samples);
|
size = nsamples * sizeof(*samples);
|
||||||
|
|
||||||
pa_random(samples, size);
|
pa_random(samples, size);
|
||||||
memcpy(samples_ref, samples, size);
|
memcpy(samples_ref, samples, size);
|
||||||
memcpy(samples_orig, samples, size);
|
memcpy(samples_orig, samples, size);
|
||||||
|
|
||||||
for (i = 0; i < CHANNELS; i++)
|
for (i = 0; i < channels; i++)
|
||||||
volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15));
|
volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15));
|
||||||
for (padding = 0; padding < PADDING; padding++, i++)
|
for (padding = 0; padding < PADDING; padding++, i++)
|
||||||
volumes[i] = volumes[padding];
|
volumes[i] = volumes[padding];
|
||||||
|
|
||||||
if (correct) {
|
if (correct) {
|
||||||
orig_func(samples_ref, volumes, CHANNELS, size);
|
orig_func(samples_ref, volumes, channels, size);
|
||||||
func(samples, volumes, CHANNELS, size);
|
func(samples, volumes, channels, size);
|
||||||
|
|
||||||
for (i = 0; i < nsamples; i++) {
|
for (i = 0; i < nsamples; i++) {
|
||||||
if (samples[i] != samples_ref[i]) {
|
if (samples[i] != samples_ref[i]) {
|
||||||
pa_log_debug("Correctness test failed: align=%d", align);
|
pa_log_debug("Correctness test failed: align=%d, channels=%d", align, channels);
|
||||||
pa_log_debug("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
|
pa_log_debug("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
|
||||||
samples_orig[i], volumes[i % CHANNELS]);
|
samples_orig[i], volumes[i % channels]);
|
||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (perf) {
|
if (perf) {
|
||||||
pa_log_debug("Testing svolume performance with %d byte alignment", align);
|
pa_log_debug("Testing svolume %dch performance with %d byte alignment", channels, align);
|
||||||
|
|
||||||
PA_CPU_TEST_RUN_START("func", TIMES, TIMES2) {
|
PA_CPU_TEST_RUN_START("func", TIMES, TIMES2) {
|
||||||
memcpy(samples, samples_orig, size);
|
memcpy(samples, samples_orig, size);
|
||||||
func(samples, volumes, CHANNELS, size);
|
func(samples, volumes, channels, size);
|
||||||
} PA_CPU_TEST_RUN_STOP
|
} PA_CPU_TEST_RUN_STOP
|
||||||
|
|
||||||
PA_CPU_TEST_RUN_START("orig", TIMES, TIMES2) {
|
PA_CPU_TEST_RUN_START("orig", TIMES, TIMES2) {
|
||||||
memcpy(samples_ref, samples_orig, size);
|
memcpy(samples_ref, samples_orig, size);
|
||||||
orig_func(samples_ref, volumes, CHANNELS, size);
|
orig_func(samples_ref, volumes, channels, size);
|
||||||
} PA_CPU_TEST_RUN_STOP
|
} PA_CPU_TEST_RUN_STOP
|
||||||
|
|
||||||
fail_unless(memcmp(samples_ref, samples, size) == 0);
|
fail_unless(memcmp(samples_ref, samples, size) == 0);
|
||||||
|
|
@ -131,6 +130,7 @@ static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_f
|
||||||
START_TEST (svolume_mmx_test) {
|
START_TEST (svolume_mmx_test) {
|
||||||
pa_do_volume_func_t orig_func, mmx_func;
|
pa_do_volume_func_t orig_func, mmx_func;
|
||||||
pa_cpu_x86_flag_t flags = 0;
|
pa_cpu_x86_flag_t flags = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
pa_cpu_get_x86_flags(&flags);
|
pa_cpu_get_x86_flags(&flags);
|
||||||
|
|
||||||
|
|
@ -144,20 +144,20 @@ START_TEST (svolume_mmx_test) {
|
||||||
mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||||
|
|
||||||
pa_log_debug("Checking MMX svolume");
|
pa_log_debug("Checking MMX svolume");
|
||||||
run_volume_test(mmx_func, orig_func, 0, TRUE, FALSE);
|
for (i = 1; i <= 3; i++) {
|
||||||
run_volume_test(mmx_func, orig_func, 1, TRUE, FALSE);
|
for (j = 0; j < 7; j++)
|
||||||
run_volume_test(mmx_func, orig_func, 2, TRUE, FALSE);
|
run_volume_test(mmx_func, orig_func, j, i, TRUE, FALSE);
|
||||||
run_volume_test(mmx_func, orig_func, 3, TRUE, FALSE);
|
}
|
||||||
run_volume_test(mmx_func, orig_func, 4, TRUE, FALSE);
|
run_volume_test(mmx_func, orig_func, 7, 1, TRUE, TRUE);
|
||||||
run_volume_test(mmx_func, orig_func, 5, TRUE, FALSE);
|
run_volume_test(mmx_func, orig_func, 7, 2, TRUE, TRUE);
|
||||||
run_volume_test(mmx_func, orig_func, 6, TRUE, FALSE);
|
run_volume_test(mmx_func, orig_func, 7, 3, TRUE, TRUE);
|
||||||
run_volume_test(mmx_func, orig_func, 7, TRUE, TRUE);
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
START_TEST (svolume_sse_test) {
|
START_TEST (svolume_sse_test) {
|
||||||
pa_do_volume_func_t orig_func, sse_func;
|
pa_do_volume_func_t orig_func, sse_func;
|
||||||
pa_cpu_x86_flag_t flags = 0;
|
pa_cpu_x86_flag_t flags = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
pa_cpu_get_x86_flags(&flags);
|
pa_cpu_get_x86_flags(&flags);
|
||||||
|
|
||||||
|
|
@ -171,14 +171,13 @@ START_TEST (svolume_sse_test) {
|
||||||
sse_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
sse_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||||
|
|
||||||
pa_log_debug("Checking SSE2 svolume");
|
pa_log_debug("Checking SSE2 svolume");
|
||||||
run_volume_test(sse_func, orig_func, 0, TRUE, FALSE);
|
for (i = 1; i <= 3; i++) {
|
||||||
run_volume_test(sse_func, orig_func, 1, TRUE, FALSE);
|
for (j = 0; j < 7; j++)
|
||||||
run_volume_test(sse_func, orig_func, 2, TRUE, FALSE);
|
run_volume_test(sse_func, orig_func, j, i, TRUE, FALSE);
|
||||||
run_volume_test(sse_func, orig_func, 3, TRUE, FALSE);
|
}
|
||||||
run_volume_test(sse_func, orig_func, 4, TRUE, FALSE);
|
run_volume_test(sse_func, orig_func, 7, 1, TRUE, TRUE);
|
||||||
run_volume_test(sse_func, orig_func, 5, TRUE, FALSE);
|
run_volume_test(sse_func, orig_func, 7, 2, TRUE, TRUE);
|
||||||
run_volume_test(sse_func, orig_func, 6, TRUE, FALSE);
|
run_volume_test(sse_func, orig_func, 7, 3, TRUE, TRUE);
|
||||||
run_volume_test(sse_func, orig_func, 7, TRUE, TRUE);
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
#endif /* defined (__i386__) || defined (__amd64__) */
|
#endif /* defined (__i386__) || defined (__amd64__) */
|
||||||
|
|
@ -187,6 +186,7 @@ END_TEST
|
||||||
START_TEST (svolume_arm_test) {
|
START_TEST (svolume_arm_test) {
|
||||||
pa_do_volume_func_t orig_func, arm_func;
|
pa_do_volume_func_t orig_func, arm_func;
|
||||||
pa_cpu_arm_flag_t flags = 0;
|
pa_cpu_arm_flag_t flags = 0;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
pa_cpu_get_arm_flags(&flags);
|
pa_cpu_get_arm_flags(&flags);
|
||||||
|
|
||||||
|
|
@ -200,14 +200,13 @@ START_TEST (svolume_arm_test) {
|
||||||
arm_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
arm_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||||
|
|
||||||
pa_log_debug("Checking ARM svolume");
|
pa_log_debug("Checking ARM svolume");
|
||||||
run_volume_test(arm_func, orig_func, 0, TRUE, TRUE);
|
for (i = 1; i <= 3; i++) {
|
||||||
run_volume_test(arm_func, orig_func, 1, TRUE, TRUE);
|
for (j = 0; j < 7; j++)
|
||||||
run_volume_test(arm_func, orig_func, 2, TRUE, TRUE);
|
run_volume_test(arm_func, orig_func, j, i, TRUE, FALSE);
|
||||||
run_volume_test(arm_func, orig_func, 3, TRUE, TRUE);
|
}
|
||||||
run_volume_test(arm_func, orig_func, 4, TRUE, TRUE);
|
run_volume_test(arm_func, orig_func, 7, 1, TRUE, TRUE);
|
||||||
run_volume_test(arm_func, orig_func, 5, TRUE, TRUE);
|
run_volume_test(arm_func, orig_func, 7, 2, TRUE, TRUE);
|
||||||
run_volume_test(arm_func, orig_func, 6, TRUE, TRUE);
|
run_volume_test(arm_func, orig_func, 7, 3, TRUE, TRUE);
|
||||||
run_volume_test(arm_func, orig_func, 7, TRUE, TRUE);
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
#endif /* defined (__arm__) && defined (__linux__) */
|
#endif /* defined (__arm__) && defined (__linux__) */
|
||||||
|
|
@ -215,6 +214,7 @@ END_TEST
|
||||||
START_TEST (svolume_orc_test) {
|
START_TEST (svolume_orc_test) {
|
||||||
pa_do_volume_func_t orig_func, orc_func;
|
pa_do_volume_func_t orig_func, orc_func;
|
||||||
pa_cpu_info cpu_info;
|
pa_cpu_info cpu_info;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
#if defined (__i386__) || defined (__amd64__)
|
#if defined (__i386__) || defined (__amd64__)
|
||||||
pa_zero(cpu_info);
|
pa_zero(cpu_info);
|
||||||
|
|
@ -232,18 +232,15 @@ START_TEST (svolume_orc_test) {
|
||||||
orc_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
orc_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||||
|
|
||||||
pa_log_debug("Checking Orc svolume");
|
pa_log_debug("Checking Orc svolume");
|
||||||
run_volume_test(orc_func, orig_func, 0, TRUE, FALSE);
|
for (i = 1; i <= 2; i++) {
|
||||||
run_volume_test(orc_func, orig_func, 1, TRUE, FALSE);
|
for (j = 0; j < 7; j++)
|
||||||
run_volume_test(orc_func, orig_func, 2, TRUE, FALSE);
|
run_volume_test(orc_func, orig_func, j, i, TRUE, FALSE);
|
||||||
run_volume_test(orc_func, orig_func, 3, TRUE, FALSE);
|
}
|
||||||
run_volume_test(orc_func, orig_func, 4, TRUE, FALSE);
|
run_volume_test(orc_func, orig_func, 7, 1, TRUE, TRUE);
|
||||||
run_volume_test(orc_func, orig_func, 5, TRUE, FALSE);
|
run_volume_test(orc_func, orig_func, 7, 2, TRUE, TRUE);
|
||||||
run_volume_test(orc_func, orig_func, 6, TRUE, FALSE);
|
|
||||||
run_volume_test(orc_func, orig_func, 7, TRUE, TRUE);
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
#undef CHANNELS
|
|
||||||
#undef SAMPLES
|
#undef SAMPLES
|
||||||
#undef TIMES
|
#undef TIMES
|
||||||
#undef TIMES2
|
#undef TIMES2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue