summaryrefslogtreecommitdiff
path: root/apps/codecs/wav_enc.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/wav_enc.c')
-rw-r--r--apps/codecs/wav_enc.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/apps/codecs/wav_enc.c b/apps/codecs/wav_enc.c
index a59eff7581..3627808271 100644
--- a/apps/codecs/wav_enc.c
+++ b/apps/codecs/wav_enc.c
@@ -60,6 +60,7 @@ struct riff_header
60#define PCM_CHUNK_SIZE (PCM_SAMP_PER_CHUNK*4) 60#define PCM_CHUNK_SIZE (PCM_SAMP_PER_CHUNK*4)
61 61
62static int num_channels IBSS_ATTR; 62static int num_channels IBSS_ATTR;
63static int rec_mono_mode IBSS_ATTR;
63static uint32_t sample_rate; 64static uint32_t sample_rate;
64static uint32_t enc_size; 65static uint32_t enc_size;
65static int32_t err IBSS_ATTR; 66static int32_t err IBSS_ATTR;
@@ -215,15 +216,36 @@ static inline void sample_to_mono(uint32_t **src, uint32_t **dst)
215{ 216{
216 int32_t lr1, lr2; 217 int32_t lr1, lr2;
217 218
218 lr1 = *(*src)++; 219 switch(rec_mono_mode)
219 lr1 = (int16_t)lr1 + (lr1 >> 16) + err; 220 {
220 err = lr1 & 1; 221 case 1:
221 lr1 >>= 1; 222 /* mono = L */
222 223 lr1 = *(*src)++;
223 lr2 = *(*src)++; 224 lr1 = lr1 >> 16;
224 lr2 = (int16_t)lr2 + (lr2 >> 16) + err; 225 lr2 = *(*src)++;
225 err = lr2 & 1; 226 lr2 = lr2 >> 16;
226 lr2 >>= 1; 227 break;
228 case 2:
229 /* mono = R */
230 lr1 = *(*src)++;
231 lr1 = (uint16_t)lr1;
232 lr2 = *(*src)++;
233 lr2 = (uint16_t)lr2;
234 break;
235 case 0:
236 default:
237 /* mono = (L+R)/2 */
238 lr1 = *(*src)++;
239 lr1 = (int16_t)lr1 + (lr1 >> 16) + err;
240 err = lr1 & 1;
241 lr1 >>= 1;
242
243 lr2 = *(*src)++;
244 lr2 = (int16_t)lr2 + (lr2 >> 16) + err;
245 err = lr2 & 1;
246 lr2 >>= 1;
247 break;
248 }
227 *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2); 249 *(*dst)++ = swap_odd_even_be32((lr1 << 16) | (uint16_t)lr2);
228} /* sample_to_mono */ 250} /* sample_to_mono */
229 251
@@ -305,6 +327,7 @@ static bool init_encoder(void)
305 327
306 sample_rate = inputs.sample_rate; 328 sample_rate = inputs.sample_rate;
307 num_channels = inputs.num_channels; 329 num_channels = inputs.num_channels;
330 rec_mono_mode = inputs.rec_mono_mode;
308 err = 0; 331 err = 0;
309 332
310 /* configure the buffer system */ 333 /* configure the buffer system */