summaryrefslogtreecommitdiff
path: root/firmware/asm/pcm-mixer.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/asm/pcm-mixer.c')
-rw-r--r--firmware/asm/pcm-mixer.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/firmware/asm/pcm-mixer.c b/firmware/asm/pcm-mixer.c
index 369e830427..bedaa4c7cb 100644
--- a/firmware/asm/pcm-mixer.c
+++ b/firmware/asm/pcm-mixer.c
@@ -25,10 +25,9 @@
25 #include "m68k/pcm-mixer.c" 25 #include "m68k/pcm-mixer.c"
26#else 26#else
27 27
28/* generic pcm-mixer.c */
29#include "dsp-util.h" /* for clip_sample_16 */ 28#include "dsp-util.h" /* for clip_sample_16 */
30/* Mix channels' samples and apply gain factors */ 29/* Mix channels' samples and apply gain factors */
31static FORCE_INLINE void mix_samples(uint32_t *out, 30static FORCE_INLINE void mix_samples(uint16_t *out,
32 int16_t *src0, 31 int16_t *src0,
33 int32_t src0_amp, 32 int32_t src0_amp,
34 int16_t *src1, 33 int16_t *src1,
@@ -42,9 +41,10 @@ static FORCE_INLINE void mix_samples(uint32_t *out,
42 { 41 {
43 int32_t l = *src0++ + *src1++; 42 int32_t l = *src0++ + *src1++;
44 int32_t h = *src0++ + *src1++; 43 int32_t h = *src0++ + *src1++;
45 *out++ = (uint16_t)clip_sample_16(l) | (clip_sample_16(h) << 16); 44 *out++ = clip_sample_16(l);
45 *out++ = clip_sample_16(h);
46 } 46 }
47 while ((size -= 4) > 0); 47 while ((size -= 2*sizeof(int16_t)) > 0);
48 } 48 }
49 else if (src0_amp != MIX_AMP_UNITY && src1_amp != MIX_AMP_UNITY) 49 else if (src0_amp != MIX_AMP_UNITY && src1_amp != MIX_AMP_UNITY)
50 { 50 {
@@ -53,9 +53,10 @@ static FORCE_INLINE void mix_samples(uint32_t *out,
53 { 53 {
54 int32_t l = (*src0++ * src0_amp >> 16) + (*src1++ * src1_amp >> 16); 54 int32_t l = (*src0++ * src0_amp >> 16) + (*src1++ * src1_amp >> 16);
55 int32_t h = (*src0++ * src0_amp >> 16) + (*src1++ * src1_amp >> 16); 55 int32_t h = (*src0++ * src0_amp >> 16) + (*src1++ * src1_amp >> 16);
56 *out++ = (uint16_t)clip_sample_16(l) | (clip_sample_16(h) << 16); 56 *out++ = clip_sample_16(l);
57 *out++ = clip_sample_16(h);
57 } 58 }
58 while ((size -= 4) > 0); 59 while ((size -= 2*sizeof(int16_t)) > 0);
59 } 60 }
60 else 61 else
61 { 62 {
@@ -74,9 +75,10 @@ static FORCE_INLINE void mix_samples(uint32_t *out,
74 { 75 {
75 int32_t l = *src0++ + (*src1++ * src1_amp >> 16); 76 int32_t l = *src0++ + (*src1++ * src1_amp >> 16);
76 int32_t h = *src0++ + (*src1++ * src1_amp >> 16); 77 int32_t h = *src0++ + (*src1++ * src1_amp >> 16);
77 *out++ = (uint16_t)clip_sample_16(l) | (clip_sample_16(h) << 16); 78 *out++ = clip_sample_16(l);
79 *out++ = clip_sample_16(h);
78 } 80 }
79 while ((size -= 4) > 0); 81 while ((size -= 2*sizeof(int16_t)) > 0);
80 } 82 }
81} 83}
82 84
@@ -97,12 +99,13 @@ static FORCE_INLINE void write_samples(uint32_t *out,
97 do 99 do
98 { 100 {
99 int32_t l = *src++ * amp >> 16; 101 int32_t l = *src++ * amp >> 16;
100 int32_t h = *src++ * amp & 0xffff0000; 102 int32_t h = *src++ * amp >> 16;
101 *out++ = (uint16_t)l | h; 103 *out++ = l;
104 *out++ = h;
102 } 105 }
103 while ((size -= 4) > 0); 106 while ((size -= 2*sizeof(int16_t)) > 0);
104 } 107 }
105} 108}
106 109
107 110
108#endif 111#endif /* CPU_* */