diff options
Diffstat (limited to 'apps/codecs/aiff_enc.c')
-rw-r--r-- | apps/codecs/aiff_enc.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/apps/codecs/aiff_enc.c b/apps/codecs/aiff_enc.c index 7e085d5721..78c25b8711 100644 --- a/apps/codecs/aiff_enc.c +++ b/apps/codecs/aiff_enc.c | |||
@@ -72,6 +72,7 @@ struct aiff_header aiff_header = | |||
72 | /* (*) updated when finalizing file */ | 72 | /* (*) updated when finalizing file */ |
73 | 73 | ||
74 | static int num_channels IBSS_ATTR; | 74 | static int num_channels IBSS_ATTR; |
75 | static int rec_mono_mode IBSS_ATTR; | ||
75 | static uint32_t sample_rate; | 76 | static uint32_t sample_rate; |
76 | static uint32_t enc_size; | 77 | static uint32_t enc_size; |
77 | static int32_t err IBSS_ATTR; | 78 | static int32_t err IBSS_ATTR; |
@@ -226,16 +227,37 @@ static inline void sample_to_mono(uint32_t **src, uint32_t **dst) | |||
226 | { | 227 | { |
227 | int32_t lr1, lr2; | 228 | int32_t lr1, lr2; |
228 | 229 | ||
229 | lr1 = *(*src)++; | 230 | switch(rec_mono_mode) |
230 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | 231 | { |
231 | err = lr1 & 1; | 232 | case 1: |
232 | lr1 >>= 1; | 233 | /* mono = L */ |
233 | 234 | lr1 = *(*src)++; | |
234 | lr2 = *(*src)++; | 235 | lr1 = lr1 >> 16; |
235 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | 236 | lr2 = *(*src)++; |
236 | err = lr2 & 1; | 237 | lr2 = lr2 >> 16; |
237 | lr2 >>= 1; | 238 | break; |
238 | *(*dst)++ = swap_odd_even_le32((lr1 << 16) | (uint16_t)lr2); | 239 | case 2: |
240 | /* mono = R */ | ||
241 | lr1 = *(*src)++; | ||
242 | lr1 = (int16_t)lr1; | ||
243 | lr2 = *(*src)++; | ||
244 | lr2 = (int16_t)lr2; | ||
245 | break; | ||
246 | case 0: | ||
247 | default: | ||
248 | /* mono = (L+R)/2 */ | ||
249 | lr1 = *(*src)++; | ||
250 | lr1 = (int16_t)lr1 + (lr1 >> 16) + err; | ||
251 | err = lr1 & 1; | ||
252 | lr1 >>= 1; | ||
253 | |||
254 | lr2 = *(*src)++; | ||
255 | lr2 = (int16_t)lr2 + (lr2 >> 16) + err; | ||
256 | err = lr2 & 1; | ||
257 | lr2 >>= 1; | ||
258 | break; | ||
259 | } | ||
260 | *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); | ||
239 | } /* sample_to_mono */ | 261 | } /* sample_to_mono */ |
240 | 262 | ||
241 | STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; | 263 | STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; |
@@ -316,6 +338,7 @@ static bool init_encoder(void) | |||
316 | 338 | ||
317 | sample_rate = inputs.sample_rate; | 339 | sample_rate = inputs.sample_rate; |
318 | num_channels = inputs.num_channels; | 340 | num_channels = inputs.num_channels; |
341 | rec_mono_mode = inputs.rec_mono_mode; | ||
319 | err = 0; | 342 | err = 0; |
320 | 343 | ||
321 | /* configure the buffer system */ | 344 | /* configure the buffer system */ |