@@ -103,11 +103,28 @@ void audiomixer_mixer_reset_buffer(audiomixer_mixer_obj_t *self,
103
103
104
104
__attribute__((always_inline ))
105
105
static inline uint32_t add16signed (uint32_t a , uint32_t b ) {
106
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) // Cortex-M4 w/FPU
106
107
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 / 2 ;
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
107
123
}
108
124
109
125
__attribute__((always_inline ))
110
126
static inline uint32_t mult16signed (uint32_t val , int32_t mul ) {
127
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) // Cortex-M4 w/FPU
111
128
mul <<= 16 ;
112
129
int32_t hi , lo ;
113
130
enum { bits = 16 }; // saturate to 16 bits
@@ -118,18 +135,45 @@ static inline uint32_t mult16signed(uint32_t val, int32_t mul) {
118
135
asm volatile ("ssat %0, %1, %2, asr %3" : "=r" (hi ) : "I" (bits ), "r" (hi ), "I" (shift ));
119
136
asm volatile ("pkhbt %0, %1, %2, lsl #16" : "=r" (val ) : "r" (lo ), "r" (hi )); // pack
120
137
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 )) - 0x8000 ;
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
+ result |= (((uint32_t )intermediate ) + 0x8000 ) << (sizeof (int16_t ) * 8 * i );
150
+ }
151
+ return result ;
152
+ #endif
121
153
}
122
154
123
155
static inline uint32_t tounsigned8 (uint32_t val ) {
156
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) // Cortex-M4 w/FPU
124
157
return __UADD8 (val , 0x80808080 );
158
+ #else
159
+ return val ^ 0x80808080 ;
160
+ #endif
125
161
}
126
162
127
163
static inline uint32_t tounsigned16 (uint32_t val ) {
164
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) // Cortex-M4 w/FPU
128
165
return __UADD16 (val , 0x80008000 );
166
+ #else
167
+ return val ^ 0x80008000 ;
168
+ #endif
129
169
}
130
170
131
171
static inline uint32_t tosigned16 (uint32_t val ) {
172
+ #if (defined(__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1 )) // Cortex-M4 w/FPU
132
173
return __UADD16 (val , 0x80008000 );
174
+ #else
175
+ return val ^ 0x80008000 ;
176
+ #endif
133
177
}
134
178
135
179
static inline uint32_t unpack8 (uint16_t val ) {
0 commit comments