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 7e085d5..78c25b8 100644 --- a/apps/codecs/aiff_enc.c +++ b/apps/codecs/aiff_enc.c @@ -72,6 +72,7 @@ struct aiff_header aiff_header = /* (*) updated when finalizing file */ static int num_channels IBSS_ATTR; +static int rec_mono_mode IBSS_ATTR; static uint32_t sample_rate; static uint32_t enc_size; static int32_t err IBSS_ATTR; @@ -226,16 +227,37 @@ static inline void sample_to_mono(uint32_t **src, uint32_t **dst) { int32_t lr1, lr2; - lr1 = *(*src)++; - lr1 = (int16_t)lr1 + (lr1 >> 16) + err; - err = lr1 & 1; - lr1 >>= 1; - - lr2 = *(*src)++; - lr2 = (int16_t)lr2 + (lr2 >> 16) + err; - err = lr2 & 1; - lr2 >>= 1; - *(*dst)++ = swap_odd_even_le32((lr1 << 16) | (uint16_t)lr2); + switch(rec_mono_mode) + { + case 1: + /* mono = L */ + lr1 = *(*src)++; + lr1 = lr1 >> 16; + lr2 = *(*src)++; + lr2 = lr2 >> 16; + break; + case 2: + /* mono = R */ + lr1 = *(*src)++; + lr1 = (int16_t)lr1; + lr2 = *(*src)++; + lr2 = (int16_t)lr2; + break; + case 0: + default: + /* mono = (L+R)/2 */ + lr1 = *(*src)++; + lr1 = (int16_t)lr1 + (lr1 >> 16) + err; + err = lr1 & 1; + lr1 >>= 1; + + lr2 = *(*src)++; + lr2 = (int16_t)lr2 + (lr2 >> 16) + err; + err = lr2 & 1; + lr2 >>= 1; + break; + } + *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); } /* sample_to_mono */ STATICIRAM void chunk_to_aiff_format(uint32_t *src, uint32_t *dst) ICODE_ATTR; @@ -316,6 +338,7 @@ static bool init_encoder(void) sample_rate = inputs.sample_rate; num_channels = inputs.num_channels; + rec_mono_mode = inputs.rec_mono_mode; err = 0; /* configure the buffer system */ |