Skip to content

Commit 3978b50

Browse files
authored
Merge pull request #4489 from gamblor21/audiomixer_rp2040
Add non M4 audiomixer support
2 parents 103deb2 + cd8deb0 commit 3978b50

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

ports/raspberrypi/mpconfigport.mk

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ CIRCUITPY_AUDIOBUSIO ?= 1
4343
CIRCUITPY_AUDIOCORE ?= 1
4444
CIRCUITPY_AUDIOPWMIO ?= 1
4545

46-
# These libraries require Cortex M4+ for fancy math instructions.
47-
CIRCUITPY_AUDIOMIXER ?= 0
46+
CIRCUITPY_AUDIOMIXER = 1
4847

4948
INTERNAL_LIBM = 1
5049

shared-module/audiomixer/Mixer.c

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,28 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t *self,
103103

104104
__attribute__((always_inline))
105105
static inline uint32_t add16signed(uint32_t a, uint32_t b) {
106+
#if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))
106107
return __QADD16(a, b);
108+
#else
109+
uint32_t result = 0;
110+
for (int8_t i = 0; i < 2; i++) {
111+
int16_t ai = a >> (sizeof(int16_t) * 8 * i);
112+
int16_t bi = b >> (sizeof(int16_t) * 8 * i);
113+
int32_t intermediate = (int32_t)ai + bi;
114+
if (intermediate > SHRT_MAX) {
115+
intermediate = SHRT_MAX;
116+
} else if (intermediate < SHRT_MIN) {
117+
intermediate = SHRT_MIN;
118+
}
119+
result |= (((uint32_t)intermediate) & 0xffff) << (sizeof(int16_t) * 8 * i);
120+
}
121+
return result;
122+
#endif
107123
}
108124

109125
__attribute__((always_inline))
110126
static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
127+
#if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))
111128
mul <<= 16;
112129
int32_t hi, lo;
113130
enum { bits = 16 }; // saturate to 16 bits
@@ -118,18 +135,46 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
118135
asm volatile ("ssat %0, %1, %2, asr %3" : "=r" (hi) : "I" (bits), "r" (hi), "I" (shift));
119136
asm volatile ("pkhbt %0, %1, %2, lsl #16" : "=r" (val) : "r" (lo), "r" (hi)); // pack
120137
return val;
138+
#else
139+
uint32_t result = 0;
140+
float mod_mul = (float)mul / (float)((1 << 15) - 1);
141+
for (int8_t i = 0; i < 2; i++) {
142+
int16_t ai = (val >> (sizeof(uint16_t) * 8 * i));
143+
int32_t intermediate = ai * mod_mul;
144+
if (intermediate > SHRT_MAX) {
145+
intermediate = SHRT_MAX;
146+
} else if (intermediate < SHRT_MIN) {
147+
intermediate = SHRT_MIN;
148+
}
149+
intermediate &= 0x0000FFFF;
150+
result |= (((uint32_t)intermediate)) << (sizeof(int16_t) * 8 * i);
151+
}
152+
return result;
153+
#endif
121154
}
122155

123156
static inline uint32_t tounsigned8(uint32_t val) {
157+
#if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))
124158
return __UADD8(val, 0x80808080);
159+
#else
160+
return val ^ 0x80808080;
161+
#endif
125162
}
126163

127164
static inline uint32_t tounsigned16(uint32_t val) {
165+
#if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))
128166
return __UADD16(val, 0x80008000);
167+
#else
168+
return val ^ 0x80008000;
169+
#endif
129170
}
130171

131172
static inline uint32_t tosigned16(uint32_t val) {
173+
#if (defined(__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))
132174
return __UADD16(val, 0x80008000);
175+
#else
176+
return val ^ 0x80008000;
177+
#endif
133178
}
134179

135180
static inline uint32_t unpack8(uint16_t val) {

0 commit comments

Comments
 (0)