summaryrefslogtreecommitdiff
path: root/src/pulsecore/remap_sse.c
diff options
context:
space:
mode:
authorPeter Meerwald <p.meerwald@bct-electronic.com>2014-04-16 11:58:11 +0200
committerPeter Meerwald <pmeerw@pmeerw.net>2014-04-29 00:00:06 +0200
commitc0e0e7ea8c836a0c2695d658ca2abbb166101bb3 (patch)
tree464de4a1d23354a9ec433ca9638f076efba177fa /src/pulsecore/remap_sse.c
parent9362bdc8a1d5bd1ce213c517e1999644728193a2 (diff)
downloadpulseaudio-c0e0e7ea8c836a0c2695d658ca2abbb166101bb3.tar.gz
remap: Split remapping functions into s16 and float implementation
The sample format is known when the remap structure is initialized, no runtime decision needed. Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Diffstat (limited to 'src/pulsecore/remap_sse.c')
-rw-r--r--src/pulsecore/remap_sse.c55
1 files changed, 29 insertions, 26 deletions
diff --git a/src/pulsecore/remap_sse.c b/src/pulsecore/remap_sse.c
index be6d3b09f..3d2833028 100644
--- a/src/pulsecore/remap_sse.c
+++ b/src/pulsecore/remap_sse.c
@@ -101,33 +101,26 @@
"4: \n\t"
#if defined (__i386__) || defined (__amd64__)
-static void remap_mono_to_stereo_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
+static void remap_mono_to_stereo_s16ne_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
pa_reg_x86 temp, temp2;
- switch (m->format) {
- case PA_SAMPLE_FLOAT32NE:
- {
- __asm__ __volatile__ (
- MONO_TO_STEREO(dq, 4, 15) /* do doubles to quads */
- : "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
- : "r" ((pa_reg_x86)n)
- : "cc"
- );
- break;
- }
- case PA_SAMPLE_S16NE:
- {
- __asm__ __volatile__ (
- MONO_TO_STEREO(wd, 5, 31) /* do words to doubles */
- : "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
- : "r" ((pa_reg_x86)n)
- : "cc"
- );
- break;
- }
- default:
- pa_assert_not_reached();
- }
+ __asm__ __volatile__ (
+ MONO_TO_STEREO(wd, 5, 31) /* do words to doubles */
+ : "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
+ : "r" ((pa_reg_x86)n)
+ : "cc"
+ );
+}
+
+static void remap_mono_to_stereo_float32ne_sse2(pa_remap_t *m, void *dst, const void *src, unsigned n) {
+ pa_reg_x86 temp, temp2;
+
+ __asm__ __volatile__ (
+ MONO_TO_STEREO(dq, 4, 15) /* do doubles to quads */
+ : "+r" (dst), "+r" (src), "=&r" (temp), "=&r" (temp2)
+ : "r" ((pa_reg_x86)n)
+ : "cc"
+ );
}
/* set the function that will execute the remapping based on the matrices */
@@ -140,8 +133,18 @@ static void init_remap_sse2(pa_remap_t *m) {
/* find some common channel remappings, fall back to full matrix operation. */
if (n_ic == 1 && n_oc == 2 &&
m->map_table_i[0][0] == 0x10000 && m->map_table_i[1][0] == 0x10000) {
- m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_sse2;
+
pa_log_info("Using SSE2 mono to stereo remapping");
+ switch (m->format) {
+ case PA_SAMPLE_S16NE:
+ m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_s16ne_sse2;
+ break;
+ case PA_SAMPLE_FLOAT32NE:
+ m->do_remap = (pa_do_remap_func_t) remap_mono_to_stereo_float32ne_sse2;
+ break;
+ default:
+ pa_assert_not_reached();
+ }
}
}
#endif /* defined (__i386__) || defined (__amd64__) */