mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-02 09:01:46 -05:00
tests: Run svolume test for various sample alignments
Allows us to make sure that svolume works independently of sample alignment, and that performance doesn't degrade based on this.
This commit is contained in:
parent
6fe3bfe6df
commit
a172db5c0d
1 changed files with 77 additions and 29 deletions
|
|
@ -65,48 +65,67 @@
|
|||
|
||||
/* Common defines for svolume tests */
|
||||
#define CHANNELS 2
|
||||
#define SAMPLES 1022
|
||||
#define SAMPLES 1028
|
||||
#define TIMES 1000
|
||||
#define TIMES2 100
|
||||
#define PADDING 16
|
||||
|
||||
static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func) {
|
||||
int16_t samples[SAMPLES];
|
||||
int16_t samples_ref[SAMPLES];
|
||||
int16_t samples_orig[SAMPLES];
|
||||
static void run_volume_test(pa_do_volume_func_t func, pa_do_volume_func_t orig_func, int align, pa_bool_t correct,
|
||||
pa_bool_t perf) {
|
||||
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_orig[SAMPLES]) = { 0 };
|
||||
int32_t volumes[CHANNELS + PADDING];
|
||||
int i, padding;
|
||||
int16_t *samples, *samples_ref, *samples_orig;
|
||||
int i, padding, nsamples, size;
|
||||
|
||||
pa_random(samples, sizeof(samples));
|
||||
memcpy(samples_ref, samples, sizeof(samples));
|
||||
memcpy(samples_orig, samples, sizeof(samples));
|
||||
/* Force sample alignment as requested */
|
||||
samples = s + (8 - align);
|
||||
samples_ref = s_ref + (8 - align);
|
||||
samples_orig = s_orig + (8 - align);
|
||||
nsamples = SAMPLES - (8 - align);
|
||||
nsamples += nsamples % CHANNELS;
|
||||
size = nsamples * sizeof(*samples);
|
||||
|
||||
pa_random(samples, size);
|
||||
memcpy(samples_ref, samples, size);
|
||||
memcpy(samples_orig, samples, size);
|
||||
|
||||
for (i = 0; i < CHANNELS; i++)
|
||||
volumes[i] = PA_CLAMP_VOLUME((pa_volume_t)(rand() >> 15));
|
||||
for (padding = 0; padding < PADDING; padding++, i++)
|
||||
volumes[i] = volumes[padding];
|
||||
|
||||
orig_func(samples_ref, volumes, CHANNELS, sizeof(samples));
|
||||
func(samples, volumes, CHANNELS, sizeof(samples));
|
||||
for (i = 0; i < SAMPLES; i++) {
|
||||
if (samples[i] != samples_ref[i]) {
|
||||
printf("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
|
||||
samples_orig[i], volumes[i % CHANNELS]);
|
||||
fail();
|
||||
if (correct) {
|
||||
pa_log_debug("Testing svolume correctness with %d byte alignment", align);
|
||||
|
||||
orig_func(samples_ref, volumes, CHANNELS, size);
|
||||
func(samples, volumes, CHANNELS, size);
|
||||
|
||||
for (i = 0; i < nsamples; i++) {
|
||||
if (samples[i] != samples_ref[i]) {
|
||||
printf("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
|
||||
samples_orig[i], volumes[i % CHANNELS]);
|
||||
fail();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PA_CPU_TEST_RUN_START("func", TIMES, TIMES2) {
|
||||
memcpy(samples, samples_orig, sizeof(samples));
|
||||
func(samples, volumes, CHANNELS, sizeof(samples));
|
||||
} PA_CPU_TEST_RUN_STOP
|
||||
if (perf) {
|
||||
pa_log_debug("Testing svolume performance with %d byte alignment", align);
|
||||
|
||||
PA_CPU_TEST_RUN_START("orig", TIMES, TIMES2) {
|
||||
memcpy(samples_ref, samples_orig, sizeof(samples));
|
||||
orig_func(samples_ref, volumes, CHANNELS, sizeof(samples));
|
||||
} PA_CPU_TEST_RUN_STOP
|
||||
PA_CPU_TEST_RUN_START("func", TIMES, TIMES2) {
|
||||
memcpy(samples, samples_orig, size);
|
||||
func(samples, volumes, CHANNELS, size);
|
||||
} PA_CPU_TEST_RUN_STOP
|
||||
|
||||
fail_unless(memcmp(samples_ref, samples, sizeof(samples)) == 0);
|
||||
PA_CPU_TEST_RUN_START("orig", TIMES, TIMES2) {
|
||||
memcpy(samples_ref, samples_orig, size);
|
||||
orig_func(samples_ref, volumes, CHANNELS, size);
|
||||
} PA_CPU_TEST_RUN_STOP
|
||||
|
||||
fail_unless(memcmp(samples_ref, samples, size) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined (__i386__) || defined (__amd64__)
|
||||
|
|
@ -126,7 +145,14 @@ START_TEST (svolume_mmx_test) {
|
|||
mmx_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||
|
||||
pa_log_debug("Checking MMX svolume");
|
||||
run_volume_test(mmx_func, orig_func);
|
||||
run_volume_test(mmx_func, orig_func, 0, TRUE, FALSE);
|
||||
run_volume_test(mmx_func, orig_func, 1, TRUE, FALSE);
|
||||
run_volume_test(mmx_func, orig_func, 2, 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, 5, TRUE, FALSE);
|
||||
run_volume_test(mmx_func, orig_func, 6, TRUE, FALSE);
|
||||
run_volume_test(mmx_func, orig_func, 7, TRUE, TRUE);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
|
@ -146,7 +172,14 @@ START_TEST (svolume_sse_test) {
|
|||
sse_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||
|
||||
pa_log_debug("Checking SSE2 svolume");
|
||||
run_volume_test(sse_func, orig_func);
|
||||
run_volume_test(sse_func, orig_func, 0, TRUE, FALSE);
|
||||
run_volume_test(sse_func, orig_func, 1, TRUE, FALSE);
|
||||
run_volume_test(sse_func, orig_func, 2, 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, 5, TRUE, FALSE);
|
||||
run_volume_test(sse_func, orig_func, 6, TRUE, FALSE);
|
||||
run_volume_test(sse_func, orig_func, 7, TRUE, TRUE);
|
||||
}
|
||||
END_TEST
|
||||
#endif /* defined (__i386__) || defined (__amd64__) */
|
||||
|
|
@ -168,7 +201,14 @@ START_TEST (svolume_arm_test) {
|
|||
arm_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||
|
||||
pa_log_debug("Checking ARM svolume");
|
||||
run_volume_test(arm_func, orig_func);
|
||||
run_volume_test(arm_func, orig_func, 0, TRUE, TRUE);
|
||||
run_volume_test(arm_func, orig_func, 1, TRUE, TRUE);
|
||||
run_volume_test(arm_func, orig_func, 2, TRUE, TRUE);
|
||||
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, 5, TRUE, TRUE);
|
||||
run_volume_test(arm_func, orig_func, 6, TRUE, TRUE);
|
||||
run_volume_test(arm_func, orig_func, 7, TRUE, TRUE);
|
||||
}
|
||||
END_TEST
|
||||
#endif /* defined (__arm__) && defined (__linux__) */
|
||||
|
|
@ -193,7 +233,14 @@ START_TEST (svolume_orc_test) {
|
|||
orc_func = pa_get_volume_func(PA_SAMPLE_S16NE);
|
||||
|
||||
pa_log_debug("Checking Orc svolume");
|
||||
run_volume_test(orc_func, orig_func);
|
||||
run_volume_test(orc_func, orig_func, 0, TRUE, FALSE);
|
||||
run_volume_test(orc_func, orig_func, 1, TRUE, FALSE);
|
||||
run_volume_test(orc_func, orig_func, 2, 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, 5, TRUE, FALSE);
|
||||
run_volume_test(orc_func, orig_func, 6, TRUE, FALSE);
|
||||
run_volume_test(orc_func, orig_func, 7, TRUE, TRUE);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
|
@ -402,6 +449,7 @@ int main(int argc, char *argv[]) {
|
|||
tcase_add_test(tc, svolume_arm_test);
|
||||
#endif
|
||||
tcase_add_test(tc, svolume_orc_test);
|
||||
tcase_set_timeout(tc, 120);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
/* Converstion tests */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue