X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/66d2f15f9080b0230fa52ad28ca2b7e3ee196571..a9d38b50e8cf4d841fe7beebe20c5d1d8bf7f777:/src/pulsecore/cpu-arm.c diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c index 9c654a3a..ad09c871 100644 --- a/src/pulsecore/cpu-arm.c +++ b/src/pulsecore/cpu-arm.c @@ -79,17 +79,16 @@ static char *get_cpuinfo(void) { } #endif /* defined (__arm__) && defined (__linux__) */ -pa_bool_t pa_cpu_init_arm(pa_cpu_arm_flag_t *flags) { -#if defined (__arm__) -#if defined (__linux__) +void pa_cpu_get_arm_flags(pa_cpu_arm_flag_t *flags) { +#if defined (__arm__) && defined (__linux__) char *cpuinfo, *line; - int arch; + int arch, part; /* We need to read the CPU flags from /proc/cpuinfo because there is no user * space support to get the CPU features. This only works on linux AFAIK. */ if (!(cpuinfo = get_cpuinfo())) { pa_log("Can't read cpuinfo"); - return FALSE; + return; } *flags = 0; @@ -104,44 +103,69 @@ pa_bool_t pa_cpu_init_arm(pa_cpu_arm_flag_t *flags) { pa_xfree(line); } + /* get the CPU features */ if ((line = get_cpuinfo_line(cpuinfo, "Features"))) { const char *state = NULL; char *current; while ((current = pa_split_spaces(line, &state))) { - if (!strcmp(current, "vfp")) + if (pa_streq(current, "vfp")) *flags |= PA_CPU_ARM_VFP; - else if (!strcmp(current, "edsp")) + else if (pa_streq(current, "edsp")) *flags |= PA_CPU_ARM_EDSP; - else if (!strcmp(current, "neon")) + else if (pa_streq(current, "neon")) *flags |= PA_CPU_ARM_NEON; - else if (!strcmp(current, "vfpv3")) + else if (pa_streq(current, "vfpv3")) *flags |= PA_CPU_ARM_VFPV3; pa_xfree(current); } } + + /* get the CPU part number */ + if ((line = get_cpuinfo_line(cpuinfo, "CPU part"))) { + part = strtoul(line, NULL, 0); + if (part == 0xc08) + *flags |= PA_CPU_ARM_CORTEX_A8; + pa_xfree(line); + } pa_xfree(cpuinfo); - pa_log_info("CPU flags: %s%s%s%s%s%s", + pa_log_info("CPU flags: %s%s%s%s%s%s%s", (*flags & PA_CPU_ARM_V6) ? "V6 " : "", (*flags & PA_CPU_ARM_V7) ? "V7 " : "", (*flags & PA_CPU_ARM_VFP) ? "VFP " : "", (*flags & PA_CPU_ARM_EDSP) ? "EDSP " : "", (*flags & PA_CPU_ARM_NEON) ? "NEON " : "", - (*flags & PA_CPU_ARM_VFPV3) ? "VFPV3 " : ""); + (*flags & PA_CPU_ARM_VFPV3) ? "VFPV3 " : "", + (*flags & PA_CPU_ARM_CORTEX_A8) ? "Cortex-A8 " : ""); +#endif +} + +bool pa_cpu_init_arm(pa_cpu_arm_flag_t *flags) { +#if defined (__arm__) +#if defined (__linux__) + pa_cpu_get_arm_flags(flags); if (*flags & PA_CPU_ARM_V6) pa_volume_func_init_arm(*flags); - return TRUE; +#ifdef HAVE_NEON + if (*flags & PA_CPU_ARM_NEON) { + pa_convert_func_init_neon(*flags); + pa_mix_func_init_neon(*flags); + pa_remap_func_init_neon(*flags); + } +#endif + + return true; #else /* defined (__linux__) */ pa_log("Reading ARM CPU features not yet supported on this OS"); #endif /* defined (__linux__) */ #else /* defined (__arm__) */ - return FALSE; + return false; #endif /* defined (__arm__) */ }