summaryrefslogtreecommitdiff
path: root/apps/codecs/aiff_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/aiff_enc.c')
-rw-r--r--apps/codecs/aiff_enc.c43
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
74static int num_channels IBSS_ATTR; 74static int num_channels IBSS_ATTR;
75static int rec_mono_mode IBSS_ATTR;
75static uint32_t sample_rate; 76static uint32_t sample_rate;
76static uint32_t enc_size; 77static uint32_t enc_size;
77static int32_t err IBSS_ATTR; 78static 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
241STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; 263STATICIRAM 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 */